La mejor manera de saber si un usuario tiene privilegios administrativos de un VBScript

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

  •  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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top