跨域PowerShell远程执行DCDIAG RIDManager测试:PDC通过SDC失败(错误5)
dcdiag /test:RIDManager时SDC测试失败的问题 先明确你的场景:在域控制器本地运行dcdiag /test:RIDManager测试全部通过,但通过跨域PowerShell远程会话执行时,主域控制器(PDC)测试正常,辅助域控制器(SDC)却抛出DsBindWithSpnEx() failed with error 5, Access is denied.的权限错误。你使用的命令大致如下:
$testSession= New-PSSession -ComputerName <hostname> -Credential (Get-Credential) Invoke-Command -Session $testSession -ScriptBlock {dcdiag /test:RIDManager}
结合AD和PowerShell远程的工作机制,这个问题基本围绕权限传递和跨域身份验证展开,下面是具体的原因分析和解决办法:
1. 远程会话的凭据权限不足
dcdiag /test:RIDManager测试需要账号具备读取和验证AD RID池配置的权限,通常要求是目标域的域管理员,或者至少属于Enterprise Admins组。跨域场景下,如果你的凭据是源域账号,即使在源域是管理员,目标域的信任配置可能没有赋予该账号足够权限访问SDC的RID服务。
解决办法:
- 改用目标域的域管理员账号作为远程会话凭据,或者确保你使用的账号被添加到目标域的Enterprise Admins组中。
- 检查跨域信任关系是否为双向可传递信任,如果是单向信任,源域账号的权限无法传递到目标域,自然会被拒绝访问。
2. PowerShell远程的身份验证方式限制
默认情况下,PowerShell远程(WinRM)使用Kerberos身份验证,但跨域场景下会遇到双跳权限限制——也就是远程会话中的命令无法再以你的身份访问另一台域控制器(SDC)的资源。这就是为什么PDC测试通过(会话直接连到PDC本地),但SDC测试失败的核心原因之一。
解决办法:
使用CredSSP身份验证绕过双跳限制(注意:CredSSP会将凭据传递到远程机器,仅在可信环境中使用):
- 在发起远程会话的本地机器上启用CredSSP客户端:
Enable-WSManCredSSP -Role Client -DelegateComputer <目标域控制器的FQDN>
- 在目标域控制器上启用CredSSP服务端:
Enable-WSManCredSSP -Role Server
- 重新创建远程会话时指定身份验证方式:
$testSession= New-PSSession -ComputerName <hostname> -Credential (Get-Credential) -Authentication CredSSP Invoke-Command -Session $testSession -ScriptBlock {dcdiag /test:RIDManager}
3. SDC的服务或权限配置问题
虽然本地执行正常,但远程执行时,WinRM的运行上下文(默认是Local System)可能没有权限访问SDC的RID相关服务或AD对象,或者SDC的必要服务未启动。
解决办法:
- 检查SDC上的
Remote Registry服务是否已启动并设置为自动,dcdiag需要读取远程注册表中的RID配置信息。 - 在AD用户和计算机中,检查SDC的计算机账号是否具备访问AD RID池容器(
CN=RID Manager$,CN=System,<域名>)的权限,必要时手动赋予读取权限。
4. Kerberos票据缓存问题
跨域场景下,本地机器的Kerberos票据可能存在过期或无效的情况,导致远程会话无法正确获取访问SDC的票据。
解决办法:
在发起远程会话的机器上清除现有Kerberos票据,重新获取:
klist purge
之后重新创建PowerShell会话,再执行测试命令。
内容的提问来源于stack exchange,提问作者Abishek

