2009-06-11 11 views

Répondre

0

En supposant que vous êtes sur un système d'exploitation de la fenêtre il y a une fonction shell: IsUserAnAdmin

Voir MSDN article

Cet article ne suggère rouler votre propre fonction cependant, utilisez CheckTokenMembership. Il y a même un exemple de code pour vous aider.

+0

merci! mais tout ce que j'ai est l'utilisateur connecté Je cherche un moyen d'obtenir l'utilisateur wjo exécute un service et vérifie si c'est un administrateur local – sofr

+0

Je ne suis pas sûr d'où vous venez. Mais je suis prêt à aider. Un peu plus d'informations sur ce que vous essayez de réaliser peut éventuellement m'aider. Ce service est-il quelque chose que vous avez écrit? Si oui, vous pouvez appliquer une sécurité pendant l'installation pour autoriser/refuser aux utilisateurs (et/ou aux groupes) de démarrer ou d'arrêter le service, si c'est ce que vous recherchez? Généralement, les services Windows ne sont pas exécutés en tant qu'utilisateur qui les a démarrés. Par défaut, le compte système est utilisé comme compte sous lequel un service est exécuté, mais il peut être configuré pour être n'importe quel utilisateur. Les threads de service peuvent ensuite usurper l'identité des utilisateurs comme ils le souhaitent. – MrBry

+1

Je sais que c'est une vieille réponse mais juste pour le souligner, cela ne fonctionne que jusqu'à Windows Vista, donc pour Windows 7, 8 et 10 cette fonctionnalité ne fonctionnera pas. – Alex

3

Obtenez le nom d'utilisateur actuel avec GetUserName(), puis appelez NetUserGetInfo() avec le nom du serveur (NULL pour local) et le nom d'utilisateur que vous venez d'obtenir. Passez-lui une structure USER_INFO_1, puis accédez à usri1_priv dans la structure. Si la valeur est USER_PRIV_ADMIN, vous saurez que le nom d'utilisateur est un admin.

2

Testé sur Windows XP SP3, Windows 7 32 bits et 64 bits avec utilisateur admin et utilisateur non administrateur. Le code a été porté à partir de C# équivalent et utilise les classes d'encapsulation de sécurité ATL Windows.

#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; 
} 
Questions connexes