2009-02-18 9 views
13

Próbuję ustalić, jak wykryć, czy użytkownik jest uruchomiony z prawami administratora w systemie Windows XP. Jest to dość łatwe do zrobienia w Vista/Win7, dzięki komendzie whoami. Oto urywek w Ruby dla jak to zrobić pod Vista:Wykryj, czy działasz z uprawnieniami administratora w systemie Windows XP

pamiętać, że Poniższy link zawiera teraz rozwiązania proponowane przez muteW

http://gist.github.com/65931

Kłopot w tym, whoami nie pochodzi z Windows XP i tak powyższa metoda będzie zawsze zwracać fałsz na WinXP, nawet jeśli pracujemy jako administrator.

Czy ktoś wie, jak wykryć, czy uruchamiamy się jako administrator w systemie Windows XP, używając Ruby, narzędzi wiersza polecenia, plików wsadowych, a nawet stron trzecich (musi być otwarty, naprawdę) narzędzia?

Odpowiedz

32

ten wykryje, czy użytkownik działa w trybie podwyższonym (np. wiersz polecenia, który był "Uruchom jako" Administrator). Polega ona na tym, że wymaga uprawnień administratora, aby odczytać klucz konto LOCAL SERVICE REG

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

to zwróci kod błędu niezerową jeśli nie można go czytać, a jeśli to możliwe zerowej.
Prace z XP do góry ...

+0

I dla każdego, kto używa C++, system() zwraca 1, jeśli powyższe polecenie się nie powiedzie i 0, jeśli się powiedzie; co oznacza, że ​​zwraca 0, jeśli użytkownik ma prawa administratora. Bardzo dobra odpowiedź, Peter. Dzięki! – Griffin

+4

Lub, w C/C++: wywołaj RegOpenKey (HKEY_USERS, "S-1-5-19", & key) i sprawdź, czy odniosłeś sukces. – theller

2

Sprawdź metodę CheckTokenMembership. Jest tam przykładowa implementacja IsUserAdmin() plus inne przydatne informacje zwrotne od społeczności, kiedy ta funkcja nie zwraca tego, co jest oczekiwane i co należy zrobić, aby ją poprawić.

11

Jeśli prowadzisz

>net localgroup administrators 

w powłoce poleceń należy się lista kont administratora w systemie Windows XP. Po prostu przeanalizuj i zeskanuj dane wyjściowe, aby sprawdzić konkretne konto użytkownika. Dla np. aby sprawdzić, czy bieżący użytkownik jest administratorem można zrobić -

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

To tylko potwierdza, że ​​nazwa użytkownika jest w grupie administracyjnej - nie wykrywa, czy bieżąca sesja ma prawa administratora. Na przykład w Win 7 z UAC, wiersz poleceń działa domyślnie jako nie-admin, a powyższe polecenie niepoprawnie zgłosi sesję jako Admin. Zobacz moje rozwiązanie dla czegoś nieco bardziej niezawodny –

7

opcja Piskvor grzywny lub sprawdzić ten link http://weseetips.com/2008/04/16/how-to-check-whether-current-user-have-administrator-privilege/

jest to kod na tej stronie

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

jego wykonane w C przy użyciu API WINDOWS, więc nie musisz niczego innego do uruchomienia tego, po prostu skompiluj go – gonxalo

+0

Należy pamiętać, że to zwróci FALSE, jeśli wywołana z programu Vista działa na koncie administratora jeśli proces nie został uruchomiony z "uruchom jako administrator". –

+0

To jest problem z Vistą. może mógłbyś dodać test różnicy w tym samym programie dla systemu operacyjnego Vista ... – gonxalo

2

To będzie znaleźć bez łuskanie obecnie:

require 'win32/registry' 

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

strategia jest podobna do Piotra, ale przy mniejszym obciążeniu.

1

Oto lepsza (PowerShell) sposób to zrobić: https://stackoverflow.com/a/16617861/863980

w jednej linii, można powiedzieć (kopiuj/wklej w szykowny i będzie działać):

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

=> powroty True kiedy użytkownik należący do grupy Administratorzy (w przeciwieństwie do sprawdzania użytkownik jest administratorem)

(uwaga: lewy apostrof lub grób akcent `ucieka powrotu karetki w PowerShell, w Ruby on wykonuje poleceń powłoki, jak C++„s system (”polecenie „) ..)

Więc w Ruby, można powiedzieć (kopiuj/wklej w 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 

nie znają (nawet lepiej) WMI sposób to zrobić chociaż. Dzięki temu mogłeś zrobić coś takiego (w Ruby ponownie):

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