我从来没有编程的WINAPI,所以我在这里有一个小问题。
我需要从我的应用程序关闭我的电脑。
我发现这个例子中的链接文本 ,然后我发现这个例子如何更改权限链接文本
但我有问题,如何获取参数HANDLE hToken //访问令牌手柄
我想我需要在未来以获取参数OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges,但也有我不知道如何处理他们很多参数。
也许你有一些的Jere例如我如何获得该句柄hToken参数,使这项工作。
顺便说一句,我已经看到了下面的帖子链接文本
非常感谢你。
这是一个有点吃不消了对丹尼尔的回答意见,所以我把它放在这里。
它看起来像你在这一点上的主要问题是,你的进程并没有与执行系统关机所需的priveleges运行。
对于文档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的
http://msdn.microsoft.com/en-us/library/aa376868(VS.85).aspx
尝试
ExitWindowsEx(EWX_POWEROFF, 0);
#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
解决方案是调用进程并不需要属于活跃用户。