La mejor manera de saber si un usuario tiene privilegios administrativos de un VBScript
-
08-07-2019 - |
Pregunta
Necesito verificar si el usuario que ejecuta el script tiene privilegios administrativos en la máquina.
He especificado el usuario que ejecuta la secuencia de comandos porque la secuencia de comandos podría haberse ejecutado con un usuario que no sea el que inició sesión con algo similar a " Runas " ;.
@Javier: Ambas soluciones funcionan en una PC con una versión en inglés de Windows instalada, pero no si la instalación está en un idioma diferente. Esto se debe a que el grupo Administradores no existe, el nombre es diferente, por ejemplo, en español. Necesito la solución para trabajar en todas las configuraciones.
Solución
Puede usar la secuencia de comandos si desea ver si el usuario conectado es un 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
No estoy seguro de cómo manejarlo cuando el script se ejecuta con " Runas " Tengo miedo.
Otros consejos
Al hacer esto, se rompen los escenarios en los que el usuario tiene los privilegios necesarios para su script pero no pertenece a los Administradores. En lugar de verificar la membresía del grupo, verifique las habilidades específicas que necesita.
¿Qué pasa con la comprobación 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
He probado la solución de Tim C en un cuadro de Windows 7 en la red de mi empresa, donde realmente tengo derechos de administrador. Pero muestra que mi usuario no tiene derechos de administrador.
En su lugar, utilicé un método más hackier, como llamar a " defrag " en el indicador de cmd requiere acceso de administrador. Mientras funciona, tenga cuidado de que XP y 7 (y posiblemente futuras versiones de Windows) difieran en el código de retorno. Puede haber opciones más consistentes que la desfragmentación, pero funciona por ahora.
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
Sé que este hilo es muy antiguo y está marcado como respuesta, pero la respuesta realmente no está dando lo que el OP preguntó.
Para cualquier otra persona que busque y encuentre esta página, aquí hay una alternativa que informa basándose en los derechos, no en la pertenencia al grupo, por lo que el Administrador de Runas muestra los derechos de administrador como Verdadero.
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 artículo tiene una buena porción de código sobre cómo enumerar los miembros de un grupo (copiado aquí por conveniencia y editado para no usar la dirección de correo electrónico):
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
Luego puede escribir una función para ver si un usuario está en la lista ...
Function IsAdmin(user)
IsAdmin = InStr(RetrieveUsers("MachineName", "Administrators"), user) > 0
End Function
... y llámalo así:
If IsAdmin("LocalAccount") Then
Wscript.Echo "LocalAccount is an admin"
Else
Wscript.Echo "LocalAccount is not an admin"
End If
Sin embargo, otro método rápido y sucio. Devuelve & Lt; & Gt; 0 Si IsNotAdmin
Function IsNotAdmin()
With CreateObject("Wscript.Shell")
IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
End With
End Function
El usuario puede no estar en el grupo de administradores locales. Por ejemplo, administradores de dominio. UAC generalmente bloquea el acceso de administrador al registro, comparte e.t.c. incluso para administradores (solo manual " ejecutar como admin " se hace bien) ...
Aquí está mi manera loca:
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 " localhost " en lugar del nombre de host real, aumenta el tiempo de ejecución del script aproximadamente 10 veces.
Mi código final es:
' 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 script devuelve el código de salida 0 si el usuario actual es un administrador local.
Uso: cscript.exe get_admin_status.vbs