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

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

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

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

Ответы [ 10 ]

4 голосов
/ 19 ноября 2008

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

3 голосов
/ 04 декабря 2011

А как насчет проверки "\\ имя_компьютера \ 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
2 голосов
/ 13 июля 2017

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

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

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

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

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

1 голос
/ 06 декабря 2018

Пользователь может не входить в группу локальных администраторов. Например - администраторы домена. 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
1 голос
/ 15 мая 2013

Еще один быстрый и грязный метод. Возвращает <> 0, если IsNotAdmin

Function IsNotAdmin()
    With CreateObject("Wscript.Shell")
        IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
    End With
End Function
1 голос
/ 19 ноября 2008

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

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
0 голосов
/ 29 июля 2016

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

0 голосов
/ 17 октября 2014
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
...