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

如何基于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权限(用于查询用户信息)
  • 存储敏感变量:在Azure DevOps项目的「库」→「变量组」中添加机密变量:
    • ServicePrincipalId:服务主体的App ID
    • ServicePrincipalSecret:服务主体的密钥/密码
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:31:32