Necesito para comprobar si el usuario que ejecuta el script tiene privilegios administrativos en el equipo.

He especificado el usuario que ejecuta el script porque el guión podría haber sido ejecutado con un usuario que ha iniciado la sesión en el uso de algo similar a «Runas».

@Javier: Tanto las soluciones de trabajo en un PC con una versión en inglés de Windows instalado pero no se si la instaló en diferentes idiomas. Esto es debido a que el grupo de Administradores no existe, el nombre es diferente, por ejemplo, en español. Necesito la solución para que funcione en todas las configuraciones.

10 Comentarios

  1. 3

    Puede utilizar la secuencia de comandos si usted desea saber si el usuario que ha iniciado sesión con derechos de 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 manejar la situación cuando se ejecuta el script con «Runas» tengo miedo.

    • Hola Tim C, gracias. He comprobado que una parece que funciona bien también en mi caso. El nombre de Usuario que tengo es que no se ha iniciado uno pero el que el script que está siendo ejecutado. Sólo un comentario. Es un poco lento. Estoy llamando a esta secuencia de comandos de inicio de una página HTML y se tarda aproximadamente 2/3 segundos.
    • Esto no funciona si el usuario no está directamente en el grupo de Administradores, pero a través de algunos de los miembros del grupo.
  2. 4

    De esta forma romper escenarios donde el usuario tiene el privs por su guión, pero no pertenecen a los Administradores. En lugar de la comprobación de la pertenencia al grupo, de verificación de las habilidades específicas que se requieren.

    • Estoy de acuerdo en que sería una mejor manera de ponerla en práctica, pero es un requisito que el usuario tiene privilegios de administrador para instalar el software en mi opinión, la comprobación de que sería más fácil.
  3. 3

    ¿Qué acerca de 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
  4. 2

    He intentado Tim C de la solución en un Windows 7 en mi red de la empresa donde hago en realidad tiene derechos de administrador. Pero muestra mi usuario no tiene derechos de administrador.

    Vez he utilizado un hackier método, como llamar «defrag» en la consola cmd requiere acceso de administrador. Mientras se trabaja, hay que tener cuidado de que XP y 7 (y posiblemente las futuras versiones de Windows) difieren en el código de retorno. No puede ser más coherente opciones de desfragmentación, pero por ahora funciona.

    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
    • +1 que es una buena idea
  5. 2

    Sé que este hilo es muy antiguo y marcado contestó, pero la respuesta no es en realidad da lo que el OP se le preguntó acerca.

    Para cualquier otra persona de buscar y encontrar esta página, aquí es una alternativa que hace el informe basado en los derechos no pertenencia al grupo, de modo Runas Administrador de la muestra de administración de derechos 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
  6. 1

    Este artículo tiene un buen pedazo de código en cómo enumerar los miembros de un grupo (copiado aquí para la conveniencia y editado para no utilizar 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

    A continuación, 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 lo llaman así:

    If IsAdmin("LocalAccount") Then
        Wscript.Echo "LocalAccount is an admin"
    Else
        Wscript.Echo "LocalAccount is not an admin"
    End If
  7. 1

    Otra rápida n sucio método. Devuelve <> 0 Si IsNotAdmin

    Function IsNotAdmin()
        With CreateObject("Wscript.Shell")
            IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
        End With
    End Function
  8. 1

    Usuario puede no estar en el grupo de administradores locales. Por ejemplo, los administradores de dominio.
    UAC generalmente bloques de administración de acceso al registro, las acciones de e.t.c. incluso para los administradores(onl y manual de «ejecutar como administrador» se pone a la derecha)…

    Aquí está mi camino loco:

    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
  9. 0
    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
  10. 0

    El uso de «localhost» en vez de el verdadero nombre de host aumenta la secuencia de comandos de tiempo de ejecución sobre 10x!
    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

Dejar respuesta

Please enter your comment!
Please enter your name here