Не удается программно предоставить привилегию с помощью AdjustTokenPrivileges
Код:
BOOL CRegEditDlg::SetPrivilege(CString privilege_name, BOOL bEnablePrivilege)
{
CString s;
HANDLE hToken;
LUID luid;
DWORD RetLen = 0;
HANDLE hProcess;
size_t sz = sizeof(TOKEN_PRIVILEGES);
PTOKEN_PRIVILEGES pPriv = (PTOKEN_PRIVILEGES)_alloca(sz);
PTOKEN_PRIVILEGES pOldPrivs = (PTOKEN_PRIVILEGES)_alloca(sz);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
try
{
OpenProcessToken(hProcess, TOKEN_QUERY || TOKEN_ADJUST_PRIVILEGES, &hToken);
if (LookupPrivilegeValue(NULL, privilege_name, &luid))
{
pPriv->PrivilegeCount = 1;
pPriv->Privileges[0].Luid = luid;
if (bEnablePrivilege)
pPriv->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
pPriv->Privileges[0].Attributes = 0;
if ( !AdjustTokenPrivileges(hToken,FALSE,pPriv,sz, pOldPrivs, &RetLen))
{
s.Format(L"AdjustTokenPrivileges error: %u", GetLastError() );
AfxMessageBox(s);
return FALSE;
}
}
}
catch (...)
{
try
{
CloseHandle(hToken);
}
catch (...)
{
}
}
return TRUE;
}
{
CString s;
HANDLE hToken;
LUID luid;
DWORD RetLen = 0;
HANDLE hProcess;
size_t sz = sizeof(TOKEN_PRIVILEGES);
PTOKEN_PRIVILEGES pPriv = (PTOKEN_PRIVILEGES)_alloca(sz);
PTOKEN_PRIVILEGES pOldPrivs = (PTOKEN_PRIVILEGES)_alloca(sz);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
try
{
OpenProcessToken(hProcess, TOKEN_QUERY || TOKEN_ADJUST_PRIVILEGES, &hToken);
if (LookupPrivilegeValue(NULL, privilege_name, &luid))
{
pPriv->PrivilegeCount = 1;
pPriv->Privileges[0].Luid = luid;
if (bEnablePrivilege)
pPriv->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
pPriv->Privileges[0].Attributes = 0;
if ( !AdjustTokenPrivileges(hToken,FALSE,pPriv,sz, pOldPrivs, &RetLen))
{
s.Format(L"AdjustTokenPrivileges error: %u", GetLastError() );
AfxMessageBox(s);
return FALSE;
}
}
}
catch (...)
{
try
{
CloseHandle(hToken);
}
catch (...)
{
}
}
return TRUE;
}
P.S. Что заставило Вас в 2017-м году писать на MFC, если не секрет? :)
OpenProcessToken(hProcess, TOKEN_QUERY || - это что ?
pPriv->Privileges[0].Attributes = 0; - вы в этом уверены? документация что говорит по этому поводу?
Операция проходит замечательно и так:
AdjustTokenPrivileges(hToken,FALSE,pPriv,0, 0, 0);
Спасибо за ответы. Заработало. Проблемы была в TOKEN_QUERY || TOKEN_ADJUST_PRIVILEGES, глаз замылился... На счет GetCurrentProcess: сначала использовал её, потом переделал на OpenProcess, в принципе не принципиально. В остальном всё нормально. Тема закрыта.