通过PowerShell配置主DNS服务器设置的问题求助
主DNS地址配置脚本问题解决
问题背景
我正在编写脚本配置主DNS服务器设置,环境包含Windows Server 2016、2019、2022R2混合操作系统,机器既有域加入的也有工作组的,大多配备2块网卡。仅需修改主DNS地址,但尝试以下脚本未成功:
原脚本
$wmi = Get-WMIObject Win32_NetworkAdapterConfiguration -computername localhost | where { $_.IPEnabled -eq "TRUE" -and $_.DNSServerSearchOrder -ne $null } $dns1 = "101.61.241.311" $wmi.SetDNSServerSearchOrder("$dns1")
执行输出
__GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : ReturnValue : 70 PSComputerName :
网卡接口信息示例
PSComputerName : server01 DHCPLeaseExpires : Index : 10 Description : vmxnet3 Ethernet Adapter DHCPEnabled : False DHCPLeaseObtained : DHCPServer : DNSDomain : DNSDomainSuffixSearchOrder : {contoso.local} DNSEnabledForWINSResolution : False DNSHostName : server01 DNSServerSearchOrder : {192.168.0.1, 192.168.0.2} DomainDNSRegistrationEnabled : False FullDNSRegistrationEnabled : True IPAddress : {192.168.0.8, fe80::cc2f:c777:11f4:4bbb} IPConnectionMetric : 5 IPEnabled : True IPFilterSecurityEnabled : False WINSEnableLMHostsLookup : True
问题分析
- 返回值70含义:通常代表权限不足,需以管理员身份运行PowerShell;另外你提供的DNS地址
101.61.241.311无效(IP地址段最大为255),这也会导致设置失败。 - 参数格式错误:
SetDNSServerSearchOrder需要传入数组类型参数,原脚本传入的是字符串,不符合要求。 - 批量操作问题:当存在多个网卡时,直接对集合调用方法可能失败,需逐个处理网卡。
- WMI cmdlet弃用:
Get-WMIObject已被微软弃用,建议使用更兼容新系统的Get-CimInstance。
修正后的脚本
场景1:替换主DNS,保留原有备用DNS
# 获取启用IP的网卡配置 $adapters = Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = TRUE" | Where-Object { $_.DNSServerSearchOrder -ne $null } # 注意:请替换为有效的DNS地址 $newPrimaryDNS = "101.61.241.111" foreach ($adapter in $adapters) { # 保留原有备用DNS,仅替换第一个(主)DNS $dnsServers = $adapter.DNSServerSearchOrder $dnsServers[0] = $newPrimaryDNS # 应用配置 $result = $adapter | Invoke-CimMethod -MethodName SetDNSServerSearchOrder -Arguments @{DNSServerSearchOrder = $dnsServers} Write-Host "网卡 [$($adapter.Description)] 设置结果:返回值 $($result.ReturnValue)" }
场景2:仅设置主DNS,清空备用DNS
$adapters = Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = TRUE" $newPrimaryDNS = "101.61.241.111" foreach ($adapter in $adapters) { $result = $adapter | Invoke-CimMethod -MethodName SetDNSServerSearchOrder -Arguments @{DNSServerSearchOrder = @($newPrimaryDNS)} Write-Host "网卡 [$($adapter.Description)] 设置结果:返回值 $($result.ReturnValue)" }
关键注意事项
- 必须以管理员身份运行PowerShell,否则会出现权限不足(返回值70)。
- 确保DNS地址格式正确,避免使用如
101.61.241.311这类无效IP。 - 域加入的机器可能受组策略管控,若组策略强制指定DNS,手动修改会被覆盖,需先调整组策略。
- 多网卡环境下,脚本会对所有启用IP的网卡生效,若需指定特定网卡,可通过
Description或Index筛选,例如:$adapters = Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = TRUE" | Where-Object { $_.Description -like "*vmxnet3*" }
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

