Re: Получение списка привелегий пользователя
От: Alex Fedotov США  
Дата: 13.05.03 17:39
Оценка:
Здравствуйте, Аноним, Вы писали:

Не знаю, насколько это будет полезно, но вот этот код на C(++) у меня работает без ошибок:

int main(void)
{
    PTOKEN_PRIVILEGES pBuffer = NULL;
    ULONG cbBuffer = 0;
    HANDLE hToken;

    if (!OpenProcessToken(GetCurrentProcess(), 
              TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
              &hToken))
    {
    _tprintf(_T("OpenProcessToken failed\n"));
    return 1;
    }

    if (!GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &cbBuffer))
    {
    if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
    {
        _tprintf(_T("GetTokenInformation failed\n"));
        return 1;
    }

    pBuffer = (PTOKEN_PRIVILEGES)_alloca(cbBuffer);

    if (!GetTokenInformation(hToken, TokenPrivileges, pBuffer, cbBuffer,
                 &cbBuffer))
    {
        _tprintf(_T("GetTokenInformation failed\n"));
        return 1;
    }
    }

    for (ULONG i = 0; i < pBuffer->PrivilegeCount; i++)
    {
    TCHAR szName[256];
    TCHAR szDisplayName[256];
    ULONG cbName;
    ULONG dwLangId;
        
    cbName = sizeof(szName) / sizeof(szName[0]);
    if (!LookupPrivilegeName(NULL, &pBuffer->Privileges[i].Luid, 
                 szName, &cbName))
    {
        _tprintf(_T("LookupPrivilegeName failed\n"));
        return 1;
    }

    cbName = sizeof(szDisplayName) / sizeof(szDisplayName[0]);
    if (!LookupPrivilegeDisplayName(NULL, szName, szDisplayName, 
                    &cbName, &dwLangId))
    {
        _tprintf(_T("LookupPrivilegeDisplayName failed\n"));
        return 1;
    }

    _tprintf(_T("%s - %s\n"), szName, szDisplayName);
    }

    return 0;
}


Паскалем уже давно не занимаюсь, поэтому какие-то мелочи в вашем коде мог просмотреть.

Обратите внимание, что размер выходного буфера для LookupPrivilegeName и LookupPrivilegeDisplayName (ucPrivilegeName в вашем коде) нужно инициализировать перед каждым вызовом этих функций, так как они модифицируют переданное им значение. В вашем коде этого не видно.
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.