2017-11-07 1 views
0

Von einer nicht privilegierten Anwendung möchte ich eine privilegierte Anwendung ausführen. Aber ich möchte überprüfen, ob der Benutzer ein Administrator ist, bevor Sie die Anwendung starten.Wie ermittelt man, ob ein Benutzer ein Administrator aus einer nicht privilegierten Anwendung mit Win32 ist?

Win32 stellt IsUserAnAdmin() und IsUserAdmin() zur Verfügung, aber beide geben 0 zurück, wenn sie von einem unprivilegierten Prozess aufgerufen werden. Dies liegt daran, dass in Wirklichkeit gefragt wird, ob der Prozess über Administratorzugriff verfügt, wenn der Benutzer Mitglied der Gruppe \ Administratoren ist.

Ist es möglich festzustellen, ob der Benutzer Teil der Gruppe Administratoren aus einem nicht privilegierten Prozess ist?

Es gibt ein paar ähnliche Fragen bereits, aber das ist kein Duplikat. Insbesondere möchte ich wissen, ob der USER Teil der Gruppe ist und nicht, ob der PROCESS administrative Berechtigungen geerbt hat; und wenn es mit Win32 (nicht .NET) gemacht werden kann.

+0

'NetUserGetLocalGroups()' vielleicht. –

Antwort

1

Wenn Sie ein Handle mit dem Benutzer-Token (von OpenProcessToken usw.) haben, können Sie die klassische Admin-Prüfung durchführen, die Gruppen "nur verweigern" ignoriert: Rufen Sie GetTokenInformation(..., TokenGroups, ...) auf und suchen Sie nach der SID der Administratorengruppe. Wenn Sie nur einen Benutzernamen/eine SID haben, können Sie NetUserGetLocalGroups oder NetLocalGroupGetMembers verwenden.

0

müssen Sie zuerst überprüfen Sie Ihre Token TOKEN_ELEVATION_TYPE.

, wenn Sie bekam TokenElevationTypeDefault oder TokenElevationTypeFull - Sie können nicht erhöhen und Maximum, das Sie unter diesem Benutzerkonto haben, können Sie bereits in Token haben. Zur Abfrage sind Token Admin oder haben Sie einige Privilegien - müssen Sie Ihr aktuelles Token abfragen.

, wenn Sie bekam TokenElevationTypeLimited - Sie verknüpfte Token über TokenLinkedToken abfragen müssen und prüfen Sie dieses Token anstelle Ihrer aktuellen Token verknüpft - denn nach Erhebung privilegierte Anwendung wird dieses Token verwenden.

zum Beispiel:

ULONG IsTokenAdmin(HANDLE hToken, PBOOL pbIsAdmin) 
{ 
    ULONG cbSid = MAX_SID_SIZE; 
    PSID pSid = alloca(cbSid); 
    return CreateWellKnownSid(::WinBuiltinAdministratorsSid, 0, pSid, &cbSid) && 
     CheckTokenMembership(hToken, pSid, pbIsAdmin) ? NOERROR : GetLastError(); 
} 

ULONG IsUserAnAdminEx(PBOOL pbIsAdmin, PBOOL pbNeedElevate) 
{ 
    ULONG dwError = NOERROR; 

    HANDLE hToken; 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &hToken)) 
    { 
     ULONG cb; 
     union { 
      TOKEN_ELEVATION_TYPE tet; 
      TOKEN_LINKED_TOKEN tlt; 
     }; 

     if (GetTokenInformation(hToken, ::TokenElevationType, &tet, sizeof(tet), &cb)) 
     { 
      switch (tet) 
      { 
      case TokenElevationTypeLimited: 
       *pbNeedElevate = TRUE; 
       if (GetTokenInformation(hToken, ::TokenLinkedToken, &tlt, sizeof(tlt), &cb)) 
       { 
        dwError = IsTokenAdmin(tlt.LinkedToken, pbIsAdmin); 
        CloseHandle(tlt.LinkedToken); 
       } 
       else 
       { 
        dwError = GetLastError(); 
       } 
       break; 
      case TokenElevationTypeFull: 
      case TokenElevationTypeDefault: 
       *pbNeedElevate = FALSE; 
       // only because CheckTokenMembership want an impersonation token. 
       // really most query can be and must be done direct with this token 
       if (DuplicateToken(hToken, ::SecurityIdentification, &tlt.LinkedToken)) 
       { 
        dwError = IsTokenAdmin(tlt.LinkedToken, pbIsAdmin); 
        CloseHandle(tlt.LinkedToken); 
       } 
       else 
       { 
        GetLastError(); 
       } 
       break; 
      default: 
       dwError = ERROR_GEN_FAILURE; 
      } 
     } 
     else 
     { 
      dwError = GetLastError(); 
     } 

     CloseHandle(hToken); 
    } 

    return dwError; 
} 
Verwandte Themen