如何通过PowerShell批量查询Azure VM域加入状态并导出CSV
Azure环境批量排查未加域虚拟机PowerShell方案
前置依赖
- 本地已安装Az PowerShell模块,脚本执行前完成
Connect-AzAccount身份认证,账号需具备对应订阅的VM读取权限 - 所有待查询Windows VM已启用PowerShell Remoting,WSMAN配置正常,运行脚本的账号具备目标VM的远程管理权限
- 脚本会自动拉取全量Azure VM资产,支持导出全量资产域状态CSV,可直接筛选未加域设备用于后续批量域加入
可用脚本
脚本会遍历账号权限范围内所有订阅的VM,自动跳过关机、非Windows设备,对运行中Windows VM远程拉取OS层面的域信息,查询异常会单独标记不会中断执行:
# 登录Azure,已登录可注释跳过 Connect-AzAccount $vmReport = @() # 遍历所有可访问订阅 Get-AzSubscription | ForEach-Object { Set-AzContext -SubscriptionId $_.Id | Out-Null # 拉取订阅下所有VM及运行状态 $subVms = Get-AzVM -Status foreach ($vm in $subVms) { # 填充Azure平台侧基础信息 $vmEntry = [PSCustomObject]@{ SubscriptionName = $_.Name ResourceGroupName = $vm.ResourceGroupName AzureVmName = $vm.Name OsType = $vm.StorageProfile.OsDisk.OsType PowerState = $vm.PowerState PrivateIp = $null OsHostName = $null Domain = $null IsDomainJoined = $null Remark = $null } # 解析VM私网IP $nicId = $vm.NetworkProfile.NetworkInterfaces.Id | Select-Object -First 1 if ($nicId) { $nic = Get-AzNetworkInterface -Name $nicId.Split('/')[-1] -ResourceGroupName $vm.ResourceGroupName $vmEntry.PrivateIp = $nic.IpConfigurations | Where-Object PrivateIpAddress | Select-Object -ExpandProperty PrivateIpAddress -First 1 } # 仅查询运行中的Windows VM if ($vmEntry.OsType -eq 'Windows' -and $vmEntry.PowerState -eq 'VM running' -and $vmEntry.PrivateIp) { try { # 远程调用CIM查询域信息,对应单台本地执行的WMI查询逻辑 $osCimInfo = Invoke-Command -ComputerName $vmEntry.PrivateIp -ScriptBlock { Get-CimInstance -Namespace root\cimv2 -ClassName Win32_ComputerSystem | Select-Object Name, Domain, PartOfDomain } -ErrorAction Stop $vmEntry.OsHostName = $osCimInfo.Name $vmEntry.Domain = $osCimInfo.Domain $vmEntry.IsDomainJoined = $osCimInfo.PartOfDomain $vmEntry.Remark = "查询成功" } catch { $vmEntry.Remark = "查询失败:$($_.Exception.Message)" } } else { if ($vmEntry.OsType -ne 'Windows') { $vmEntry.Remark = "非Windows系统跳过" } elseif ($vmEntry.PowerState -ne 'VM running') { $vmEntry.Remark = "虚拟机关机跳过" } else { $vmEntry.Remark = "未解析到私网IP跳过" } } $vmReport += $vmEntry } } # 导出CSV结果 $exportCsvPath = ".\AzureVM_DomainCheck_Result_$(Get-Date -Format 'yyyyMMddHHmm').csv" $vmReport | Export-Csv -Path $exportCsvPath -NoTypeInformation -Encoding UTF8 # 控制台输出未加域VM清单 Write-Host "`n全量结果已导出至:$exportCsvPath" -ForegroundColor Green Write-Host "`n未加域运行中Windows VM清单:" -ForegroundColor Yellow $vmReport | Where-Object IsDomainJoined -eq $false | Select-Object AzureVmName, ResourceGroupName, PrivateIp, Domain | Format-Table -AutoSize
使用说明
- 导出的CSV中
IsDomainJoined值为False的条目,就是后续需要统一执行域加入的目标设备 - 远程查询失败的设备会在
Remark列记录具体报错,可单独排查网络连通性、权限、WinRM配置问题 - 若环境存在防火墙/NSG限制,需放通脚本运行主机到目标VM的5985、5986端口(WinRM默认端口)
- 若需扩展Linux VM的域加入状态查询,可自行在脚本中添加对应Linux SSH远程查询逻辑即可
内容的提问来源于stack exchange,提问作者Boboswae
相关产品推荐
相关产品推荐

