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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:27:13