Най-добрият начин да разберете дали даден потребител има административни привилегии от VBScript

Трябва да проверя дали потребителят, изпълняващ скрипта, има администраторски права на машината.

Посочих потребителя, който изпълнява скрипта, защото скриптът може да бъде изпълнен с потребител, различен от влезлия, използвайки нещо подобно на "Runas".

@Javier: И двете решения работят на компютър с инсталирана английска версия на Windows, но не и ако инсталираната е на различен език. Това е така, защото групата администратори не съществува, името е различно, например на испански. Трябва ми решението да работи във всички конфигурации.


person Javier De Pedro    schedule 19.11.2008    source източник


Отговори (9)


Можете да използвате скрипт, ако искате да видите дали влезлият потребител е администратор

Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strUser = objNetwork.UserName

isAdministrator = false

Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser in objGroup.Members
    If objUser.Name = strUser Then
        isAdministrator = true        
    End If
Next

If isAdministrator Then
    Wscript.Echo strUser & " is a local administrator."
Else
    Wscript.Echo strUser & " is not a local administrator."
End If

Страхувам се, че не съм сигурен как да се справя, когато скриптът се изпълнява с "Runas".

person Tim C    schedule 19.11.2008
comment
Здравей Тим С, благодаря. Проверих го и изглежда, че работи добре и в моя случай. Потребителското име, което получавам, не е регистрираното, а това, което скриптът се изпълнява. Само един коментар. Това е малко бавно. Извиквам този скрипт от стартирането на HTML страница и отнема около 2/3 секунди. - person Javier De Pedro; 19.11.2008
comment
Това не работи, ако потребителят не е директно в групата на администраторите, а чрез членство в група. - person Heinzi; 21.10.2009

Правейки това, прекъсвате сценарии, при които потребителят има необходимите права за вашия скрипт, но не принадлежи към администраторите. Вместо да проверявате за членство в група, проверете за конкретните способности, от които се нуждаете.

person Jay Bazuzi    schedule 19.11.2008
comment
Съгласен съм, че би било по-добър начин да го внедрите, но е изискване потребителят да има администраторски права за инсталиране на софтуера, така че според мен проверката ще бъде по-лесна. - person Javier De Pedro; 19.11.2008

Знам, че тази тема е много стара и е маркирана като отговорена, но отговорът всъщност не дава това, за което OP попита.

За всеки друг, който търси и намира тази страница, ето алтернатива, която отчита въз основа на права, а не на членство в група, така че Runas Administrator показва администраторските права като True.

Option Explicit 

msgbox isAdmin(), vbOkonly, "Am I an admin?"

Private Function IsAdmin()
    On Error Resume Next
    CreateObject("WScript.Shell").RegRead("HKEY_USERS\S-1-5-19\Environment\TEMP")
    if Err.number = 0 Then 
        IsAdmin = True
    else
        IsAdmin = False
    end if
    Err.Clear
    On Error goto 0
End Function
person RLH    schedule 12.07.2017
comment
Това успя да открие кога съм отворил MS Access като администратор или не. Тествано на Windows 10 64-bit с Office 2016 32-bit. - person Ben; 08.04.2020

Какво ще кажете за проверка за "\\име на компютър\Admin$\system32"?

function IsLoggedInAsAdmin()
    isAdmin = false
    set shell = CreateObject("WScript.Shell")
    computername = WshShell.ExpandEnvironmentStrings("%computername%")
    strAdmin = "\\" & computername & "\Admin$\System32"

    isAdmin = false

    set fso = CreateObject("Scripting.FileSystemObject")

    if fso.FolderExists(strAdmin) then
        isAdmin = true
    end if

    IsLoggedInAsAdmin = isAdmin
end function
person JohnZaj    schedule 03.12.2011

Опитах решението на Tim C на кутия с Windows 7 в моята фирмена мрежа, където всъщност имам администраторски права. Но показва, че моят потребител няма администраторски права.

Вместо това използвах по-хакерски метод, тъй като извикването на „defrag“ в cmd подканата изисква администраторски достъп. Въпреки че работи, внимавайте, че XP и 7 (и евентуално бъдещи версии на Windows) се различават в кода за връщане. Може да има по-последователен избор от дефрагментирането, но засега работи.

