2015-05-06 5 views
1

Мне интересно, могу ли я заставить пользователей ведьм принадлежать к моей локальной группе администраторов и перечислить их. Есть ли способ сделать это с помощью C++? Может, какой-нибудь способ WinAPI?Получить имена пользователей локальных администраторов, используя C++

Большое спасибо.

+1

Вы обрисовал в общих чертах две задачи : 1) Получить список учетных записей пользователей - http://stackoverflow.com/questions/7593333/how-to-get-all-windows-user-account-name?rq=1 и 2) Посмотрите, является ли пользователь местный администратор http://stackoverflow.com/questions/3064217/identifying-if-a-user-is-in-the-local-administrators-group?rq=1. По крайней мере, сделайте некоторое фундаментальное исследование самостоятельно, чтобы найти ответ, прежде чем публиковать здесь. Благодарю. –

+0

Имейте в виду, что группа «Администраторы» может содержать другие группы. В зависимости от ваших потребностей вам может потребоваться перечислить их итеративно. (Также могут быть странные краевые случаи, например, если sysadmin глупо добавил INTERACTIVE в группу «Администраторы», я не уверен, что произойдет.) –

ответ

3

Вы можете использовать NetUserGetLocalGroups и NetUserGetInfo для retrive информации и проверить значение usri1_priv в USER_INFO_1 структуры.

Я думаю, что что-то подобное должно вам начать (из MSDN):

BOOL IsUserAdmin(VOID) 
/*++ 
Routine Description: This routine returns TRUE if the caller's 
process is a member of the Administrators local group. Caller is NOT 
expected to be impersonating anyone and is expected to be able to 
open its own process and process token. 
Arguments: None. 
Return Value: 
    TRUE - Caller has Administrators local group. 
    FALSE - Caller does not have Administrators local group. -- 
*/ 
{ 
BOOL b; 
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; 
PSID AdministratorsGroup; 
b = AllocateAndInitializeSid(
    &NtAuthority, 
    2, 
    SECURITY_BUILTIN_DOMAIN_RID, 
    DOMAIN_ALIAS_RID_ADMINS, 
    0, 0, 0, 0, 0, 0, 
    &AdministratorsGroup); 
if(b) 
{ 
    if (!CheckTokenMembership(NULL, AdministratorsGroup, &b)) 
    { 
     b = FALSE; 
    } 
    FreeSid(AdministratorsGroup); 
} 

return(b); 
} 

Вы также можете ознакомиться с этой page (старая его, но он должен работать)

+0

Большое спасибо. У вас есть/рекомендуете какой-либо пример кода? –

+0

Я отредактировал свой ответ, надеюсь, вам это понравится –

+0

Большое вам спасибо, Джордж. Я дам ему попробовать. –

Смежные вопросы