Здравствуйте, Аноним, Вы писали:
Не знаю, насколько это будет полезно, но вот этот код на 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 в вашем коде) нужно инициализировать перед каждым вызовом этих функций, так как они модифицируют переданное им значение. В вашем коде этого не видно.