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

如何通过Azure Runbook与PowerShell在部署时将Azure VM加入Active Directory?

可行!不用ARM模板也能通过PowerShell Runbook把Azure VM加入AD域

当然可以做到!你完全可以跳过ARM模板,直接用PowerShell(推荐用Az模块替代旧的AzureRm模块,因为AzureRm已经被弃用不再更新)在Runbook里完成VM部署+域加入的全流程。下面是具体的实现思路和示例代码:

核心步骤拆解

    1. 部署基础VM资源(虚拟机、网络组件等)
    1. 配置VM加入Active Directory域的脚本逻辑
    1. 在Runbook中执行域加入操作(确保VM网络连通且权限充足)

示例代码实现

1. 先部署Azure VM(用Az模块)

替换成Az模块的命令来创建基础VM,示例如下:

# 初始化变量
$resourceGroupName = "你的资源组名称"
$vmName = "目标VM名称"
$location = "eastus"
$localAdminUsername = "本地管理员账号"
$localAdminPassword = ConvertTo-SecureString "本地管理员密码" -AsPlainText -Force
$localCredential = New-Object System.Management.Automation.PSCredential ($localAdminUsername, $localAdminPassword)
$vnetName = "现有VNet名称"
$subnetName = "现有子网名称"

# 获取子网对象
$subnet = Get-AzVirtualNetworkSubnetConfig -Name $subnetName -VirtualNetwork (Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroupName)

# 创建VM配置
$vmConfig = New-AzVMConfig -VMName $vmName -VMSize "Standard_D2s_v3" |
            Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $localCredential -ProvisionVMAgent -EnableAutoUpdate |
            Set-AzVMSourceImage -PublisherName "MicrosoftWindowsServer" -Offer "WindowsServer" -Skus "2019-Datacenter" -Version latest |
            Add-AzVMNetworkInterface -Id $subnet.Id

# 部署VM
New-AzVM -ResourceGroupName $resourceGroupName -Location $location -VM $vmConfig

2. 通过Custom Script Extension执行域加入脚本

这是最可靠的方式——Custom Script Extension会在VM启动后自动运行脚本,不需要Runbook直接连接VM,容错性更强:

# 准备域加入凭据(强烈建议从Azure Key Vault获取,避免明文存储)
$domainAdminUsername = "域管理员账号@你的域名.com"
$domainAdminPassword = ConvertTo-SecureString "域管理员密码" -AsPlainText -Force
$domainCredential = New-Object System.Management.Automation.PSCredential ($domainAdminUsername, $domainAdminPassword)
$domainName = "你的域名.com"

# 定义域加入的PowerShell脚本内容
$domainJoinScript = @"
`$domainCred = New-Object System.Management.Automation.PSCredential ("$($domainCredential.UserName)", (ConvertTo-SecureString "$($domainAdminPassword.GetNetworkCredential().Password)" -AsPlainText -Force))
Add-Computer -DomainName $domainName -Credential `$domainCred -Restart -Force
"@

# 给VM添加Custom Script Extension,传入脚本内容
Set-AzVMCustomScriptExtension -ResourceGroupName $resourceGroupName `
    -VMName $vmName `
    -Name "DomainJoinExtension" `
    -Location $location `
    -ScriptString $domainJoinScript `
    -Run "DomainJoin.ps1"

3. 关键注意事项

  • 权限要求:Runbook的服务主体需要拥有Virtual Machine Contributor权限来管理VM,同时需要有足够的AD权限(比如允许加入计算机到域的权限)。
  • 网络连通性:VM所在子网必须能访问域控制器——比如同VNet、VNet对等、VPN或ExpressRoute连通,否则域加入会直接失败。
  • 凭据安全:绝对不要在Runbook里明文写密码!建议用Azure Key Vault存储域管理员凭据,在Runbook中通过Get-AzKeyVaultSecret动态获取。
  • 模块版本:确保Runbook使用最新的Az模块,AzureRm模块已经停止维护,可能会出现兼容性问题。

备选方案:直接远程执行域加入命令

如果VM已经启动且WinRM连接正常,也可以在Runbook中直接远程执行命令:

# 等待VM完全启动(根据VM大小调整等待时间)
Start-Sleep -Seconds 150

# 远程执行域加入命令
Invoke-AzVMCommand -ResourceGroupName $resourceGroupName `
    -VMName $vmName `
    -Credential $localCredential `
    -ScriptBlock {
        param($domainName, $domainCred)
        Add-Computer -DomainName $domainName -Credential $domainCred -Restart -Force
    } `
    -ArgumentList $domainName, $domainCredential

不过这种方式依赖VM的WinRM服务正常工作,不如Custom Script Extension稳定,适合测试场景。

内容的提问来源于stack exchange,提问作者itye1970

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:08:01