Pregunta

Estoy tratando de descubrir cómo detectar si un usuario está ejecutando con derechos de administrador en Windows XP.Esto es bastante fácil de hacer en Vista/Win7 gracias a la quién soy dominio.Aquí hay un fragmento en Ruby sobre cómo hacerlo en Vista:

Tenga en cuenta que 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, por lo que el método vinculado anteriormente siempre devolverá falso en WinXP, incluso si lo ejecutamos como administrador.

Entonces, ¿alguien conoce alguna forma de detectar si estamos ejecutando como administrador en Windows XP usando Ruby, herramientas de línea de comandos, archivos por lotes o incluso herramientas de terceros (en realidad, deben ser de código abierto)?

¿Fue útil?

Solución

Esto detectará si el usuario está ejecutando en modo elevado (por ejemplo, un símbolo del sistema que era "Ejecutar como" Administrador). 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.
Funciona desde XP hasta ...

Otros consejos

Si tu corres

>net localgroup administrators 

en un shell de comandos debería obtener la lista de cuentas de administrador en Windows XP.Simplemente analice y escanee la salida para verificar la cuenta de usuario particular que desea.Por ej.para verificar si el usuario actual es un administrador, puede hacer:

>net localgroup administrators | find "%USERNAME%"

opción Piskvor su fina o del check esta url http: // weseetips. com / 2008/04/16 / cómo-a-check-si-corriente-user-tener-administrador-privilegio /

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;

Consulte el CheckTokenMembership método. No es una muestra de que hay IsUserAdmin () aplicación más algún otro retroalimentación de la comunidad de utilidad en cuando esa función no devuelve lo que se espera y lo que hay que hacer para mejorarlo.

Esto averiguar 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 Pedro, pero con menos gastos.

Esta es la (PowerShell) mejor manera 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"

=> devuelve True cuando el usuario pertenece al grupo de administradores (en contraposición a la comprobación de usuario es Administrator)

(Nota: tilde o acento grave `escapa el retorno de carro en PowerShell, en Ruby ejecuta los comandos de shell, como 'sistema de s (' 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 esto, se podría haber hecho algo así (en Ruby de nuevo):

require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top