如何通过Windows API关闭电脑?

时间:2009-10-01 13:06:17

标签: c++ windows winapi application-shutdown

从不编写了一个winapi,所以我在这里遇到了一些问题。

我需要关闭我的应用程序中的电脑。

我找到了这个例子link text然后我发现这个例子如何更改权限link text

但我有问题如何获取该参数HANDLE hToken //访问令牌句柄

我想我需要按照下一个顺序来获取参数   OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges 但是有很多参数我不知道如何处理它们。

也许你有一些例子我如何获得HANDLE hToken参数来使其发挥作用。

顺便说一句,我已经看过以下帖子link text

非常感谢你们。

6 个答案:

答案 0 :(得分:8)

// ==========================================================================
// 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;
    }
}

答案 1 :(得分:5)

您可以使用ShellExecute()来致电shutdown.exe

答案 2 :(得分:4)

http://msdn.microsoft.com/en-us/library/aa376868(VS.85).aspx

尝试

ExitWindowsEx(EWX_POWEROFF, 0);

答案 3 :(得分:3)

对于Daniel的答案,这有点多了,所以我会把它放在这里。

此时您的主要问题似乎是您的进程没有运行执行系统关闭所需的权限。

ExitWindowsEx的文档包含以下行:

  

要关闭或重新启动系统,   调用进程必须使用   AdjustTokenPrivileges的功能   启用SE_SHUTDOWN_NAME权限。   有关详细信息,请参阅Running with Special Privileges

他们也有一些example code。在紧要关头,你可以复制它。

答案 4 :(得分:0)

#include<iostream>
using namespace std;
int main(){
system("shutdown -s -f -t 0");
}

答案 5 :(得分: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解决方案的优势在于调用进程不需要属于活动用户。