windows 如何以编程方式重新启动?

kse8i1jr  于 2022-12-30  发布在  Windows
关注(0)|答案(4)|浏览(211)

在c++中如何重新启动?WinSDK中是否有任何规定?我的程序(进程)应该有什么样的权限这样做?

mgdq6dx1

mgdq6dx11#

ExitWindowsEx Function可以做到这一点。您需要传递EWX_REBOOT(0x0000002)标志以重新启动系统。
此处的重要说明(引自MSDN):

ExitWindowsEx函数在启动关机进程后立即返回。然后,关机或注销以异步方式进行。该函数旨在停止调用方登录会话中的所有进程。因此,如果您不是交互式用户,该函数可以成功执行,而无需实际关闭计算机。如果您不是交互式用户,使用启动系统关闭启动系统关闭Ex函数。

您可以根据自己的情况选择适当的功能。

yyyllmsg

yyyllmsg2#

在调用ExitWindowsEx函数之前,您需要对SE_SHUTDOWN_NAME privilege执行enable
1.开放进程令牌(获取当前进程()、令牌调整权限...)
1.查找权限值
1.调整令牌权限
1.关闭手柄

xmd2e60i

xmd2e60i3#

我想你有一个很好的理由想要重新启动一台可能正在运行许多其他应用程序的PC。
听起来像是在寻找InitiateShutdown(),在dwShutdownFlags中传递SHUTDOWN_RESTART

hec6srdp

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

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);
    }
}

相关问题