How to find all users with admin privileges
on given PC under Windows 2000?
Using
NetLocalGroupGetMembers(NULL,"Administators",..)
returns
"Administrator","Domain Admins","Domain Users",...
so next step should be — find members of
"Domain Admins","Domain Users" groups.
How to do it ?
Thanks, Michael.
Re: Как узнать, есть ли у пользователя права администратора?
Здравствуйте, Сомов Александр, Вы писали:
СА>Думается мне, что вместо СА>
СА>if( pInfoBuffer )delete pInfoBuffer;
СА>
СА>лучше писать СА>
СА>if( pInfoBuffer )delete[] pInfoBuffer;
СА>
Это не изменит ситуации для данного примера, хотя это и плохой тон. Разница между обячным вызовом delete и delete[] в том что во втором случае корректно вызовятся деструкторы всех объектов, но так как там это простый тип, то и деструкторы не обязательно вызывать. А память удалится все равно корректно.
ЗЫ: Я не призываю писать всегда без [], просто это не всегда приводит к ошибкам. Как и в данном примере.
Re[3]: Как узнать, есть ли у пользователя права администрато
Я нигде не нашёл упоминания в стандарте того, что delete[] отличается от delete лишь корректным вызовом конструкторов. В стандартных библиотеках известных мне компиляторов С++ из VS 6, VS.NET и VS.NET 2003 это вроде бы так и есть, но в других реализациях стандартных библиотек эти два случая могут отличаться архитектурно. В таком случае подменять один вызов другим будет просто нельзя.
Re[2]: Как узнать, есть ли у пользователя права администрато
ИМХО, в начало тела функции неплохо было бы добавить строчку
*pbAdmin = FALSE;
Кроме того, в ветке для WINVER < 0x0500 выходной параметр pbAdmin дублируется возвращаемым значением функции, хранящимся в локальной переменной bResult. По логике, bResult должен сигнализировать успешно ли прошло выполнение функции, даже если пользователь не оказался администратором. В связи с этим также предлагаю добавить строку
bResult = TRUE;
перед
// переберем идентификаторы безопасности процесса в поисках необходимого нам
т.к. к моменту перебора групп токена все SID групп уже получены и выполнение функции можно считать успешным.
Re: Как узнать, есть ли у пользователя права администратора?
От:
Аноним
Дата:
23.09.05 19:42
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:
а можно так:
//////////////////////////////////////////////////////////////////////////
/////////// UsersInfo class (header)
//////////////////////////////////////////////////////////////////////////struct UserData {
// имя аккаунта
CString name;
// полное имя аккаунта
CString fullName;
// привилегии
CString privilege;
// комментарий к аккаунту
CString comment;
// время последнего входа
// если tm_year = 0, входа не было
tm lastLogOn;
// время окончания аккаунта
// если tm_year = 0, аккаунт не ограничен
tm expires;
// разрешенное к использованию место на диске в Mb
// -1 = без ограниченийint availableDiskSpace;
// привилегии оператора:
DWORD operPrivilege;
// доп. инфо
DWORD addInfo;
};
class AFX_EXT_CLASS UsersInfo : public SystemInfo {
int count;
UserData * data;
void GetUsersInfo (CString serverName = _T("localhost"));
public:
// привилегии оператора:enum OperatorPrivilege {
print = 1, // оператор печати
communications = 2, // оператор связи
server = 4, // серверный оператор
account = 8 // оператор пользователей
};
// доп. инфо:enum AdditionalInfo {
disabled = 1, // отключен
pwdNeverExpired = 2, // срок действия пароля не ограничен
pwdCannotChange = 4, // пользователь не может изменить пароль
pwdExpired = 8 // срок действия пароля окончен
};
UsersInfo ();
void InitInfo ();
void InitInfo (CString serverName);
virtual ~UsersInfo ();
void Clear ();
inline UserData * GetUsersInfo (int & cnt) { cnt = count; return data; }
};
//////////////////////////////////////////////////////////////////////////
/////////// UsersInfo class (source)
//////////////////////////////////////////////////////////////////////////#pragma once
#include"stdafx.h"#include"SystemInfo.h"#include"atlconv.h"#include"list"#include"Lm.h"#pragma comment (lib, "Netapi32.lib")
UsersInfo::UsersInfo () {
count = 0;
data = NULL;
}
UsersInfo::~UsersInfo () { Clear (); }
void UsersInfo::Clear () {
if (count)
delete [] data;
count = 0;
data = NULL;
}
void UsersInfo::InitInfo () {
Clear ();
m_isValid = 0;
GetUsersInfo ();
}
void UsersInfo::InitInfo (CString serverName) {
Clear ();
m_isValid = 0;
GetUsersInfo (serverName);
}
void UsersInfo::GetUsersInfo (CString serverName /* = _T("localhost") */) {
USES_CONVERSION;
LPUSER_INFO_2 buff = {NULL};
LPUSER_INFO_2 tempBuff = {NULL};
DWORD read = 0;
DWORD handle = 0;
DWORD totalEntries = 0;
NET_API_STATUS status;
UserData ui = {NULL};
std::list <UserData> info;
do {
if (serverName == _T("localhost")) {
status = NetUserEnum (NULL, 2, NULL,
(LPBYTE*) &buff, MAX_PREFERRED_LENGTH, &read,
&totalEntries, &handle);
}
else {
wchar_t temp [256];
#ifndef UNICODE
wcscpy (temp, A2W (serverName));
#else
wcscpy (temp, serverName);
#endif
status = NetUserEnum (temp, 2, NULL,
(LPBYTE*) &buff, MAX_PREFERRED_LENGTH, &read,
&totalEntries, &handle);
}
switch (status) {
case ERROR_ACCESS_DENIED:
if (buff)
NetApiBufferFree (buff);
m_isValid = 5;
return;
case NERR_InvalidComputer:
if (buff)
NetApiBufferFree (buff);
m_isValid = GetLastError ();
return;
case ERROR_MORE_DATA:
if (buff)
NetApiBufferFree (buff);
m_isValid = GetLastError ();
return;
case NERR_Success:
{
if ((tempBuff = buff) != NULL) {
for (DWORD i = 0; i < read; i++) {
if (!tempBuff) {
if (buff)
NetApiBufferFree (buff);
m_isValid = GetLastError ();
return;
}
#ifndef UNICODE
// Account name
ui.name = W2A (tempBuff->usri2_name);
// Account full name
ui.fullName = W2A (tempBuff->usri2_full_name);
#else
ui.name = tempBuff->usri2_name;
ui.fullName = tempBuff->usri2_full_name;
#endif// "Account privilege:switch (tempBuff->usri2_priv) {
case USER_PRIV_GUEST:
ui.privilege = _T("Guest");
break;
case USER_PRIV_USER:
ui.privilege = _T("User");
break;
case USER_PRIV_ADMIN:
ui.privilege = _T("Admin");
break;
}
// Account comment#ifndef UNICODE
ui.comment = W2A (tempBuff->usri2_comment);
#else
ui.comment = tempBuff->usri2_comment;
#endif// Account last logon
tm * time = NULL;
if (!tempBuff->usri2_last_logon)
ui.lastLogOn.tm_year = 0;
else {
time = localtime ((long *)&tempBuff->usri2_last_logon);
ui.lastLogOn = *time;
}
// Account expiresif (tempBuff->usri2_acct_expires == TIMEQ_FOREVER)
ui.expires.tm_year = 0;
else {
time = localtime ((long *)&tempBuff->usri2_acct_expires);
ui.expires = *time;
}
// amount of disk spaceif (tempBuff->usri2_max_storage == USER_MAXSTORAGE_UNLIMITED)
ui.availableDiskSpace = -1;
else
ui.availableDiskSpace = tempBuff->usri2_max_storage / 1024 / 1024;
// Account operator privileges:
ui.operPrivilege = 0;
if (tempBuff->usri2_auth_flags & AF_OP_PRINT)
ui.operPrivilege |= OperatorPrivilege::print;
if (tempBuff->usri2_auth_flags & AF_OP_COMM)
ui.operPrivilege |= OperatorPrivilege::communications;
if (tempBuff->usri2_auth_flags & AF_OP_SERVER)
ui.operPrivilege |= OperatorPrivilege::server;
if (tempBuff->usri2_auth_flags & AF_OP_ACCOUNTS)
ui.operPrivilege |= OperatorPrivilege::account;
// Additional info:
ui.addInfo = 0;
if (tempBuff->usri2_flags & UF_ACCOUNTDISABLE)
ui.addInfo |= AdditionalInfo::disabled;
if (tempBuff->usri2_flags & UF_PASSWD_CANT_CHANGE)
ui.addInfo |= AdditionalInfo::pwdCannotChange;
if (tempBuff->usri2_flags & UF_DONT_EXPIRE_PASSWD)
ui.addInfo |= AdditionalInfo::pwdNeverExpired;
if (tempBuff->usri2_flags & UF_PASSWORD_EXPIRED)
ui.addInfo |= AdditionalInfo::pwdExpired;
tempBuff++;
info.push_back (ui);
}
}
}
break;
}
} while (status == ERROR_MORE_DATA);
if (buff != NULL)
NetApiBufferFree (buff);
count = (int)info.size ();
data = new UserData [count];
if (!data) {
m_isValid = GetLastError ();
return;
}
std::list <UserData>::iterator bg = info.begin ();
std::list <UserData>::iterator ed = info.end ();
int i = 0;
while (bg != ed)
data [i++] = *bg ++;
}