如何基于Azure DevOps Pipeline与服务主体为AVD主机池VM添加用户?
使用Azure DevOps Pipeline + 服务主体为AVD主机池添加用户
先修正你的PowerShell代码问题
原代码存在语法错误(if语句不完整),且无需在Pipeline内新建服务主体(应提前创建好并赋予对应权限,Pipeline直接复用),修正后的可复用脚本如下:
# 定义Pipeline传入的参数 param( [Parameter(Mandatory=$true)] [string]$TenantName, [Parameter(Mandatory=$true)] [string]$HostPoolName, [Parameter(Mandatory=$true)] [string]$HostPoolAppGroup, [Parameter(Mandatory=$true)] [string]$UserPrincipalName, [Parameter(Mandatory=$true)] [string]$ResourceGroupName, [Parameter(Mandatory=$true)] [string]$ServicePrincipalId, [Parameter(Mandatory=$true)] [string]$ServicePrincipalSecret, [Parameter(Mandatory=$true)] [string]$AadTenantId ) # 转换服务主体密码为安全字符串 $secureSecret = ConvertTo-SecureString $ServicePrincipalSecret -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential($ServicePrincipalId, $secureSecret) # 连接AVD服务 Add-RdsAccount -DeploymentUrl "https://rdbroker.wvd.microsoft.com" -Credential $creds -ServicePrincipal -AadTenantId $AadTenantId # 检查用户是否已在应用组,不存在则添加 $existingUser = Get-RdsAppGroupUser -TenantName $TenantName -HostPoolName $HostPoolName -AppGroupName $HostPoolAppGroup -UserPrincipalName $UserPrincipalName -ErrorAction SilentlyContinue if (-not $existingUser) { Add-RdsAppGroupUser -TenantName $TenantName -HostPoolName $HostPoolName -AppGroupName $HostPoolAppGroup -UserPrincipalName $UserPrincipalName Write-Host "用户 $UserPrincipalName 已成功添加到应用组" } else { Write-Host "用户 $UserPrincipalName 已存在于应用组中" } # 更新主机池为直接分配模式(个人主机池需此配置) Update-AzWvdHostPool -ResourceGroupName $ResourceGroupName -Name $HostPoolName -PersonalDesktopAssignmentType Direct # 分配Desktop Virtualization User角色 New-AzRoleAssignment -SignInName $UserPrincipalName -RoleDefinitionName "Desktop Virtualization User" -ResourceName $HostPoolName -ResourceGroupName $ResourceGroupName -ResourceType 'Microsoft.DesktopVirtualization/applicationGroups' -ErrorAction SilentlyContinue Write-Host "已为用户 $UserPrincipalName 分配Desktop Virtualization User角色"
搭建Azure DevOps Pipeline步骤
1. 前置准备
- 配置服务主体:在Azure AD中创建服务主体,分配以下权限:
- AVD主机池所在资源组的
Desktop Virtualization Contributor角色 - Azure AD的
Directory Readers权限(用于查询用户信息)
- AVD主机池所在资源组的
- 存储敏感变量:在Azure DevOps项目的「库」→「变量组」中添加机密变量:
ServicePrincipalId:服务主体的App IDServicePrincipalSecret:服务主体的密钥/密码AadTenantId:Azure AD租户ID
2. 创建YAML Pipeline
将修正后的脚本上传至代码仓库,新建如下YAML Pipeline:
trigger: none # 设为手动触发,可按需修改为分支触发 variables: - group: AVD-Variables # 引用上述创建的变量组 - name: TenantName value: "Test" # 替换为你的AVD租户名 - name: ResourceGroupName value: "your-rg-name" # 替换为资源组名称 - name: HostPoolName value: "your-hostpool-name" # 替换为主机池名称 - name: HostPoolAppGroup value: "Desktop Application Group" # 默认应用组名,按需修改 pool: vmImage: 'windows-latest' # 使用Windows代理,适配AzureAD/AVD模块 steps: - task: AzurePowerShell@5 displayName: '添加用户到AVD主机池' inputs: azureSubscription: '你的Azure服务连接' # 提前创建绑定服务主体的Azure服务连接 ScriptType: 'FilePath' ScriptPath: '$(System.DefaultWorkingDirectory)/Add-AvdUser.ps1' # 脚本在仓库中的路径 ScriptArguments: > -TenantName $(TenantName) -HostPoolName $(HostPoolName) -HostPoolAppGroup $(HostPoolAppGroup) -UserPrincipalName $(UserInputUser) -ResourceGroupName $(ResourceGroupName) -ServicePrincipalId $(ServicePrincipalId) -ServicePrincipalSecret $(ServicePrincipalSecret) -AadTenantId $(AadTenantId) azurePowerShellVersion: 'LatestVersion' - task: PowerShell@2 displayName: '验证用户添加结果' inputs: targetType: 'inline' script: | $secureSecret = ConvertTo-SecureString $(ServicePrincipalSecret) -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential($(ServicePrincipalId), $secureSecret) Add-RdsAccount -DeploymentUrl "https://rdbroker.wvd.microsoft.com" -Credential $creds -ServicePrincipal -AadTenantId $(AadTenantId) Get-RdsAppGroupUser -TenantName $(TenantName) -HostPoolName $(HostPoolName) -AppGroupName $(HostPoolAppGroup) -UserPrincipalName $(UserInputUser)
3. 添加手动输入参数
在Pipeline的「运行参数」中添加字符串参数UserInputUser,用于触发Pipeline时输入要添加的用户UPN(格式如user@domain.com)。
4. 预装必要模块(可选)
若代理未预装依赖模块,可在Pipeline开头添加安装步骤:
Install-Module -Name AzureAD -Force -AllowClobber Install-Module -Name Az.DesktopVirtualization -Force -AllowClobber
注意事项
- 确保服务主体权限足够,否则会抛出权限不足错误
- 个人主机池需设置
PersonalDesktopAssignmentType为Direct,用户才会自动分配到可用VM - 输入的用户UPN必须在Azure AD中存在
内容的提问来源于stack exchange,提问作者Roni
相关产品推荐
相关产品推荐

