IsNTAdmin



  • Hallo,

    ich habe ein Problem mit der Funktion IsNTAdmin(...). In welchen Hedaer ist die
    zu finden und welche lib brauche ich. Die Funktion ist in Delphi und VB erklärt,
    aber auch leider nur die dll´s aus denem man das Teil aufruft. Ich möchte die Funktion nicht unbedingt mit API LoadLibray holen...

    hat jemand ne idee........?

    Danke->*

    Gruß Ken



  • /* BOOL IsAdmin(void)
    
          returns TRUE if user is an admin
                  FALSE if user is not an admin
       */
    
       BOOL IsAdmin(void)
       {
          HANDLE hAccessToken;
          UCHAR InfoBuffer[1024];
          PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
          DWORD dwInfoBufferSize;
          PSID psidAdministrators;
          SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
          UINT x;
          BOOL bSuccess;
    
          if(!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE,
             &hAccessToken )) {
             if(GetLastError() != ERROR_NO_TOKEN)
                return FALSE;
             //
             // retry against process token if no thread token exists
             //
             if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY,
                &hAccessToken))
                return FALSE;
          }
    
          bSuccess = GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer,
             1024, &dwInfoBufferSize);
    
          CloseHandle(hAccessToken);
    
          if(!bSuccess )
             return FALSE;
    
          if(!AllocateAndInitializeSid(&siaNtAuthority, 2,
             SECURITY_BUILTIN_DOMAIN_RID,
             DOMAIN_ALIAS_RID_ADMINS,
             0, 0, 0, 0, 0, 0,
             &psidAdministrators))
             return FALSE;
    
       // assume that we don't find the admin SID.
          bSuccess = FALSE;
    
          for(x=0;x<ptgGroups->GroupCount;x++)
          {
             if( EqualSid(psidAdministrators, ptgGroups->Groups[x].Sid) )
             {
                bSuccess = TRUE;
                break;
             }
    
          }
          FreeSid(psidAdministrators);
          return bSuccess;
       }
    

    Da!

    Dann brauchste keinen Header....



  • Cool, sowas habe ich auch schon gesucht. Ich habe bisher dazu nur eine zwar wesentlich kürzere, aber zu NT 4 inkompatible Variante gefunden. Ist deine Funktion zu allen NT Versionen (NT, 2K, XP) kompatibel?



  • Ist deine Funktion zu allen NT Versionen (NT, 2K, XP) kompatibel?

    Das funktioniert auf allen NTs. Allerdings nur, wenn Du gerade am Impersonaten bist (OpenThreadToken schlägt sonst fehl).
    [edit] Die 'offizielle Version' verwendet deswegen auch OpenProcessToken. [/edit]

    Noch ein Link zum Thema, dort findest Du (unter Security) noch eine wesentlich kürzere Variante:
    http://mvps.org/win32/index.html

    [ Dieser Beitrag wurde am 23.03.2003 um 14:36 Uhr von -King- editiert. ]



  • This Version is not working on Windows 7 for me.

    Problem 1: Buffer size is to short -> Easy to fix

    Further you must check if the group is enabled:

    ptgGroups->Groups[x].Attributes & SE_GROUP_ENABLED
    

    Now my full working version

    bool IsAdministrator()
        {
          HANDLE hAccessToken;
          UCHAR InfoBuffer[4096];
          PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
          DWORD dwInfoBufferSize;
          PSID psidAdministrators;
          SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
          UINT x;
          BOOL bSuccess;
    
          if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hAccessToken ))
          {
            if(GetLastError() != ERROR_NO_TOKEN)
              return false;
            //
            // retry against process token if no thread token exists
            //
            if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hAccessToken))
              return false;
          }
    
          bSuccess = GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer, sizeof(InfoBuffer), &dwInfoBufferSize);
    
          CloseHandle(hAccessToken);
    
          if(!bSuccess )
            return false;
    
          if (!AllocateAndInitializeSid(&siaNtAuthority, 2,
            SECURITY_BUILTIN_DOMAIN_RID,
            DOMAIN_ALIAS_RID_ADMINS,
            0, 0, 0, 0, 0, 0,
            &psidAdministrators))
            return false;
    
          // assume that we don't find the admin SID.
          bSuccess = FALSE;
    
          for(x=0;x<ptgGroups->GroupCount;x++)
          {
            if( EqualSid(psidAdministrators, ptgGroups->Groups[x].Sid) )
            {
              if (ptgGroups->Groups[x].Attributes & SE_GROUP_ENABLED)
              {
                bSuccess = TRUE;
                break;
              }
            }
    
          }
          FreeSid(psidAdministrators);
          return bSuccess == TRUE;
        }
    

  • Mod

    Warum diese Nekromantie?

    Ist das in der MSDN ausreichend beschreiben!
    https://support.microsoft.com/kb/118626/en

    Weiterhin stellt sich heute eher die Frage ob mein Task elevated läuft. Die Frage nach dem Admin ist oft sekundär... (sicher beide hängen oft genug zusammen)


Anmelden zum Antworten