如何查询多台服务器DNS服务器并导出至CSV(解决权限报错)
问题描述
我尝试查询多台服务器的DNS服务器信息并导出到电子表格,但单台执行以下命令时遇到访问被拒绝错误:
Get-DnsClientServerAddress -CimSession server-name -InterfaceAlias ethernet -AddressFamily IPv4 | ForEach-Object ServerAddresses
错误信息:
Get-DnsClientServerAddress: server-name: Cannot connect to CIM server. Access is denied.
我打算用Invoke-VMScript来实现,需要生成符合以下格式的可读CSV输出:
SERVER NAME DNS SERVERS server-1 10.0.0.1 server-1 10.0.0.2 server-2 10.0.0.1
请问怎么修改我现有的查询服务的代码,来获取DNS服务器信息并导出到CSV?现有代码如下:
$user = 'domain\username' $pwd = 'password' | ConvertTo-SecureString -Force -AsPlainText $credential = New-Object System.Management.Automation.PsCredential($user, $pwd) $code = @' $obj = New-object PSObject -Property @{ Name = 'Service does not exist' Status = 'Not Installed' } $service = Get-Service -Name SERVICE -ErrorAction SilentlyContinue if($service) { $obj.Name = $service.Name $obj.Status = $service.Status } $obj | ConvertTo-Csv '@ Get-VM -Name (Get-Content -Path "C:\folder\server-list.txt") -PipelineVariable vm | ForEach-Object -Process { $o = Invoke-VMScript -VM $vm -ScriptText $code -ScriptType Powershell -GuestCredential $credential $o.ScriptOutput | ConvertFrom-Csv | Select-Object -Property @{N = 'VM'; E = { $vm.Name } }, Name, Status } | Export-Csv -Path "C:\folder\server-results.csv" -NoTypeInformation -UseCulture
解决方案
直接修改代码中的查询逻辑,替换为获取DNS服务器信息的逻辑,调整后代码如下:
$user = 'domain\username' $pwd = 'password' | ConvertTo-SecureString -Force -AsPlainText $credential = New-Object System.Management.Automation.PsCredential($user, $pwd) # 替换为DNS服务器查询逻辑 $code = @' # 获取指定网卡的IPv4 DNS服务器地址 $dnsServers = Get-DnsClientServerAddress -InterfaceAlias ethernet -AddressFamily IPv4 -ErrorAction SilentlyContinue | ForEach-Object { $_.ServerAddresses } # 处理无DNS配置的情况 if (-not $dnsServers) { [PSCustomObject]@{ 'DNS SERVERS' = '未配置DNS服务器' } } else { # 每个DNS地址生成一条独立记录 $dnsServers | ForEach-Object { [PSCustomObject]@{ 'DNS SERVERS' = $_ } } } | ConvertTo-Csv -NoTypeInformation '@ Get-VM -Name (Get-Content -Path "C:\folder\server-list.txt") -PipelineVariable vm | ForEach-Object -Process { $o = Invoke-VMScript -VM $vm -ScriptText $code -ScriptType Powershell -GuestCredential $credential # 转换CSV并添加服务器名称字段 $o.ScriptOutput | ConvertFrom-Csv | Select-Object -Property @{N = 'SERVER NAME'; E = { $vm.Name } }, 'DNS SERVERS' } | Export-Csv -Path "C:\folder\dns-results.csv" -NoTypeInformation -UseCulture
关键修改点
- 替换核心查询逻辑:将原有的服务查询代码替换为
Get-DnsClientServerAddress,获取指定网卡(ethernet)的IPv4 DNS地址,每个地址生成独立对象,确保输出格式符合要求。 - 空值处理:如果服务器未配置DNS或网卡名称不匹配,生成
未配置DNS服务器的占位记录,避免遗漏服务器信息。 - 字段调整:将原
VM字段重命名为SERVER NAME,匹配期望的表头,只保留DNS SERVERS字段。 - 输出文件名:修改导出文件名为
dns-results.csv,便于区分不同查询结果。
内容的提问来源于stack exchange,提问作者user2623974
相关产品推荐
相关产品推荐

