微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Server 2012 R2上启动期间,服务在RPC调用中挂起

如何解决在Server 2012 R2上启动期间,服务在RPC调用中挂起

这是我在Server 2012 R2上运行的服务中的问题。

我分别安装了2014年4月更新汇总和2014年11月更新汇总进行了测试,这两种情况均发生。我的服务需要.NET 4.7.1,因此无法使用未打补丁的2012 R2进行测试。

它在Windows 10上不会发生。我尚未能够在Server 2016上进行测试,但我怀疑它可以在Windows 10上正常工作。

我的服务设置为“自动”启动。我在服务启动期间(将服务状态设置为CertCreateSelfSignCertificate之前,对SERVICE_RUNNING进行了调用,最终导致了RPC调用的无限期挂起:

ntdll.dll!NtAlpcSendWaitReceivePort()
rpcrt4.dll!LRPC_BASE_CCALL::SendReceive()
rpcrt4.dll!NdrpClientCall3()
rpcrt4.dll!NdrClientCall3()
rpcrt4.dll!ept_map_auth()
rpcrt4.dll!EP_LOOKUP_DATA::LookupNextChunk()
rpcrt4.dll!EP_LOOKUP_DATA::ResolveEndpoint()
rpcrt4.dll!ResolveEndpointWithEpMapper()
rpcrt4.dll!ResolveEndpointIfNecessary()
rpcrt4.dll!LRPC_BASE_BINDING_HANDLE::SubmitResolveEndpointRequest()
rpcrt4.dll!LRPC_BASE_BINDING_HANDLE::ResolveEndpoint()
rpcrt4.dll!LRPC_BASE_BINDING_HANDLE::DriveStateForward()
rpcrt4.dll!LRPC_FAST_BINDING_HANDLE::Bind()
rpcrt4.dll!RpcBindingBind()
ncryptprov.dll!KeyIsoServerBind()
ncryptprov.dll!SPCryptGetKeyproperty()
ncrypt.dll!NCryptOpenStorageProvider()
ncrypt.dll!NCryptTranslateHandle()
crypt32.dll!CryptSignCertificate()
crypt32.dll!CertCreateSelfSignCertificate()

手动启动服务或将其设置为“自动(延迟启动)”会导致其正确启动。我认为这意味着缺少依赖项,但是它已经依赖于Remote Procedure Call (RPC),而这又依赖于DCOM Server Process LauncherRPC Endpoint Mapper,这显然是要检查的依赖项。在调查该问题时,我还提供了Cryptographic Services服务,以防万一,但这并不能解决问题。

我寻找解决方案的尝试并未显示出任何有用的东西,大多数人在需要或Windows更新过程出现问题时忘记了依赖RPC。

Microsoft似乎已经their own version of this issue回到了Vista / Server 2008,但是他们的解决方案似乎一直在确保加密服务先于相关服务推出。如前所述,在我的案例中添加对加密服务的依赖性无法解决它。

服务控制管理器尝试启动HTTP.sys服务,然后在服务控制管理器数据库中放置一个锁。然后,HTTP.sys发出一个在启动过程中需要加密服务的调用。然后,发送请求以启动加密服务。但是,服务控制管理器数据库中已经有一个锁。因此,发生死锁。

有人知道这里可能发生什么或如何进一步诊断吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。