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?


Anmelden zum Antworten