You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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参数:
    $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
    }
    
    注意:CredSSP会传递明文凭据,仅限可信环境使用。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:35:13