Function isAdmin
    Dim shell
    set shell = CreateObject("WScript.Shell")
    isAdmin = false
    errlvl = shell.Run("%comspec% /c defrag /?>nul 2>nul", 0, True)
    if errlvl = 0 OR errlvl = 2 Then '0 on Win 7, 2 on XP
        isAdmin = true
    End If
End Function
person Dss    schedule 20.10.2011

Тази статия има хубава част от кода за това как да изброите членовете на група (копирано тук за удобство и редактирано, за да не се използва имейл адрес):

Function RetrieveUsers(domainName,grpName)

dim GrpObj
dim mbrlist
dim mbr

'-------------------------------------------------------------------------------
' *** Enumerate Group Members ***
'-------------------------------------------------------------------------------

' Build the ADSI query and retrieve the group object
Set GrpObj = GetObject("WinNT://" & domainName & "/" & grpName & ",group")

' Loop through the group membership and build a string containing the names
for each mbr in GrpObj.Members
   mbrlist = mbrlist & vbTab & mbr.name & vbCrLf
Next

RetrieveUsers=mbrlist

End Function

След това можете да напишете функция, за да видите дали даден потребител е в списъка...

Function IsAdmin(user)
    IsAdmin = InStr(RetrieveUsers("MachineName", "Administrators"), user) > 0
End Function

...и го наречете така:

If IsAdmin("LocalAccount") Then
    Wscript.Echo "LocalAccount is an admin"
Else
    Wscript.Echo "LocalAccount is not an admin"
End If
person Patrick Cuff    schedule 19.11.2008

Още един бърз и мръсен метод. Връща ‹> 0 Ако IsNotAdmin

Function IsNotAdmin()
    With CreateObject("Wscript.Shell")
        IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
    End With
End Function
person spudw    schedule 15.05.2013
comment
Когато вече работя като администратор, това ме подканва за повишаване на програмата UAC и връща 0, ако избера Да. Когато работи под нормалния ми акаунт, той връща 1, но няма UAC подкана. Не съм фен на този метод. - person Ben; 08.04.2020

Потребителят може да не е в групата на локалния администратор. Например – администратори на домейни. UAC обикновено блокира администраторския достъп до регистъра, споделянията и т.н. дори за администратори (само ръчното „изпълнение като администратор“ става правилно)...

Ето моят луд начин:

Set Shell = CreateObject("WScript.Shell")
set fso = CreateObject("Scripting.FileSystemObject")
strCheckFolder = Shell.ExpandEnvironmentStrings("%USERPROFILE%") 
strCheckFolder = strCheckFolder+"\TempFolder"

if fso.FolderExists(strCheckFolder) then
        fso.DeleteFolder(strCheckFolder)
end if

fso.CreateFolder(strCheckFolder)
tempstr = "cmd.exe /u /c chcp 65001 | whoami /all >" & strCheckFolder & "\rights.txt"
Shell.run tempstr

tempstr = strCheckFolder & "\rights.txt"
WScript.Sleep 200
Set txtFile = FSO.OpenTextFile(tempstr,1)

IsAdmin = False

Do While Not txtFile.AtEndOfStream
  x=txtFile.Readline
  If InStr(x, "S-1-5-32-544") Then
      IsAdmin = True
  End If
Loop

txtFile.Close
person OlegSu    schedule 06.12.2018

Използването на "localhost" вместо истинското име на хост увеличава времето за изпълнение на скрипта около 10 пъти!
Последният ми код е:

' get_admin_status.vbs
Option Explicit

Dim oGroup:   Set oGroup   = GetObject("WinNT://localhost/Administrators,group")
Dim oNetwork: Set oNetwork = CreateObject("Wscript.Network")

Dim sSearchPattern: sSearchPattern = "WinNT://" & oNetwork.UserDomain & "/" & oNetwork.UserName

Dim sMember
For Each sMember In oGroup.Members
  If sMember.adsPath = sSearchPattern Then
    ' Found...
    Call WScript.Quit(0)
  End If
Next

' Not found...
Call WScript.Quit(1)

Този скрипт връща изходен код 0, ако текущият потребител е локален администратор.
Използване: cscript.exe get_admin_status.vbs

person Stefan Bohlein    schedule 29.07.2016