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

如何在不关机的情况下从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:45:20