如何用PowerShell检测WinServer2016指定卷VSS影子副本状态
Windows Server 2016 VSS影子副本状态检测PowerShell方案
实现逻辑说明
GUI界面(此电脑 > 右键目标卷 > 配置影子副本)展示的卷级VSS启用状态、下次运行时间,无法通过两类常用接口获取:
vssadmin list volumes:仅枚举支持承载影子副本的卷列表,不返回配置状态Get-CimInstance Win32_ShadowCopy:仅查询已生成的历史影子副本实例,不读取卷级启用配置
上述两类配置实际存储在root\Microsoft\Windows\ShadowCopyWMI命名空间的卷配置类,以及绑定到对应卷的VSS计划任务中,脚本直接读取这两类数据源,输出结果与GUI展示完全对齐。
完整脚本
脚本需以管理员权限运行,输出字段包含「卷」「下次运行时间」「启用状态」,和GUI字段一一对应:
#Requires -RunAsAdministrator function Get-VssVolumeStatus { # 枚举本地固定NTFS卷 $volumes = Get-CimInstance -ClassName Win32_Volume | Where-Object { $_.DriveType -eq 3 -and $_.FileSystem -eq 'NTFS' -and $_.DriveLetter } # 读取VSS卷级启用配置 $shadowVolumeConfigs = Get-CimInstance -Namespace root\Microsoft\Windows\ShadowCopy -ClassName Win32_ShadowVolume -ErrorAction SilentlyContinue # 枚举所有VSS关联计划任务 $vssScheduledTasks = Get-ScheduledTask | Where-Object TaskName -match '^ShadowCopyVolume' foreach ($vol in $volumes) { $drivePath = $vol.DriveLetter + '\' $currentVolConfig = $shadowVolumeConfigs | Where-Object Volume -eq $vol.DeviceID $nextRunTime = 'Disabled' $enableStatus = '已禁用' if ($currentVolConfig.Enabled -eq $true) { # 匹配当前卷绑定的VSS计划任务 $volGuid = $vol.DeviceID.TrimStart('\\?\Volume').TrimEnd('\') $matchedTask = $vssScheduledTasks | Where-Object TaskName -match [regex]::Escape($volGuid) if ($matchedTask) { $taskRuntimeInfo = $matchedTask | Get-ScheduledTaskInfo if ($taskRuntimeInfo.NextRunTime) { $nextRunTime = $taskRuntimeInfo.NextRunTime.ToString('yyyy/MM/dd HH:mm:ss') $enableStatus = '已启用' } } } [PSCustomObject]@{ 卷 = $drivePath 下次运行时间 = $nextRunTime 启用状态 = $enableStatus } } } # 执行输出所有卷的VSS配置 Get-VssVolumeStatus
使用说明
- 直接在PowerShell管理员会话中运行脚本,即可输出所有本地固定NTFS卷的VSS配置,结果和GUI展示完全一致
- 如需查询指定卷(例如C盘),可将最后一行执行语句替换为
Get-VssVolumeStatus | Where-Object 卷 -eq 'C:\' - 未配置运行计划、已禁用VSS的卷,「下次运行时间」字段统一返回
Disabled,和GUI展示逻辑完全匹配
内容的提问来源于stack exchange,提问作者user17200221
相关产品推荐
相关产品推荐

