在c++中如何重新启动?WinSDK中是否有任何规定?我的程序(进程)应该有什么样的权限这样做?
mgdq6dx11#
ExitWindowsEx Function可以做到这一点。您需要传递EWX_REBOOT(0x0000002)标志以重新启动系统。此处的重要说明(引自MSDN):
ExitWindowsEx函数在启动关机进程后立即返回。然后,关机或注销以异步方式进行。该函数旨在停止调用方登录会话中的所有进程。因此,如果您不是交互式用户,该函数可以成功执行,而无需实际关闭计算机。如果您不是交互式用户,使用启动系统关闭或启动系统关闭Ex函数。
您可以根据自己的情况选择适当的功能。
yyyllmsg2#
在调用ExitWindowsEx函数之前,您需要对SE_SHUTDOWN_NAME privilege执行enable:1.开放进程令牌(获取当前进程()、令牌调整权限...)1.查找权限值1.调整令牌权限1.关闭手柄
xmd2e60i3#
我想你有一个很好的理由想要重新启动一台可能正在运行许多其他应用程序的PC。听起来像是在寻找InitiateShutdown(),在dwShutdownFlags中传递SHUTDOWN_RESTART。
InitiateShutdown()
dwShutdownFlags
SHUTDOWN_RESTART
hec6srdp4#
@Anders解决方案会看起来,不确定这是否是完全功能,因为我写了这一段时间前,并没有运行它在一段时间。文档如下。https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-adjusttokenprivilegeshttps://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lookupprivilegevalueahttps://learn.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-initiatesystemshutdowna
void shutSystemOff(const bool &shutReboot = true) { // Create all required variables int vRet = 0; bool adjustRet; HANDLE hToken = NULL; LUID luid; TOKEN_PRIVILEGES tp; // Get LUID for current boot for current process. OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid); // Modify and Adjust token privileges for current process. tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; adjustRet = AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, 0); // Check if token privileges were set. if (adjustRet) { // Initiates system shutdown ( Local system, Shutdown Message, Dwell time, Prompt user, Reboot ) InitiateSystemShutdownA(NULL, NULL, 0, true, shutReboot); } }
4条答案
按热度按时间mgdq6dx11#
ExitWindowsEx Function可以做到这一点。您需要传递EWX_REBOOT(0x0000002)标志以重新启动系统。
此处的重要说明(引自MSDN):
ExitWindowsEx函数在启动关机进程后立即返回。然后,关机或注销以异步方式进行。该函数旨在停止调用方登录会话中的所有进程。因此,如果您不是交互式用户,该函数可以成功执行,而无需实际关闭计算机。如果您不是交互式用户,使用启动系统关闭或启动系统关闭Ex函数。
您可以根据自己的情况选择适当的功能。
yyyllmsg2#
在调用ExitWindowsEx函数之前,您需要对SE_SHUTDOWN_NAME privilege执行enable:
1.开放进程令牌(获取当前进程()、令牌调整权限...)
1.查找权限值
1.调整令牌权限
1.关闭手柄
xmd2e60i3#
我想你有一个很好的理由想要重新启动一台可能正在运行许多其他应用程序的PC。
听起来像是在寻找
InitiateShutdown()
,在dwShutdownFlags
中传递SHUTDOWN_RESTART
。hec6srdp4#
@Anders解决方案会看起来,不确定这是否是完全功能,因为我写了这一段时间前,并没有运行它在一段时间。文档如下。
https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-adjusttokenprivileges
https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lookupprivilegevaluea
https://learn.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-initiatesystemshutdowna