以编程方式关闭Winapi中的远程计算机

时间:2015-03-05 09:03:05

标签: c windows lan

假设我拥有所有必要的权限,我将如何关闭或重新启动位于同一LAN中的系统。

请参阅以下代码

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, 
                     &tokenHandle);

    LookupPrivilegeValue("Computer name", SE_REMOTE_SHUTDOWN_NAME, 
                         &tokenPrivileges.Privileges[0].Luid);

    tokenPrivileges.PrivilegeCount = 1;
    tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(tokenHandle, FALSE, &tokenPrivileges, 0, 
                         0, 0);

    switch(action)
    {
    default:
    case constEWXReboot:
    case constEWXRestartApps:
        if (!InitiateSystemShutdownEx("Computer name","Remote machine shutdown", 10, TRUE, TRUE, SHTDN_REASON_MAJOR_APPLICATION))
        {
            ErrGen(constErrCannotRestartSystem);
        }
        break;

我收到错误代码#53找不到网络路径。 请建议我在这里出错。

2 个答案:

答案 0 :(得分:4)

InitiateSystemShutdownEx win API函数将执行此操作。

  

启动指定计算机的关闭和可选重启,并可选择记录关闭的原因。

     

要关闭本地计算机,调用线程必须具有SE_SHUTDOWN_NAME权限。要关闭远程计算机,调用线程必须具有远程计算机上的SE_REMOTE_SHUTDOWN_NAME权限。默认情况下,用户可以在登录的计算机上启用SE_SHUTDOWN_NAME权限,管理员可以在远程计算机上启用SE_REMOTE_SHUTDOWN_NAME权限。

答案 1 :(得分:0)

您不需要使用API​​ - 只需拨打shutdown.exe即可调用system(),例如:

system("shutdown -r -f -t 00 -m \\\\computername");