BOOL EnableDebugPrivilege() {
HANDLE hToken;
BOOL fOk = FALSE;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOk = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOk;
}
调用:
if (EnableDebugPrivilege()) {
MessageBox(NULL,L"EnableDebugPrivilege success.",L"",NULL);
}
else {
MessageBox(NULL, L"EnableDebugPrivilege failed.", L"", NULL);
}
class CEnablePriv
{
public: //公有(对外开放的接口)
//
//设置当前进程优先级为最高(实时)
//
BOOL SetRealTimePriority();
//
//提升当前进程权限函数("SeShutdownPrivilege"关机权限)
//
BOOL EnableShutdownPriv();
//
//提升当前进程权限函数("SeDebugPrivilege"读、写控制权限)
//
BOOL EnableDebugPriv();
//
//提升当前进程权限函数("SeBackupPrivilege"注册表备份权限)
//
BOOL EnableBackupPriv();
//
//提升当前进程权限函数("SeRestorePrivilege"恢复数据权限)
//
BOOL EnableRestorePriv();
private: //私有(内部使用的接口)
};
//
//设置当前进程优先级为最高(实时)
//
//返回值:“false”是失败,“true”是成功。
BOOL CEnablePriv::SetRealTimePriority()
{
if (!SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS))
{
return false;
}
return true;
}
//
//提升当前进程权限函数("SeShutdownPrivilege"关机权限)
//
//返回值:“false”是失败,“true”是成功。
BOOL CEnablePriv::EnableShutdownPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &sedebugnameValue))
{
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
CloseHandle(hToken);
return true;
}
//
//提升当前进程权限函数("SeDebugPrivilege"读、写控制权限)
//
//返回值:“false”是失败,“true”是成功。
BOOL CEnablePriv::EnableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
{
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
CloseHandle(hToken);
return true;
}
//
//提升当前进程权限函数("SeBackupPrivilege"备份数据权限)
//
//返回值:“false”是失败,“true”是成功。
BOOL CEnablePriv::EnableBackupPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
if (!LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &sedebugnameValue))
{
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
CloseHandle(hToken);
return true;
}
//
//提升当前进程权限函数("SeRestorePrivilege"恢复数据权限)
//
//返回值:“false”是失败,“true”是成功。
BOOL CEnablePriv::EnableRestorePriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
if (!LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &sedebugnameValue))
{
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
CloseHandle(hToken);
return true;
}
调用:
CEnablePriv a;
if (a.EnableBackupPriv())
{
MessageBox(NULL, L"EnableBackupPriv success", L"", NULL);
}
if (a.EnableDebugPriv())
{
MessageBox(NULL, L"EnableDebugPriv success.", L"", NULL);
}
if (a.EnableRestorePriv())
{
MessageBox(NULL, L"EnableRestorePriv success .", L"", NULL);
}
if (a.EnableShutdownPriv())
{
MessageBox(NULL, L"EnableShutdownPriv success.", L"", NULL);
}
if (a.SetRealTimePriority())
{
MessageBox(NULL, L"SetRealTimePriority success.", L"", NULL);
}