Domanda

Sto cercando di capire come rilevare se un utente è in esecuzione con diritti di amministratore in Windows XP. Questo è abbastanza facile da fare in Vista / Win7 grazie al whoami il comando . Ecco un frammento in Ruby per come farlo sotto Vista:

Nota, il seguente link ora incorpora la soluzione suggerita da muteW

http://gist.github.com/65931

Il problema è che, whoami non viene fornito con Windows XP e quindi il metodo di cui sopra collegato restituirà sempre falso su WinXP, anche se stiamo correndo come amministratore.

Così, qualcuno sa di un modo per rilevare se stiamo correndo come amministratore in Windows XP utilizzando Ruby, strumenti da riga di comando, file batch, o anche di terze parti (deve essere open source, in realtà) strumenti?

È stato utile?

Soluzione

In questo modo rilevare se l'utente è in esecuzione in modalità elevata (ad esempio, un prompt dei comandi che è stato "Esegui come" Administrator). Essa si basa sul fatto che si richiedono privilegi di amministratore di leggere la chiave conto SERVIZIO LOCALE reg:

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

questo restituirà un codice di errore diverso da zero, se non può essere letto, e zero se si può.
Funziona da XP in su ...

Altri suggerimenti

Se si esegue

>net localgroup administrators 

in una shell di comando si dovrebbe ottenere l'elenco dei account amministratore in Windows XP. Basta analizzare e scansionare l'uscita per controllare per il particolare account utente che si desidera. Per esempio per verificare se l'utente corrente è un amministratore che si possa fare -

>net localgroup administrators | find "%USERNAME%"

opzione Piskvor la sua fine, o controllare questo URL http: // weseetips. com / 2008/04/16 / how-to-check-se-current-user-have-amministratore-privilegio /

Questo è il codice in quella pagina

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;

Controlla la CheckTokenMembership metodo. C'è un campione c'è di IsUserAdmin () implementazione più qualche altro utile feedback della comunità su quando quella funzione non restituisce cosa ci si aspetta e cosa fare per migliorarlo.

In questo modo scoprire senza sborsare:

require 'win32/registry'

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

La strategia è simile a Pietro, ma con meno overhead.

Questa è la migliore (PowerShell) modo di farlo: https://stackoverflow.com/a/16617861/863980

In una riga, si può dire (copia / incolla in elegante e funzionerà):

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

=> restituisce True quando l'utente appartiene al gruppo di amministratori (in contrasto con il controllo utente è Administrator)

(Nota: backtick o accento grave `sfugge il ritorno a capo in PowerShell, in Ruby esegue i comandi di shell, come il 'sistema (s' comando ') C ++ ..)

Quindi in Ruby, si può dire (copia / incolla in 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

Non si conosce la (ancora meglio) WMI modo di farlo però. Con questo, che avrebbe potuto fare qualcosa di simile (in Ruby di nuovo):

require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top