如何通过PowerShell脚本批量获取多台远程IIS服务器的站点与绑定信息?
解决多台IIS服务器站点绑定信息批量获取问题
你的问题很典型——你只是循环了服务器名称,但核心的Get-Website命令依然在本地执行,根本没跑到远程服务器上,所以CSV里全是本地数据。要实现跨服务器批量采集,得用PowerShell的远程执行能力,也就是Invoke-Command。
完整修正脚本
# 读取服务器列表 $servers = Get-Content "C:\path\to\your\results.txt" # 初始化结果数组 $allResults = @() # 遍历每台服务器,远程执行采集逻辑 foreach ($vm in $servers) { Write-Host "正在采集服务器 $vm 的数据..." try { # 远程执行IIS站点采集脚本 $serverResults = Invoke-Command -ComputerName $vm -ScriptBlock { # 在远程服务器上执行获取站点信息的逻辑 foreach ($Site in Get-Website) { foreach ($Bind in $Site.Bindings.Collection) { [pscustomobject]@{ ServerName = $env:COMPUTERNAME # 直接取远程服务器的计算机名,更准确 SiteName = $Site.Name Protocol = $Bind.Protocol BindingInfo = $Bind.BindingInformation PhysicalPath = $Site.PhysicalPath } } } } -ErrorAction Stop # 将当前服务器的结果加入总数组 $allResults += $serverResults } catch { Write-Warning "服务器 $vm 采集失败:$($_.Exception.Message)" } } # 将所有结果导出到CSV $allResults | Export-Csv -Path "C:\results\all_iis_sites.csv" -NoTypeInformation -Encoding UTF8 Write-Host "采集完成,结果已导出到指定路径"
关键说明
- 远程执行核心:
Invoke-Command会把-ScriptBlock里的代码发送到目标服务器上运行,这样Get-Website才是真正在远程IIS服务器上执行,拿到的是目标服务器的站点数据。 - 服务器名称准确性:用
$env:COMPUTERNAME直接获取远程服务器的计算机名,比传递本地变量$vm更可靠,避免变量作用域问题。 - 错误处理:加入
try/catch块可以捕获连接失败或权限问题,避免脚本中途崩溃,还能给出明确的错误提示。 - 编码问题:导出CSV时指定
-Encoding UTF8,避免中文乱码(如果你的站点名称或路径有中文的话)。
前置准备
确保所有目标服务器开启了PowerShell远程(WinRM):
- 如果没开启,你可以远程执行开启命令:
Invoke-Command -ComputerName $vm -ScriptBlock { Enable-PSRemoting -Force } -Credential (Get-Credential) - 因为你有域管理员权限,默认Kerberos认证会自动生效,不需要额外输入凭证(除非服务器有特殊配置)。
- 运行脚本的PowerShell窗口需要以管理员身份打开,否则可能无法建立远程连接。
内容的提问来源于stack exchange,提问作者svb2
相关产品推荐
相关产品推荐

