2009-02-18 21 views
13

Estoy tratando de averiguar cómo detectar si un usuario se está ejecutando con derechos de administrador en Windows XP. Esto es bastante fácil de hacer en Vista/Win7 gracias al comando whoami. He aquí un fragmento en Ruby de cómo hacerlo en virtud de Vista:Detecta si se está ejecutando con privilegios de administrador en Windows XP

Nota, el siguiente enlace ahora incorpora la solución sugerida por muteW

http://gist.github.com/65931

El problema es que whoami no viene con Windows XP y el método vinculado anteriormente siempre devolverá falso en WinXP, incluso si estamos corriendo como administrador.

Entonces, ¿alguien sabe de una manera de detectar si estamos ejecutando como administrador en Windows XP usando Ruby, herramientas de línea de comandos, archivos por lotes o incluso de terceros (debe ser de código abierto, realmente) ¿herramientas?

Respuesta

32

Este detectará si el usuario se está ejecutando en modo elevado (por ejemplo, un símbolo del sistema que fue Administrador "Ejecutar como"). Se basa en el hecho de que usted requiere privilegios de administrador para leer la clave de la cuenta reg SERVICIO LOCAL:

reg query "HKU\S-1-5-19" 

esto devolverá un código de error distinto de cero si no se puede leer, y cero si se puede.
Obras de XP hasta ...

+0

Y para cualquiera que use C++, system() devuelve 1 si el comando anterior falla y 0 si tiene éxito; lo que significa que devuelve 0 si el usuario tiene derechos de administrador. Muy buena respuesta, Peter. ¡Gracias! – Griffin

+4

O, en C/C++: llame a RegOpenKey (HKEY_USERS, "S-1-5-19", & key) y verifique que sea correcto. – theller

2

Consulte el método CheckTokenMembership. Hay un ejemplo de la implementación de IsUserAdmin() más algunos otros comentarios útiles de la comunidad sobre cuándo esa función no devuelve lo que se espera y qué hacer para mejorarla.

11

Si ejecuta

>net localgroup administrators 

en un intérprete de comandos que debe obtener la lista de cuentas de administrador en Windows XP. Simplemente analice y escanee el resultado para verificar la cuenta de usuario particular que desea. Por ej. para comprobar si el usuario actual es un administrador que podría hacer -

>net localgroup administrators | find "%USERNAME%" 
+2

Esto solo valida que el nombre de usuario está en el grupo de administración - no detecta si la sesión actual tiene derechos de administrador. Por ejemplo, en Win 7 con UAC, un símbolo del sistema se ejecuta de forma predeterminada como no administrador y el comando anterior informará incorrectamente la sesión como administrador. Ver mi solución para algo un poco más confiable –

7

opción Piskvor su fina o del check esta url http://weseetips.com/2008/04/16/how-to-check-whether-current-user-have-administrator-privilege/

este es el código en la página

SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; 
PSID AdministratorsGroup; 
// Initialize SID. 
if(!AllocateAndInitializeSid(&NtAuthority, 
           2, 
           SECURITY_BUILTIN_DOMAIN_RID, 
           DOMAIN_ALIAS_RID_ADMINS, 
           0, 0, 0, 0, 0, 0, 
           &AdministratorsGroup)) 
{ 
    // Initializing SID Failed. 
    return false; 
} 
// Check whether the token is present in admin group. 
BOOL IsInAdminGroup = FALSE; 
if(!CheckTokenMembership(NULL, 
          AdministratorsGroup, 
          &IsInAdminGroup)) 
{ 
    // Error occurred. 
    IsInAdminGroup = FALSE; 
} 
// Free SID and return. 
FreeSid(AdministratorsGroup); 
return IsInAdminGroup; 
+0

está hecho en C usando WINDOWS API, por lo que no necesita nada más para ejecutar esto, solo compílelo – gonxalo

+0

Tenga en cuenta que esto devolverá FALSE si se llama desde un programa Vista que se ejecuta en una cuenta de administrador si el proceso no se inició con 'ejecutar como administrador'. –

+0

eso es un problema de Vista. quizás podría agregar una verificación diferente en el mismo programa para el sistema operativo Vista ... – gonxalo

2

esto encontrará a cabo sin bombardeos a cabo:

require 'win32/registry' 

is_admin = false 
begin 
    Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| } 
    is_admin = true 
rescue 
end 

La estrategia es similar a la de Pedro, pero con menos sobrecarga.

1

Aquí es la mejor manera (PowerShell) de hacerlo: https://stackoverflow.com/a/16617861/863980

En una línea, se puede decir (copiar/pegar en el elegante y funcionará):

(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | ` 
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator" 

=> retornos True cuando el usuario pertenece al grupo Administradores (en oposición al usuario IS Administrador de comprobación)

(Nota: backtick o grave accent `escapa del retorno de carro en PowerShell, en Ruby ejecuta los comandos del shell, como el sistema de C++ ('comando ') ..)

Así que en Ruby, se puede decir (copiar/pegar en el IRB):

def is_current_user_local_admin? 
    return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True" 
end 

no sabe el (aún mejor) WMI forma de hacerlo sin embargo. Con eso, podría haber hecho algo como (en Ruby nuevamente):

require 'win32ole' 
wmi = WIN32OLE.connect('WinNT://./Administrators,group') 
# don't know what should come here... 
Cuestiones relacionadas