Melhor maneira de saber se um usuário tem privilégios administrativos de um VBScript
-
08-07-2019 - |
Pergunta
Eu preciso verificar se o usuário executar o script tem privilégios administrativos na máquina.
Eu ter especificado o usuário executar o script porque o roteiro poderia ter sido executado com um usuário diferente do registrado em usar algo semelhante a "Runas".
@Javier: Ambas as soluções de trabalho em um PC com uma versão em Inglês do Windows instalada, mas não se instalou está em idioma diferente. Isso ocorre porque o grupo de administradores não existe, o nome é diferente, por exemplo, em espanhol. Eu preciso a solução para o trabalho em todas as configurações.
Solução
Você pode usar o script se você quiser ver se o usuário conectado é um administrador
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
Não estou certo como lidar com isso quando o script é executado com "Runas" eu tenho medo.
Outras dicas
Ao fazer isso você quebrar cenários onde o usuário tem a privs necessários para o seu script, mas não pertence a administradores. Em vez de verificar para adesão ao grupo, para verificar as habilidades específicas que você precisa.
O que sobre a verificação de "\\ computername \ 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
Ive tentou solução de Tim C em uma caixa de Windows 7 no meu rede da empresa onde eu realmente tem direitos de administrador. Mas ele mostra o meu usuário como não ter direitos de administrador.
Em vez disso, usou um método hackier, como a chamada "desfragmentação" no prompt de cmd requer acesso de administrador. Enquanto ele funciona, se desconfiar que XP e 7 (e possivelmente versões futuras do Windows) diferem no código de retorno. Pode haver escolhas mais consistentes do que defrag, mas funciona para agora.
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
Eu sei que esta discussão é muito antiga e marcada respondidas, mas a resposta não está realmente dando o que o OP perguntado sobre.
Para qualquer outra pessoa procurar e encontrar esta página, aqui está uma alternativa que faz relatório com base em direitos não membros do grupo para espectáculos Runas administrador direitos de administrador como 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
Este artigo tem um bom pedaço de código sobre como enumerar os membros de um grupo (copiado aqui por conveniência e editado para não usar o endereço de email):
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
Você pode então escrever uma função para ver se um usuário está na lista ...
Function IsAdmin(user)
IsAdmin = InStr(RetrieveUsers("MachineName", "Administrators"), user) > 0
End Function
... e chamá-lo assim:
If IsAdmin("LocalAccount") Then
Wscript.Echo "LocalAccount is an admin"
Else
Wscript.Echo "LocalAccount is not an admin"
End If
Ainda. Retorna <> 0 Se IsNotAdmin
Function IsNotAdmin()
With CreateObject("Wscript.Shell")
IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
End With
End Function
O usuário pode não ser no grupo de administradores local. Por exemplo - Administradores de Domínio. UAC geralmente bloqueia acesso de administrador para o registro, as ações e.t.c. mesmo para administradores (onl y "Executar como administrador" Manual fica à direita) ...
Aqui é a minha maneira louca:
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
Usando o "localhost" em vez do nome de máquina real aumenta o tempo de execução de script cerca de 10x
Meu código final é:
' 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)
Este código de script retorna saída 0 se o usuário atual é um administrador local.
Uso: get_admin_status.vbs cscript.exe