Лучший способ узнать, есть ли у пользователя административные привилегии из VBScript
-
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