Лучший способ узнать, есть ли у пользователя административные привилегии из VBScript

StackOverflow https://stackoverflow.com/questions/301860

  •  08-07-2019
  •  | 
  •  

Вопрос

Мне нужно проверить, имеет ли пользователь, выполняющий сценарий, административные привилегии на компьютере.

Я указал пользователя, выполняющего сценарий, потому что сценарий мог быть выполнен с пользователем, не вошедшим в систему, используя что-то похожее на " Runas ".

@Javier: оба решения работают на ПК с установленной англоязычной версией Windows, но не с установленной на другом языке. Это связано с тем, что группа «Администраторы» не существует, например, имя на испанском отличается. Мне нужно решение для работы во всех конфигурациях.

Это было полезно?

Решение

Вы можете использовать скрипт, если хотите узнать, является ли зарегистрированный пользователь администратором

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 " Я боюсь.

Другие советы

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

Как насчет проверки на " \\ имя_компьютера \ 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

Я пробовал решение Тима С на компьютере под управлением 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

Я знаю, что эта ветка очень старая и помечена как отвеченная, но в действительности ответ не дает того, о чем спрашивал ОП.

Для всех, кто ищет и находит эту страницу, есть альтернатива, которая создает отчеты на основе прав, а не членства в группах, поэтому администратор Runas отображает права администратора как 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

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

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

Еще один быстрый и грязный метод. Возвращает & Lt; & Gt; 0 Если IsNotAdmin

Function IsNotAdmin()
    With CreateObject("Wscript.Shell")
        IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
    End With
End Function

Возможно, пользователь не входит в группу локальных администраторов. Например - администраторы домена. UAC обычно блокирует доступ администратора к реестру, разделяет e.t.c. даже для администраторов (только руководство " запуск от имени администратора " становится правым) ...

Вот мой сумасшедший путь:

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
Function isAdmin
    Dim shell
    Set shell = CreateObject("WScript.Shell")
    isAdmin = false
    errorLevel = shell.Run("%comspec% /c net session >nul 2>&1", 0, True)
    if errorLevel = 0
        isAdmin = true
    End If
End Function

Использование " 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top