在 powershell 中禁用卷影复制检测

问题描述 投票:0回答:2

我正在寻找 Powershell 中的脚本,其中列出了有关 Windows Server 2016 上的 VSS 卷影复制的信息。我需要检测特定卷上的卷影复制是启用还是禁用。

在 GUI 中(此电脑 > 右键单击 (C:) > 配置卷影副本),您可以禁用或启用每个卷的卷影副本。您可以在附件图像中看到“音量”和“下次运行时间”(“时间”或“禁用”状态)。

我在 powerhsell 中寻找 stript 来列出我可以在 GUI 中看到的信息?

我已经尝试过

vssadmin list volumes
Get-CimInstance Win32_ShadowCopy
但我需要检测特定卷上的 VSS 是否已启用或禁用。

请问有人知道这个问题吗?

感谢您的回答和帮助!

powershell window windows-server shadow-copy vssettings
2个回答
0
投票

我之前编写了一个脚本来执行此操作,我发现我需要使用

vssadmin list shadowstorage
Get-ScheduledTask
的组合才能提取我需要的所有信息。

这是我之前想到的(这是一项紧急工作,我再也没有回去过,所以可以做一些整理和一些错误检查,但它应该让你走上正确的道路):

$configuration = vssadmin list shadowstorage

Add-Type -TypeDefinition @' 
namespace ScheduledTasks
{ 
    [System.Flags]
    public enum DaysOfWeek 
    { 
        Sunday = 1, 
        Monday = 2, 
        Tuesday = 4, 
        Wednesday = 8, 
        Thursday = 16, 
        Friday = 32, 
        Saturday = 64 
    } 
} 
'@

Function Get-Days($flags)
{
    $days = @()
    if (($flags -band [ScheduledTasks.DaysOfWeek]::Monday) -ne 0)
    {
        $days += "Monday";
    }

    if (($flags -band [ScheduledTasks.DaysOfWeek]::Tuesday) -ne 0)
    {
        $days += "Tuesday";
    }

    if (($flags -band [ScheduledTasks.DaysOfWeek]::Wednesday) -ne 0)
    {
        $days += "Wednesday";
    }

    if (($flags -band [ScheduledTasks.DaysOfWeek]::Thursday) -ne 0)
    {
        $days += "Thursday";
    }

    if (($flags -band [ScheduledTasks.DaysOfWeek]::Friday) -ne 0)
    {
        $days += "Friday";
    }

    if (($flags -band [ScheduledTasks.DaysOfWeek]::Saturday) -ne 0)
    {
        $days += "Saturday";
    }

    if (($flags -band [ScheduledTasks.DaysOfWeek]::Sunday) -ne 0)
    {
        $days += "Sunday";
    }
    
    return $days -join ",";
}

$count = 0;
foreach ($line in $configuration)
{
  if ($line.StartsWith("Shadow Copy Storage association"))
  {
      $DriveLetter = $($configuration[$count + 1]).Trim()
      $DriveLetter = $DriveLetter.Substring($DriveLetter.IndexOf('(') + 1, 2)

      $VSSDriveLetter = $($configuration[$count + 2]).Trim()
      $VSSDriveLetter = $VSSDriveLetter.Substring($VSSDriveLetter.IndexOf('(') + 1, 2)

      $UsedSpace = $($configuration[$count + 3]).Trim()
      $UsedSpace = $UsedSpace.Substring($UsedSpace.IndexOf(':') + 2)

      $AllocatedSpace = $($configuration[$count + 4]).Trim()
      $AllocatedSpace = $AllocatedSpace.Substring($AllocatedSpace.IndexOf(':') + 2)

      $MaxSpace = $($configuration[$count + 5]).Trim()
      $MaxSpace = $MaxSpace.Substring($MaxSpace.IndexOf(':') + 2)

      $VolumeID =  $($configuration[$count + 1]).Trim()
      $VolumeID = $VolumeID.Substring($VolumeID.IndexOf('{'), 38)

      $Enabled = $false;
      $Triggers = @();
      $Task = Get-ScheduledTask -TaskName "ShadowCopyVolume$($VolumeID)" -ea SilentlyContinue
      if ($Task -ne $null)
      {
        $TaskInfo = $Task | Get-ScheduledTaskInfo
        $Enabled = $Task.State -ne "Disabled";
        foreach ($Trigger in $Task.Triggers)
        {
            $object = New-Object -typeName PSObject
            $object | Add-Member -Type NoteProperty -Name "Start" -Value ([DateTime]::Parse($Trigger.StartBoundary))
            $object | Add-Member -Type NoteProperty -Name "End" -Value $(if ($Trigger.EndBoundary) {[DateTime]::Parse($Trigger.EndBoundary) } else { "" })
            $object | Add-Member -Type NoteProperty -Name "Days" -Value (Get-Days -flag $Trigger.DaysOfWeek)
            $object | Add-Member -Type NoteProperty -Name "WeeksInterval" -Value $Trigger.WeeksInterval
            $object | Add-Member -Type NoteProperty -Name "LastRunTime" -Value $TaskInfo.LastRunTime
            $object | Add-Member -Type NoteProperty -Name "NextRunTime" -Value $TaskInfo.NextRunTime
            $Triggers += $object
        }
      }

      $object = New-Object -TypeName PSObject
      $object | Add-Member -Type NoteProperty -Name "Source" -Value $DriveLetter
      $object | Add-Member -Type NoteProperty -Name "Destination" -Value $VSSDriveLetter
      $object | Add-Member -Type NoteProperty -Name "UsedSpace" -Value $UsedSpace
      $object | Add-Member -Type NoteProperty -Name "AllocatedSpace" -Value $AllocatedSpace
      $object | Add-Member -Type NoteProperty -Name "MaximumSpace" -Value $MaxSpace
      $object | Add-Member -Type NoteProperty -Name "Enabled" -Value $Enabled
      $object | Add-Member -Type NoteProperty -Name "Triggers" -Value $Triggers

      Write-Output $object
  }

  $count++;
}

此脚本将以下信息输出为使用

Where-Object
Select-Object
等进行过滤的 PSObjects...


0
投票

我有同样的任务,但系统语言不是英语。 所以我决定使用另一种方法——检查“vssadmin listshadowstorage”命令的响应模板。如果未找到模板,则不会为该驱动器启用卷影存储。 但如果磁盘有 10% 的可用空间,此代码也会启用影子存储。

get-volume | ForEach-Object {
    $DriveLetter=$_.DriveLetter
    if ($DriveLetter -notlike "") {
        $DriveLetter=$DriveLetter+":"
        $ShadowStorage=$(vssadmin list shadowstorage /On="$DriveLetter" | Select-String -Pattern '(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})')
        if ($ShadowStorage -eq $null){
            $AllowSpace=$_.Size
            $FreeSpace=$_.SizeRemaining
            $SizeForRecovery=10 #percent
            $HaveFreeSpace=($AllowSpace/$SizeForRecovery) -lt $FreeSpace
            if ($HaveFreeSpace) {
                try{
                    enable-computerrestore -drive $($DriveLetter+"\")
                    vssadmin Resize ShadowStorage /For=$DriveLetter /On=$DriveLetter /Maxsize=$("$SizeForRecovery"+"%")
                }
                catch{
                    Write-Host("Enable shadow storage for drive $DriveLetter - FAILED")
                }
                finally{
                    Write-Host("Enable shadow storage for drive $DriveLetter - SUCCESFULLY")
                }
            }
        } else {
            Write-Host("For drive $DriveLetter shadow storage is already enabled")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.