我从来没有编程一个winapi所以我有一个小问题在这里。
我需要从我的应用程序中closures我的电脑。
我发现这个例子链接文本,然后我发现这个例子如何更改特权链接文本
但我有问题如何获得参数HANDLE hToken //访问令牌句柄
我想我需要在下一个命令获取参数OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges,但有很多参数,我不知道如何处理它们。
也许你有jere一些例子我如何得到HANDLE hToken参数来使这项工作。
顺便说一下,我已经看到了以下文章链接文本
非常感谢你。
对于丹尼尔答案的评论有点多,所以我把它放在这里。
看起来您现在的主要问题是您的进程没有运行所需的权限来执行系统关闭。
ExitWindowsEx的文档包含这一行:
要关闭或重新启动系统,调用进程必须使用
AdjustTokenPrivileges
功能来启用SE_SHUTDOWN_NAME
权限。 有关更多信息,请参阅使用特权运行 。
他们也有一些示例代码 。 在捏,你可以复制它。
// ========================================================================== // system shutdown // nSDType: 0 - Shutdown the system // 1 - Shutdown the system and turn off the power (if supported) // 2 - Shutdown the system and then restart the system void SystemShutdown(UINT nSDType) { HANDLE hToken; TOKEN_PRIVILEGES tkp ; ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken); ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1 ; // set 1 privilege tkp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED; // get the shutdown privilege for this process ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); switch (nSDType) { case 0: ::ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE, 0); break; case 1: ::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0); break; case 2: ::ExitWindowsEx(EWX_REBOOT |EWX_FORCE, 0); break; } }
您可以使用ShellExecute()来调用shutdown.exe
#include<iostream> using namespace std; int main(){ system("shutdown -s -f -t 0"); }
InitiateSystemShutdownEx
一些工作代码:
// Get the process token HANDLE hToken; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); // Build a token privilege request object for shutdown TOKEN_PRIVILEGES tk; tk.PrivilegeCount = 1; tk.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; LookupPrivilegeValue(NULL, TEXT("SeShutdownPrivilege"), &tk.Privileges[0].Luid); // Adjust privileges AdjustTokenPrivileges(hToken, FALSE, &tk, 0, NULL, 0); // Go ahead and shut down InitiateSystemShutdownEx(NULL, NULL, 0, FALSE, FALSE, 0);
据我所知, ExitWindowsEx
解决方案的优点是调用进程不需要属于活动用户。