Скрипт мониторинга теневого копирования тома - PullRequest
1 голос
/ 08 июля 2020

Я новичок в Powershell и пытаюсь написать скрипт Powershell, который я могу использовать для отслеживания статуса VSS на наших серверах с помощью инструмента RMM. На данный момент у меня есть:

# List all Volumes
$Volumes = gwmi Win32_Volume -Property SystemName,DriveLetter,DeviceID,Capacity,FreeSpace -Filter "DriveType=3" |
Select SystemName,@{n="DriveLetter";e={$_.DriveLetter.ToUpper()}},DeviceID,@{n="CapacityGB";e={([math]::Round([int64]($_.Capacity)/1GB,2))}},@{n="FreeSpaceGB";e={([math]::Round([int64]($_.FreeSpace)/1GB,2))}} | Sort DriveLetter

# get all shadow storage volumes
$ShadowStorage = gwmi Win32_ShadowStorage -Property AllocatedSpace,DiffVolume,MaxSpace,UsedSpace,Volume |
Select @{n="Volume";e={$_.Volume.Replace("\\","\").Replace("Win32_Volume.DeviceID=","").Replace("`"","")}},
                @{n="DiffVolume";e={$_.DiffVolume.Replace("\\","\").Replace("Win32_Volume.DeviceID=","").Replace("`"","")}},
                @{n="AllocatedSpaceGB";e={([math]::Round([int64]($_.AllocatedSpace)/1GB,2))}},
                @{n="MaxSpaceGB";e={([math]::Round([int64]($_.MaxSpace)/1GB,2))}},
                @{n="UsedSpaceGB";e={([math]::Round([int64]($_.UsedSpace)/1GB,2))}}

# list all shadow coppies
$ShadowCopies = gwmi Win32_ShadowCopy -Property VolumeName,InstallDate,Count |
                Select VolumeName,InstallDate,Count,
                @{n="CreationDate";e={$_.ConvertToDateTime($_.InstallDate)}}

# format and output stats
$Shares = gwmi win32_share -Property Name,Path | Select Name,@{n="Path";e={$_.Path.ToUpper()}}
            If($Volumes)
            {
                $Output = @()
                ForEach($Volume in $Volumes)
                {
                    $VolumeShares = $VolumeShadowStorage = $DiffVolume = $VolumeShadowCopies = $Null
                    If($Volume.DriveLetter -ne $Null){[array]$VolumeShares = $Shares | ?{$_.Path.StartsWith($Volume.DriveLetter)}}
                    $VolumeShadowStorage = $ShadowStorage | ?{$_.Volume -eq $Volume.DeviceID}
                    If($VolumeShadowStorage){$DiffVolume = $Volumes | ?{$_.DeviceID -eq $VolumeShadowStorage.DiffVolume}}
                    $VolumeShadowCopies = $ShadowCopies | ?{$_.VolumeName -eq $Volume.DeviceID} | Sort InstallDate
                    $Object = New-Object psobject
                    $Object | Add-Member NoteProperty SystemName $Volume.SystemName -PassThru | Add-Member NoteProperty DriveLetter $Volume.DriveLetter -PassThru |
                        Add-Member NoteProperty CapacityGB $Volume.CapacityGB -PassThru | Add-Member NoteProperty FreeSpaceGB $Volume.FreeSpaceGB -PassThru |
                        Add-Member NoteProperty ShareCount "" -PassThru | Add-Member NoteProperty Shares "" -PassThru |
                        Add-Member NoteProperty ShadowAllocatedSpaceGB "" -PassThru | Add-Member NoteProperty ShadowUsedSpaceGB "" -PassThru |
                        Add-Member NoteProperty ShadowMaxSpaceGB "" -PassThru | Add-Member NoteProperty DiffVolumeDriveLetter "" -PassThru |
                        Add-Member NoteProperty DiffVolumeCapacityGB "" -PassThru | Add-Member NoteProperty DiffVolumeFreeSpaceGB "" -PassThru |
                        Add-Member NoteProperty ShadowCopyCount "" -PassThru | Add-Member NoteProperty OldestShadowCopy "" -PassThru |
                        Add-Member NoteProperty LatestShadowCopy "" -PassThru | Add-Member NoteProperty ShadowAverageSizeGB "" -PassThru | Add-Member NoteProperty ShadowAverageSizeMB ""
    If($VolumeShares)
                    {   $Object.ShareCount = $VolumeShares.Count
                        If($VolumeShares.Count -eq 1){$Object.Shares = $VolumeShares[0].Name}
                        Else{$Object.Shares = [string]::join(", ", ($VolumeShares | Select Name)).Replace("@{Name=", "").Replace("}", "")}
                    }
                    If($VolumeShadowStorage)
                    {   $Object.ShadowAllocatedSpaceGB = $VolumeShadowStorage.AllocatedSpaceGB
                        $Object.ShadowUsedSpaceGB = $VolumeShadowStorage.UsedSpaceGB
                        $Object.ShadowMaxSpaceGB = $VolumeShadowStorage.MaxSpaceGB
                        If($DiffVolume)
                        {   $Object.DiffVolumeDriveLetter = $DiffVolume.DriveLetter
                            $Object.DiffVolumeCapacityGB = $DiffVolume.CapacityGB
                            $Object.DiffVolumeFreeSpaceGB = $DiffVolume.FreeSpaceGB
                        }
                    }
                    If($VolumeShadowCopies)
                    {   $Object.ShadowCopyCount = (($VolumeShadowCopies | Measure-Object -Property Count -Sum).Sum)
                        $Object.OldestShadowCopy = (($VolumeShadowCopies | Select -First 1).CreationDate)
                        $Object.LatestShadowCopy = (($VolumeShadowCopies | Select -Last 1).CreationDate)
                        If($VolumeShadowStorage.UsedSpaceGB -gt 0 -And $Object.ShadowCopyCount -gt 0)
                        {   $Object.ShadowAverageSizeGB = ([math]::Round($VolumeShadowStorage.UsedSpaceGB/$Object.ShadowCopyCount,2))
                            $Object.ShadowAverageSizeMB = ([math]::Round(($VolumeShadowStorage.UsedSpaceGB*1KB)/$Object.ShadowCopyCount,2))
                        }

                        }
                    }
                    If($VolumeShadowStorage -Or $ShowAllVolumes){$Output += $Object}
                }
                $Output

Это выведет такой блок информации:

SystemName             : server
DriveLetter            : F:
CapacityGB             : 1850
FreeSpaceGB            : 676.75
ShareCount             : 17
Shares                 : List of shares
ShadowAllocatedSpaceGB : 71.41
ShadowUsedSpaceGB      : 62.3
ShadowMaxSpaceGB       : 292.97
DiffVolumeDriveLetter  : F:
DiffVolumeCapacityGB   : 1850
DiffVolumeFreeSpaceGB  : 676.75
ShadowCopyCount        : 961
OldestShadowCopy       : 4/25/2020 8:39:29 AM
LatestShadowCopy       : 7/8/2020 9:17:56 AM
ShadowAverageSizeGB    : 0.06
ShadowAverageSizeMB    : 66.38

Что мне нужно сделать, чтобы это работало с нашими инструментами RMM, является break каждую строку этого вывода в свои переменные, чтобы инструмент RMM мог прочитать каждую из них. Для контекста это тот скрипт, который мы используем сейчас, он работает, но на самом деле выводит только основы: быть под контролем. Вот как это выглядит Это затем читается нашим инструментом RMM вот так Надеюсь, кто-нибудь может указать мне правильное направление для решения этой проблемы. Прошу прощения, если это слишком много вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...