通过Invoke-Command执行Add-DnsServerResourceRecordCName时抛出CimException
DNS记录添加权限问题排查
问题描述
使用PowerShell的Invoke-Command以mydomain\svc_dns身份在本地会话执行Add-DnsServerResourceRecordCName命令时,抛出权限拒绝错误,但直接用该用户登录系统(非管理员提示符)执行相同命令却能正常完成。
执行代码
$zonename = "mydomain.ca" $username = 'mydomain\svc_dns' $dnsserver = 'dns.mydomain.ca' $password = 'password' $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword) Invoke-Command -ComputerName localhost -Credential $credential -ScriptBlock { write-host $Using:zonename Write-Host $Env:UserDomain $Env:UserName $(whoami) write-host $Using:dnsserver Add-DnsServerResourceRecordCName -Name $Using:workspace -HostNameAlias $Using:webserver -ZoneName $Using:zonename -ComputerName $Using:dnsserver }
错误信息
Failed to get the zone information for mydomain.ca on server dns.mydomain.ca. + CategoryInfo : PermissionDenied: (abc0001y:root/Microsoft/...urceRecordCName) [Add-DnsServerResourceRecordCName], CimException + FullyQualifiedErrorId : WIN32 5,Add-DnsServerResourceRecordCName + PSComputerName : localhost
排查方向与解决方法
1. 确认Kerberos双跳问题
你认为不存在二次跳转权限问题,但实际场景中,Invoke-Command远程到localhost后,会话内访问dns.mydomain.ca属于双跳场景:本地主机到localhost是第一跳,localhost到DNS服务器是第二跳。Kerberos默认不允许凭据跨多跳传递,直接登录时是单跳访问DNS服务器,所以权限正常。
2. 使用CredSSP解决凭据传递
CredSSP允许将凭据直接传递到远程主机,解决双跳问题,操作步骤如下:
- 首先以管理员权限执行一次客户端配置(只需执行一次):
Enable-WSManCredSSP -Role Client -DelegateComputer "localhost" - 修改原命令,添加
-Authentication Credssp参数:
注意:CredSSP会传递明文凭据,仅限可信环境使用。$zonename = "mydomain.ca" $username = 'mydomain\svc_dns' $dnsserver = 'dns.mydomain.ca' $password = 'password' $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword) Invoke-Command -ComputerName localhost -Credential $credential -Authentication Credssp -ScriptBlock { Write-Host "当前会话用户: $(whoami)" Write-Host "目标区域: $Using:zonename" Write-Host "DNS服务器: $Using:dnsserver" Add-DnsServerResourceRecordCName -Name $Using:workspace -HostNameAlias $Using:webserver -ZoneName $Using:zonename -ComputerName $Using:dnsserver }
3. 更安全的约束委派方案
如果不想用CredSSP,可以配置Kerberos约束委派:
- 在AD中找到
svc_dns用户账户,开启“信任此用户用于委派到指定服务”,添加DNS服务器的DNS服务(SPN为DNS/dns.mydomain.ca)。 - 确保DNS服务器的DNS服务允许该用户委派访问。
4. 验证会话权限上下文
在脚本块中添加测试命令,确认会话能否正常访问DNS服务器:
Invoke-Command -ComputerName localhost -Credential $credential -ScriptBlock { # 测试DNS服务器的WMI访问 Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Using:dnsserver # 测试DNS区域访问 Get-DnsServerZone -Name $Using:zonename -ComputerName $Using:dnsserver }
如果这些命令也报错,说明确实是凭据传递问题;如果能正常执行,再检查Add-DnsServerResourceRecordCName的参数是否有误(比如$Using:workspace变量是否正确)。
内容的提问来源于stack exchange,提问作者J. Diefenbaker
相关产品推荐
相关产品推荐

