2009-06-11 3 views
1

Я хочу получить имя пользователя процесса и проверить, является ли он локальным администратором. Или проверить непосредственно, если текущий пользователь procees является локальным администраторомПроверьте, является ли пользователь процесса администратором C++

+2

Какая операционная система? Вероятно, это имеет значение ... – crashmstr

+1

«Локальный администратор», скорее всего, находится в Windows. – sharptooth

+0

Я бегу - ОС Windows – sofr

ответ

0

Предположив вы на ОС Window есть функция оболочки: IsUserAnAdmin

См MSDN article

Эта статья позволяет предположить, прокатке свою собственную функцию хотя, используйте CheckTokenMembership. Существует даже пример кода, который поможет вам.

+0

спасибо! но все, что у меня есть, это зарегистрированный пользователь. Я ищу способ заставить пользователя wjo запускать службу и проверять, является ли это локальным администратором. – sofr

+0

Я не уверен, откуда вы. Но я готов помочь. Мне может помочь еще один пример того, что вы в конечном итоге пытаетесь достичь. Является ли эта услуга тем, что вы написали? Если это так, вы можете применить безопасность во время установки, чтобы разрешить/запретить пользователям (и/или группам) запуск или остановку службы, если это то, что вам нужно? Обычно службы Windows не запускаются как пользователь, который их запускал. По умолчанию системная учетная запись используется как учетная запись, в которой выполняется служба, но это может быть настроено как любой пользователь, которого вы хотите. Затем потоки службы могут выдавать себя за пользователей по своему усмотрению. – MrBry

+1

Я знаю, что это старый ответ, но просто указать, это работает только с Windows Vista, поэтому для окон 7, 8 и 10 эта функция не будет работать. – Alex

3

Получить текущее имя пользователя с помощью GetUserName(), а затем позвонить NetUserGetInfo() с именем сервера (NULL для местного) и именем пользователя, которое вы только что получили. Передайте ему структуру USER_INFO_1, а затем получите usri1_priv в конструкции. Если значение равно USER_PRIV_ADMIN, вы узнаете, что имя пользователя является администратором.

2

Протестировано на Windows XP SP3, Windows 7 32-битное и 64-битное с пользователем администратора и не-администратором. Код, перенесенный с эквивалентного C#, и использует классы оболочки безопасности ATL.

#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; 
} 
Смежные вопросы