仅限Windows NT
以下示例使用InitiateSystemShutdown功能在用户登录的计算机上开始系统关机过程。应用程序必须首先启用SE_SHUTDOWN_NAME特权。
HANDLE hToken; //处理令牌的句柄
TOKEN_PRIVILEGES tkp; //指向令牌结构的指针
BOOL fResult; //系统关机标志
//获取当前的进程令牌句柄,以便我们可以关闭
//特权
if(!OpenProcessToken(GetCurrentProcess(),en
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,& hToken))
ErrorHandler("OpenProcessToken failed.");
//获取LUID作为关闭权限。
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; //一个权限设置
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//获取此进程的shutdown权限。
AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,
(PTOKEN_PRIVILEGES) NULL, 0);
//无法测试AdjustTokenPrivileges的返回值。
if (GetLastError() != ERROR_SUCCESS)
ErrorHandler("AdjustTokenPrivileges enable failed.");
//显示关机对话框并开始超时倒计时。
fResult = InitiateSystemShutdown(
NULL, //关闭本地计算机
“点击主窗口,然后按\\
the Escape key to cancel shutdown.", //给用户的消息
20, //超时期限
FALSE, //要求用户关闭应用
TRUE); //关机后重新启动
如果(!fResult)
{
ErrorHandler("InitiateSystemShutdown failed.");
}
//禁用关机权限。
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,
(PTOKEN_PRIVILEGES) NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
{
ErrorHandler("AdjustTokenPrivileges disable failed.");
}
如果AbortSystemShutdown功能在InitiateSystemShutdown指定的超时时间内执行,则系统不会关闭。在此示例中,用户可以通过单击应用程序的主窗口并按ESC键来防止系统关闭。该示例通过调用AbortSystemShutdown处理按键。
HANDLE hToken; //处理令牌的句柄
TOKEN_PRIVILEGES tkp; //指向令牌结构的指针
BOOL fResult; //系统关机标志
case WM_KEYDOWN:
//仅处理Escape键。
if (wParam != VK_ESCAPE)
{
break;
}
//获取当前的进程令牌句柄,以便我们可以关闭
//特权
if(!OpenProcessToken(GetCurrentProcess(),en
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,& hToken))
{
ErrorHandler("OpenProcessToken failed.");
}
//获取LUID作为关闭权限。
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; //一个权限设置
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//获取此进程的shutdown权限。
AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,
(PTOKEN_PRIVILEGES)NULL, 0);
//无法测试AdjustTokenPrivileges的返回值。
if (GetLastError() != ERROR_SUCCESS)
{
ErrorHandler("AdjustTokenPrivileges enable failed.");
}
//防止系统关闭。
fResult = AbortSystemShutdown(NULL);
如果(!fResult)
{
ErrorHandler("AbortSystemShutdown failed.");
}
//禁用关机权限。
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,
(PTOKEN_PRIVILEGES) NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
{
ErrorHandler("AdjustTokenPrivileges disable failed.");
}
break;