Prüfen ob ein Privileg gesetzt ist - wie?
-
Hi,
wie kann ich in meinem Programm prüfen ob ich ein security privilege bereits gesetzt habe?
-
Ist war Delphi, aber die API-Funktionen sind antütlich die gleichen.
function GetCurrentUserPrivileges: TUserPrivilegesArray; const TokenSize = 800; // (SizeOf(Pointer)=4 *200) var hToken: THandle; pTokenInfo: PTOKENPRIVILEGES; ReturnLen: Cardinal; i: Integer; PrivName: PChar; DisplayName: PChar; NameSize: Cardinal; DisplSize: Cardinal; LangId: Cardinal; begin if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin GetMem(pTokenInfo, TokenSize); try if GetTokenInformation(hToken, TokenPrivileges, pTokenInfo, TokenSize, ReturnLen) then begin GetMem(PrivName, 255); GetMem(DisplayName, 255); try setlength(result, pTokenInfo.PrivilegeCount); for i := 0 to pTokenInfo.PrivilegeCount - 1 do begin DisplSize := 255; NameSize := 255; LookupPrivilegeName(nil, pTokenInfo.Privileges[i].Luid, PrivName, Namesize); LookupPrivilegeDisplayName(nil, PrivName, DisplayName, DisplSize, LangId); SetString(result[i].InternalName, PrivName, NameSize); SetString(result[i].Displayname, DisplayName, DisplSize); end; finally FreeMem(PrivName, 255); FreeMem(DisplayName, 255); end; end; finally FreeMem(PTokenInfo, sizeof(PTokenPrivileges)); end; end; end;
-
Also ich habe jetzt mal versucht mir die Privileg-Token zu holen, aber irgendwie klappt das Auslesen mit GetTokenInformation nicht so ganz, auch verstehe ich den Aufbau der TOKEN_PRIVILEGES Struktur nicht wirlich.
Im Header steht dort in der Struktur ein Array der Größe "ANYSIZE", welches einfach ein #define auf 1 ist.
Aber beim Abrufen benötigt GetTokenInformation 64Bytes und speichert mir 5Token in dem Array (da ich mit malloc anfordere ist das kein Problem).
Aber das vorher aktivierte Debug-Privileg fehlt.Hier mal mein code:
int are_debug_privileges_enabled() { HANDLE cur_process = GetCurrentProcess(); HANDLE cur_prc_token; TOKEN_PRIVILEGES *tok_privs = NULL; DWORD needed_bytes = 0; unsigned i; /* loop counter */ if( !OpenProcessToken( cur_process, TOKEN_QUERY, &cur_prc_token ) ) return 0; /* Retrieve the number of bytes needed to store the privileges. */ GetTokenInformation( cur_prc_token, TokenPrivileges, NULL, 0, &needed_bytes ); tok_privs = malloc( needed_bytes ); if( !tok_privs ) { CloseHandle( cur_prc_token ); return 0; } if( !GetTokenInformation( cur_prc_token, TokenPrivileges, tok_privs, needed_bytes, &needed_bytes ) ) { free( tok_privs ); CloseHandle( cur_prc_token ); return 0; } for( i = 0; i < tok_privs->PrivilegeCount; ++i ) { LUID_AND_ATTRIBUTES cur = tok_privs->Privileges[ i ]; TCHAR priv_name[ MAX_PATH ]; DWORD size = sizeof( priv_name ) / sizeof( TCHAR ); if( !LookupPrivilegeName( NULL, &cur.Luid, priv_name, &size ) ) continue; if( !_tcscmp( priv_name, _T( "SeDebugPrivilege" ) ) ) { free( tok_privs ); CloseHandle( cur_prc_token ); return 1; } } free( tok_privs ); CloseHandle( cur_prc_token ); return 0; }Habt ihr irgendwelche Ideen, was da falsch laufen könnte?