Windows InitiateShutdown失败,远程计算机出现RPC_S_服务器不可用错误
我正在尝试使用以下代码使用API重新启动远程计算机,但由于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
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
(per):D1
- 使用上面的“管理员”代码运行流程
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上似乎还没有安装。无需报告。