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

如何查询多台服务器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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:12:15