Windows InitiateShutdown失败,远程计算机出现RPC_S_服务器不可用错误

Windows InitiateShutdown失败,远程计算机出现RPC_S_服务器不可用错误,windows,winapi,remote-access,rpc,Windows,Winapi,Remote Access,Rpc,我正在尝试使用以下代码使用API重新启动远程计算机,但由于RPC_S_SERVER_不可用或1722错误代码而失败: //Process is running as administrator //Select a remote machine to reboot: //INFO: Tried it with and w/o two opening slashes. LPCTSTR pServerName = L"192.168.42.105"; //Or use 127.0.0.1 if y

我正在尝试使用以下代码使用API重新启动远程计算机,但由于
RPC_S_SERVER_不可用
1722
错误代码而失败:

//Process is running as administrator

//Select a remote machine to reboot:
//INFO: Tried it with and w/o two opening slashes.
LPCTSTR pServerName = L"192.168.42.105";
//Or use 127.0.0.1 if you don't have access to another machine on your network.
//This will attempt to reboot your local machine.
//In that case make sure to call shutdown /a /m \\127.0.0.1 to cancel it.

if(AdjustPrivilege(NULL, L"SeShutdownPrivilege", TRUE) &&
    AdjustPrivilege(pServerName, L"SeRemoteShutdownPrivilege", TRUE))
{
    int nErrorCode = ::InitiateShutdown(pServerName, NULL, 30,
                                        SHUTDOWN_INSTALL_UPDATES | SHUTDOWN_RESTART, 0);

    //Receive nErrorCode == 1722, or RPC_S_SERVER_UNAVAILABLE
}



BOOL AdjustPrivilege(LPCTSTR pStrMachine, LPCTSTR pPrivilegeName, BOOL bEnable)
{
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp;
    BOOL bRes = FALSE;

    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        return FALSE; 

    if(LookupPrivilegeValue(pStrMachine, pPrivilegeName, &tkp.Privileges[0].Luid))
    {
        tkp.PrivilegeCount = 1;  
        tkp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_REMOVED; 

        bRes = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
        int nOSError = GetLastError();
        if(bRes)
        {
            if(nOSError != ERROR_SUCCESS)
                bRes = FALSE;
        }
    }

    CloseHandle(hToken);

    return bRes;
}
因此,为了准备运行此代码,我在
这台
计算机上执行以下操作,这台计算机是
Windows 7 Pro
(就像我对Microsoft的工具所做的那样):

  • 运行以下“以管理员身份”以允许SMB访问
    192.168.42.105
    计算机上登录的用户
    D1
    (per):
  • 使用上面的“管理员”代码运行流程
然后在远程计算机上执行以下操作,或在具有Windows 7 Pro的远程计算机上执行
192.168.42.105
(per):

  • 控制面板,网络和共享中心,更改高级共享设置 “专用”启用“打开文件和打印机共享”

  • 设置以下键:

    HKEY\U本地\U机器\SOFTWARE\Microsoft\Windows\CurrentVersion\Policys\System

    LocalAccountTokenFilterPolicy=dword:1

  • 运行secpol.msc,然后转到本地安全策略、安全设置、本地策略、用户权限分配。将“所有人”添加到“从远程系统强制关机”。(请记住在完成测试后将其删除!)

请注意,以下
shutdown
命令似乎可以很好地重新启动远程计算机:

shutdown /r /m \\192.168.42.105 /t 30
我的代码遗漏了什么

编辑:

嗯。我承认,我只是对为什么
InitiateShutdown
似乎不“希望”使用远程服务器连接感兴趣,而
InitiateSystemShutdownEx
InitiateSystemShutdown
根本没有问题。(不幸的是,后两个没有
dwShutdownFlags
参数,我需要将
SHUTDOWN\u INSTALL\u UPDATES
标志传递给该参数,这导致了我的持久性…)

在这一点上,我没有别的办法找到,除了掸掉一份。。。我仍在努力挖掘,但到目前为止,这是我发现的

(A) 事实证明,
InitiateSystemShutdownEx
在内部使用了完全不同的RPC调用。如果没有太多详细信息,它将使用以下参数启动RPC绑定:

   ObjUuid = NULL
   ProtSeq = ncacn_np
   NetworkAddr = \\192.168.42.105
   EndPoint = \\PIPE\\InitShutdown
   Options = NULL
   ObjUuid = 765294ba-60bc-48b8-92e9-89fd77769d91
   ProtSeq = ncacn_ip_tcp
   NetworkAddr = 192.168.42.105
   EndPoint = NULL
   Options = NULL
或以下绑定字符串:

ncacn_np:\\\\192.168.42.105[\\PIPE\\InitShutdown]
ncacn_np:\\\\192.168.42.105[\\PIPE\\lsarpc]
(B) 另一方面,
InitiateShutdown
使用以下绑定参数:

   ObjUuid = NULL
   ProtSeq = ncacn_np
   NetworkAddr = \\192.168.42.105
   EndPoint = \\PIPE\\InitShutdown
   Options = NULL
   ObjUuid = 765294ba-60bc-48b8-92e9-89fd77769d91
   ProtSeq = ncacn_ip_tcp
   NetworkAddr = 192.168.42.105
   EndPoint = NULL
   Options = NULL
稍后将其转换为以下绑定字符串:

ncacn_np:\\\\192.168.42.105[\\PIPE\\InitShutdown]
ncacn_np:\\\\192.168.42.105[\\PIPE\\lsarpc]
它用于获取传递给的RPC句柄(似乎有其自身的):

因此,正如您所看到的,
InitiateShutdown
调用在技术上被视为
未知RPC服务
(对于UUID
{765294ba-60bc-48b8-92e9-89fd77769d91}
),这将导致服务器和客户端之间的一系列凭证检查:

老实说,我不确定是否要使用低级调试器进行调试:)


在这个阶段,我会说我对“本地安全机构”接口(或
\PIPE\lsarpc
命名管道配置)不是很熟悉。因此,如果有人知道服务器端缺少什么配置来允许此RPC调用通过,如果您能发表您对此的看法,我将不胜感激。

评论不适用于长时间的讨论;这段对话已经结束。我可以重现老年退休金计划的问题;InitiateShutdown不适用于远程计算机,即使是在域内。看起来像一个Windows bug。@HarryJohnston:我很好奇你是否能用它找到任何地方?我的Windows 10上似乎还没有安装。无需报告。