如何在不关机的情况下从AVD卸载并删除VHDX应用?
问题描述
我正在编写一个.NET项目,用于在Azure Virtual Desktop(AVD)中实现VHDX应用的应用附加,同时需要取消发布或移除AVD实例中的同一应用。我知道流程是先从主机池和应用组中移除应用,再从对应的文件共享容器中删除VHDX文件。
我使用以下PowerShell命令完成前序步骤:
$applicationGroup = "AG" $resoureGroupName = "RG" $hostPoolName = "HG" $applicationName = "AN" Get-AzWvdApplication -ApplicationGroupName $applicationGroup -ResourceGroupName $resoureGroupName Remove-AzWvdMsixPackage -FullName $applicationName -HostPoolName $hostPoolName -ResourceGroupName $resoureGroupName Get-AzWvdApplication -ApplicationGroupName $applicationGroup -ResourceGroupName $resoureGroupName Remove-AzWvdApplication -ApplicationGroupName $applicationGroup -Name $applicationName -ResourceGroupName $resoureGroupName
这些命令可正常执行,但从文件共享删除VHDX文件时遇到错误,只有关闭所有VM后才能成功删除。我使用Azure.Storage.Files NuGet包处理文件共享操作(已获取对应连接字符串),错误原因是链接该文件共享的运行中VM对VHDX文件存在虚拟锁定。
我的需求:如何在不关闭VM的情况下完成上述操作(我不知道哪个VM安装了该应用)?或者有没有更简便的方法彻底分离VHDX?
解决方案
1. 定位锁定VHDX的VM
先通过PowerShell找出主机池中挂载了目标VHDX的VM:
$hostPoolName = "HG" $resourceGroupName = "RG" $vhdxFileName = "你的VHDX文件名.vhdx" # 获取主机池中的所有会话主机 $sessionHosts = Get-AzWvdSessionHost -HostPoolName $hostPoolName -ResourceGroupName $resourceGroupName foreach ($host in $sessionHosts) { # 远程到VM检查挂载的VHDX $result = Invoke-Command -ComputerName $host.Name.Split('/')[-1] -ScriptBlock { param($vhdxName) Get-DiskImage | Where-Object { $_.ImagePath -like "*$vhdxName*" } } -ArgumentList $vhdxFileName if ($result) { Write-Host "VHDX文件被VM $($host.Name.Split('/')[-1]) 锁定" } }
2. 在目标VM上卸载VHDX
找到锁定的VM后,远程执行卸载命令:
Invoke-Command -ComputerName "目标VM名称" -ScriptBlock { param($vhdxName) $diskImage = Get-DiskImage | Where-Object { $_.ImagePath -like "*$vhdxName*" } if ($diskImage) { Dismount-DiskImage -ImagePath $diskImage.ImagePath } } -ArgumentList $vhdxFileName
3. 整合到.NET项目的自动化流程
如果要在.NET中实现,可以通过以下方式整合:
- 使用Azure SDK调用
Get-AzWvdSessionHost接口获取主机池内所有VM - 通过.NET的PowerShell调用模块,对每个VM执行远程检查与卸载命令
- 确认所有VM都已卸载VHDX后,使用Azure.Storage.Files SDK删除目标文件
4. 替代方案:依赖AVD内置清理机制
如果使用的是MSIX应用附加模式,可尝试:
- 确保已完全移除
MsixPackage和对应Application资源 - 等待5-10分钟,让AVD服务自动触发VM上的应用清理
- 之后再尝试删除VHDX文件
内容的提问来源于stack exchange,提问作者ArnabSaha
相关产品推荐
相关产品推荐

