2009-06-11 8 views
1

Ich möchte den Benutzernamen des Prozesses abrufen und überprüfen, ob es sich um einen lokalen Administrator handelt. Oder direkt prüfen, ob der aktuelle procees Benutzer ein lokaler Administrator istÜberprüfen, ob Prozessbenutzer Administrator ist C++

+2

Welches Betriebssystem? Es macht wahrscheinlich einen Unterschied ... – crashmstr

+1

"lokalen Administrator" ist am ehesten auf Windows. – sharptooth

+0

Ich renne - Windows OS – sofr

Antwort

0

Vorausgesetzt, Sie auf einem Windows-OS sind gibt es eine Shell-Funktion: IsUserAnAdmin

Siehe MSDN article

In diesem Artikel wird vorschlagen, eine eigene Funktion rollen Verwenden Sie jedoch CheckTokenMembership. Es gibt sogar ein Codebeispiel, das Ihnen hilft.

+0

danke! aber alles, was ich habe, ist der angemeldete Benutzer Ich suche nach einer Möglichkeit, den Benutzer wjo einen Dienst zu starten und überprüfen, ob es ein lokaler Administrator ist – sofr

+0

Ich bin mir nicht sicher, wo Sie herkommen. Aber ich bin bereit zu helfen. Etwas mehr Hintergrundwissen zu dem, was Sie letztlich erreichen wollen, kann mir helfen. Ist dieser Service etwas, das Sie geschrieben haben? Wenn dies der Fall ist, können Sie während der Installation Sicherheit anwenden, um Benutzern (und/oder Gruppen) zu erlauben oder zu verbieten, den Dienst zu starten oder zu stoppen, wenn Sie danach suchen. Im Allgemeinen werden Windows-Dienste nicht als der Benutzer ausgeführt, der sie gestartet hat. Standardmäßig wird das Systemkonto als das Konto verwendet, unter dem ein Dienst ausgeführt wird, aber dies kann als beliebiger Benutzer konfiguriert werden. Die Dienst-Threads können dann die Benutzer nach ihren Wünschen imitieren. – MrBry

+1

Ich weiß, dies ist eine alte Antwort, aber nur um darauf hinzuweisen, das funktioniert nur bis Windows Vista, also für Windows 7, 8 und 10 wird diese Funktion nicht funktionieren. – Alex

3

Holen Sie sich den aktuellen Benutzernamen mit GetUserName(), dann rufen Sie NetUserGetInfo() mit dem Server-Namen (NULL für lokale) und Benutzernamen Sie gerade erhalten haben. Übergeben Sie es eine USER_INFO_1 Struktur, und dann Zugriff usri1_priv in der Struktur. Wenn der Wert USER_PRIV_ADMIN ist, dann wissen Sie, dass der Benutzername ein Administrator ist.

2

Getestet unter Windows XP SP3, Windows 7 32 Bit und 64 Bit mit Admin-Benutzer und Nicht-Admin-Benutzer. Code, der aus dem entsprechenden C# portiert wurde und ATL-Windows-Wrapper-Sicherheitsklassen verwendet.

#include <atlbase.h> 
#include <atlsecurity.h> 

// The function returns true if the user who is running the 
// application is a member of the Administrators group, 
// which does not necessarily mean the process has admin privileges. 
bool IsAdministrator(HRESULT &rHr) 
{ 
    bool bIsAdmin = false; 

    try 
    { 
     // Open the access token of the current process. 
     ATL::CAccessToken aToken; 
     if (!aToken.GetProcessToken(TOKEN_QUERY)) 
     { 
      throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32, 
       ::GetLastError()); 
     } 


     // Query for the access token's group information. 
     ATL::CTokenGroups groups; 
     if (!aToken.GetGroups(&groups)) 
     { 
      throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32, 
       ::GetLastError()); 
     } 

     // Iterate through the access token's groups 
     // looking for a match against the builtin admins group. 
     ATL::CSid::CSidArray groupSids; 
     ATL::CAtlArray<DWORD> groupAttribs; 
     groups.GetSidsAndAttributes(&groupSids, &groupAttribs); 
     for (UINT i = 0; !bIsAdmin && i < groupSids.GetCount(); ++i) 
     { 
      bIsAdmin = groupSids.GetAt(i) == ATL::Sids::Admins(); 
     } 
     rHr = S_OK; 
    } 
    catch (HRESULT hr) 
    { 
     rHr = hr; 
    } 

    return bIsAdmin; 
} 
Verwandte Themen