Как узнать, есть ли у пользователя права администратора?
От: Игорь Вартанов Ниоткуда  
Дата: 25.03.02 17:47
Оценка: 159 (7) +1
Статья:
Как узнать, есть ли у пользователя права администратора?
Автор(ы):
Игорь Вартанов

Дата:
01.02.2002

В связи с распространением Windows NT/2000/XP перед разработчиком может встать вопрос адаптации работы приложения применительно к указанным операционным системам. И немаловажным аспектом работы приложения будет являться его осведомленность о наличии необходимых прав, поскольку указанные системы активно используют разграничение прав для пользователей.


Авторы:
Игорь Вартанов

Аннотация:
---
С уважением,
Игорь
How to find this info not for a current user ?
От: michaell  
Дата: 26.03.02 21:57
Оценка:
How to find this info (admin privileges ) not for a current user, but for a user with a given name ?

Thanks,
Michael
How to find all users with admin privileges?
От: michaell  
Дата: 26.03.02 17:47
Оценка:
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: Как узнать, есть ли у пользователя права администратора?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.10.03 23:02
Оценка: 2 (1)
Здравствуйте, Игорь Вартанов, Вы писали:

IsUserAnAdmin недавно вот обнаружил....
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Как узнать, есть ли у пользователя права администратора?
От: Сомов Александр Россия  
Дата: 12.11.03 06:39
Оценка: 1 (1)
Думается мне, что вместо
if( pInfoBuffer )delete pInfoBuffer;

лучше писать
if( pInfoBuffer )delete[] pInfoBuffer;
Re[2]: Как узнать, есть ли у пользователя права администрато
От: Denwer Россия  
Дата: 12.11.03 06:48
Оценка:
Здравствуйте, Сомов Александр, Вы писали:

СА>Думается мне, что вместо

СА>
СА>if( pInfoBuffer )delete pInfoBuffer;
СА>

СА>лучше писать
СА>
СА>if( pInfoBuffer )delete[] pInfoBuffer;
СА>


Это не изменит ситуации для данного примера, хотя это и плохой тон. Разница между обячным вызовом delete и delete[] в том что во втором случае корректно вызовятся деструкторы всех объектов, но так как там это простый тип, то и деструкторы не обязательно вызывать. А память удалится все равно корректно.

ЗЫ: Я не призываю писать всегда без [], просто это не всегда приводит к ошибкам. Как и в данном примере.
Re[3]: Как узнать, есть ли у пользователя права администрато
От: Сомов Александр Россия  
Дата: 12.11.03 07:01
Оценка:
Я нигде не нашёл упоминания в стандарте того, что delete[] отличается от delete лишь корректным вызовом конструкторов. В стандартных библиотеках известных мне компиляторов С++ из VS 6, VS.NET и VS.NET 2003 это вроде бы так и есть, но в других реализациях стандартных библиотек эти два случая могут отличаться архитектурно. В таком случае подменять один вызов другим будет просто нельзя.
Re[2]: Как узнать, есть ли у пользователя права администрато
От: MaximE Великобритания  
Дата: 12.11.03 09:00
Оценка: 2 (1)
Здравствуйте, Сомов Александр, Вы писали:

СА>Думается мне, что вместо

СА>
СА>if( pInfoBuffer )delete pInfoBuffer;
СА>

СА>лучше писать
СА>
СА>if( pInfoBuffer )delete[] pInfoBuffer;
СА>


Если уж пошел такой разговор, то проверка на ноль бессмыслена — стандарт допускает передачу нулевого указателя в delete и delete[].
Re: Как узнать, есть ли у пользователя права администратора?
От: Brupus  
Дата: 23.09.05 13:52
Оценка:
ИМХО, в начало тела функции неплохо было бы добавить строчку
*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 expires
                        if (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 space
                        if (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 ++;
}
Re: Как узнать, есть ли у пользователя права?
От: astral_marine  
Дата: 29.08.06 14:40
Оценка:
Вот функция, которая определяет принадлежит ли текущий юзер к определенной учетной записи.
Может кому пригодится.
#include <atlsecurity.h>

bool isMember(LPCTSTR pszAccountName)
{
    ATL::CSid sid;
    ATLVERIFY(!sid.LoadAccount((pszAccountName)));
    bool bIsMember = false;
    ATLVERIFY(ATL::CAccessToken().CheckTokenMembership(sid, &bIsMember));
    return bIsMember;
}


Вообще, если покопать глубже atlsecurity.h можно много чего полезного нарыть
Re[2]: Как узнать, есть ли у пользователя права?
От: astral_marine  
Дата: 29.08.06 14:45
Оценка:
Правильнее так будет:
#include <atlsecurity.h>

bool isMember(LPCTSTR pszAccountName)
{
    ATL::CSid sid;
    if(!sid.LoadAccount((pszAccountName)))
    {
        ATLASSERT(FALSE && _T("Invalid account name"));
        // TODO: Ваша обработка ошибок
        return false;
    }
    bool bIsMember = false;
    ATLVERIFY(ATL::CAccessToken().CheckTokenMembership(sid, &bIsMember));
    return bIsMember;
}
Re: Как узнать, есть ли у пользователя права администратора?
От: apple-antonovka  
Дата: 29.08.06 16:30
Оценка:
Все это замечательно...
... Но мне обычно хватало

bool AmILocalAdmin()
{
HKEY key;
if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet",0,KEY_ALL_ACCESS,&key)!=ERROR_SUCCESS)
return false;
::RegCloseKey(key);
return true;
}

Re[2]: Как узнать, есть ли у пользователя права администрато
От: Andrew S Россия http://alchemy-lab.com
Дата: 13.11.06 01:17
Оценка:
AA>Все это замечательно...
AA>... Но мне обычно хватало

AA>bool AmILocalAdmin()

AA>{
AA>HKEY key;
AA>if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet",0,KEY_ALL_ACCESS,&key)!=ERROR_SUCCESS)
AA> return false;
AA>::RegCloseKey(key);
AA>return true;
AA>}
AA>

Лезем в regedt32, меняем права доступа к SYSTEM\\CurrentControlSet.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.