public/cbb/New-MBSBackupPlan.ps1
function New-MBSBackupPlan { <# .SYNOPSIS Creates new backup plan. .DESCRIPTION Creates File-Level, Image-Based, Hyper-V, or MS SQL backup plan. .PARAMETER Name Backup plan name. .PARAMETER StorageAccount Specify storage account object. Use Get-MBSStorageAccount cmdlet to list storages. Example: (Get-MBSStorageAccount -Name "AWS S3") .PARAMETER MasterPassword Master password. Should be specified if configuration is protected by master password. Use -MasterPassword (ConvertTo-SecureString -string "Your_Password" -AsPlainText -Force) .PARAMETER Schedule Specify schedule. Use New-MBSPlanSchedule to create an object. .PARAMETER FullSchedule Specify force full schedule. Use New-MBSPlanSchedule to create an object. .PARAMETER MSSQLDiffSchedule Specify MS SQL Differential schedule. Use New-MBSPlanSchedule to create an object. .PARAMETER MSSQLTlogSchedule Specify MS SQL T-Log schedule. Use New-MBSPlanSchedule to create an object. .PARAMETER BackupPlanCommonOption Specify plan common options. Use New-MBSBackupPlanCommonOption to create an object. .PARAMETER UseBlockLevelBackup Use block level backup. .PARAMETER UseFastNTFSScan The Fast NTFS scan speeds up backup processing by using a low-level API for accessing NTFS structures. This option is useful for NTFS volumes with a large number of files. Enabling this option automatically enables ForceUsingVSS option .PARAMETER BackupNTFSPermissions Backup NTFS permissions .PARAMETER ForceUsingVSS Force using VSS (Volume Shadow Copy Service) .PARAMETER UseShareReadWriteModeOnError Use share read/write mode on errors. Can help if file is open in share read/write mode .PARAMETER DeleteLocallyDeletedFilesAfter Delete files that have been deleted locally after specified number of days. Example: -DeleteLocallyDeletedFilesAfter 30. . .PARAMETER BackupEmptyFolders Backup empty folders .PARAMETER BackupOnlyAfter Backup files only after specific date. Example: "06/09/19 7:43 AM" .PARAMETER ExcludeSystemHiddenFiles Exclude system and hidden files from backup plan. .PARAMETER SkipFolder Skip folders. Example: -skipfolder ""bin,*temp*,My*"" .PARAMETER IncludeFilesMask Include files mask. Example: -IncludeFilesMask ""*.doc,*.xls"" .PARAMETER ExcludeFilesMask Exclude files mask. Example: -ExcludeFilesMask ""*.bak,*.tmp"" .PARAMETER IgnoreErrorPathNotFound Ignore errors path not found .PARAMETER TrackDeletedFiles Track deleted files data .PARAMETER BackupFile Backup file path. Example: "c:\temp\test.txt","c:\temp\test.ps1" .PARAMETER BackupDirectory Backup directory path. Example: "c:\Work","c:\Users" .PARAMETER ExcludeFile Exclude a file from backup plan. Example: "c:\temp\test2.txt","c:\temp\test2.ps1" .PARAMETER ExcludeDirectory Exclude a directory from backup plan. Example: "c:\Program Files","c:\Windows" .PARAMETER GenerateDetailedReport Specify to generate detailed report .PARAMETER BackupVolumes Backup Volumes type. .PARAMETER Volumes Backup selected volumes with the specified ids .PARAMETER DisableVSS Disable VSS, use direct access to NTFS volume .PARAMETER IgnoreBadSectors Ignore bad sectors .PARAMETER UseSystemVSS Use system VSS provider .PARAMETER DisableSyntheticFull Disable Synthetic Full backup. .PARAMETER PrefetchBlockCount Prefetch block count (0 - 100, 0 without prefetch) .PARAMETER BlockSize Block size. Possible values: 128, 256, 512, 1024 .PARAMETER ExcludeItem Exclude files/folders from Image-Based backup plan. Example: "C:\bin","C:\Users","\\?\\Volume{2b7ea38e-0854-44a9-90f8-259fe8d52d20}\Recovery" .PARAMETER KeepBitLocker Enable KeepBitLocker option for all partitions .PARAMETER KeepBitLockerEnableForVolume Enable KeepBitLocker option for volumes with specified ids. Example: "cc9eb5c7-f956-415c-b23e-e6a563f9a20e","c4f8f0d6-7a2a-4627-9c89-cc84dbe3bf79" .PARAMETER KeepBitLockerDisableForVolume Disable KeepBitLocker option for volumes with specified ids. Example: "01bc714b-b611-448e-8fff-2e0e4a0d9004","a44e3efd-17ef-4f2c-bd66-5cbda5f23939" .PARAMETER BackupVM Backup Virtual Machine type .PARAMETER VirtualMachine Backup selected virtual machines only the specified names .PARAMETER InstanceName MS SQL server instance name .PARAMETER useSSL Use secure connection (SSL/TLS) .PARAMETER useWinauth Use Windows authentication .PARAMETER UserName MS SQL server user name .PARAMETER Password MS SQL server password .PARAMETER BackupDB Database selection type .PARAMETER Databases Select backup database .PARAMETER CopyOnly Use copy only .PARAMETER Verify Verify .EXAMPLE New-MBSBackupPlan -Name "IBB Plan" -StorageAccount (Get-MBSStorageAccount -ID aa3230dc-c20f-4ff3-83be-1cf6820de46b) -BackupVolumes AllVolumes -Schedule $schedule -BackupPlanCommonOption $commonOptions Create Image-Based backup plan. .EXAMPLE New-MBSBackupPlan -Name "File-level Plan" -StorageAccount (Get-MBSStorageAccount -ID aa3230dc-c20f-4ff3-83be-1cf6820de46b) -BackupFile "c:\temp\test.txt","c:\temp\test.ps1" -BackupDirectory "c:\Work","c:\Users" -Schedule $schedule -BackupPlanCommonOption $commonOptions Create File-Level backup plan. .EXAMPLE New-MBSBackupPlan -Name "HyperV plan" -StorageAccount (Get-MBSStorageAccount -ID aa3230dc-c20f-4ff3-83be-1cf6820de46b) -Schedule $DailySchedule -BackupVM All Create Hyper-V backup plan to backup all virtual machines. .EXAMPLE New-MBSBackupPlan -Name "MS SQL plan" -StorageAccount (Get-MBSStorageAccount -ID aa3230dc-c20f-4ff3-83be-1cf6820de46b) -Schedule $DailySchedule -InstanceName "host\sqlexpress" -MSSQLTlogSchedule $DiffSchedule -BackupPlanCommonOption $commonOptions -useSSL -useWinauth -BackupDB All Create MS SQL backup plan to backup all databases. .INPUTS None. .OUTPUTS None. .NOTES Author: MSP360 Onboarding Team .LINK https://mspbackups.com/AP/Help/powershell/cmdlets/backup-agent/new-mbsbackupplan #> [CmdletBinding()] param ( # [Parameter(Mandatory=$true, HelpMessage="Backup plan name.")] [string] $Name, # [Parameter(Mandatory=$true, HelpMessage="Specify storage account object. Use Get-MBSStorageAccount cmdlet to list storages. Example: (Get-MBSStorageAccount -Name ""AWS S3"")", ParameterSetName='FileLevel')] [Parameter(Mandatory=$true, HelpMessage="Specify storage account object. Use Get-MBSStorageAccount cmdlet to list storages. Example: (Get-MBSStorageAccount -Name ""AWS S3"")", ParameterSetName='ImageBased')] [Parameter(Mandatory=$true, HelpMessage="Specify storage account object. Use Get-MBSStorageAccount cmdlet to list storages. Example: (Get-MBSStorageAccount -Name ""AWS S3"")", ParameterSetName='HyperV')] [Parameter(Mandatory=$true, HelpMessage="Specify storage account object. Use Get-MBSStorageAccount cmdlet to list storages. Example: (Get-MBSStorageAccount -Name ""AWS S3"")", ParameterSetName='MSSQL')] [MBS.Agent.StorageAccount] $StorageAccount, # [Parameter(Mandatory=$False, HelpMessage="Master password. Should be specified if configuration is protected by master password. Use -MasterPassword (ConvertTo-SecureString -string ""Your_Password"" -AsPlainText -Force)", ParameterSetName='FileLevel')] [Parameter(Mandatory=$False, HelpMessage="Master password. Should be specified if configuration is protected by master password. Use -MasterPassword (ConvertTo-SecureString -string ""Your_Password"" -AsPlainText -Force)", ParameterSetName='ImageBased')] [Parameter(Mandatory=$False, HelpMessage="Master password. Should be specified if configuration is protected by master password. Use -MasterPassword (ConvertTo-SecureString -string ""Your_Password"" -AsPlainText -Force)", ParameterSetName='HyperV')] [Parameter(Mandatory=$False, HelpMessage="Master password. Should be specified if configuration is protected by master password. Use -MasterPassword (ConvertTo-SecureString -string ""Your_Password"" -AsPlainText -Force)", ParameterSetName='MSSQL')] [SecureString] $MasterPassword, # ------------------------- Schedule ----------------------------- [Parameter(Mandatory=$False, HelpMessage="Specify schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='FileLevel')] [Parameter(Mandatory=$False, HelpMessage="Specify schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='ImageBased')] [Parameter(Mandatory=$False, HelpMessage="Specify schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='HyperV')] [Parameter(Mandatory=$False, HelpMessage="Specify schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='MSSQL')] [MBS.Agent.Plan.Schedule] $Schedule, # [Parameter(Mandatory=$False, HelpMessage="Specify force full schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='ImageBased')] [Parameter(Mandatory=$False, HelpMessage="Specify force full schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='FileLevel')] [Parameter(Mandatory=$False, HelpMessage="Specify force full schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='HyperV')] [MBS.Agent.Plan.Schedule] $FullSchedule, # [Parameter(Mandatory=$False, HelpMessage="Specify MS SQL Differential schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='MSSQL')] [MBS.Agent.Plan.Schedule] $MSSQLDiffSchedule, # [Parameter(Mandatory=$False, HelpMessage="Specify MS SQL T-Log schedule. Use New-MBSPlanSchedule to create an object.", ParameterSetName='MSSQL')] [MBS.Agent.Plan.Schedule] $MSSQLTlogSchedule, # ------------------------- Common options ----------------------------- [Parameter(Mandatory=$true, HelpMessage="Specify plan common options. Use New-MBSBackupPlanCommonOption to create an object.", ParameterSetName='FileLevel')] [Parameter(Mandatory=$true, HelpMessage="Specify plan common options. Use New-MBSBackupPlanCommonOption to create an object.", ParameterSetName='ImageBased')] [Parameter(Mandatory=$true, HelpMessage="Specify plan common options. Use New-MBSBackupPlanCommonOption to create an object.", ParameterSetName='HyperV')] [Parameter(Mandatory=$true, HelpMessage="Specify plan common options. Use New-MBSBackupPlanCommonOption to create an object.", ParameterSetName='MSSQL')] [MBS.Agent.Plan.BackupPlanCommonOption] $BackupPlanCommonOption, #---------------------------- Block Level ------------------ [Parameter(Mandatory=$False, HelpMessage='Use block level backup.', ParameterSetName='FileLevel')] [Parameter(Mandatory=$False, HelpMessage='Use block level backup.', ParameterSetName='ImageBased')] [Switch] $UseBlockLevelBackup, # --------------------------- File Backup settings ------------ [Parameter(Mandatory=$False, HelpMessage='The Fast NTFS scan speeds up backup processing by using a low-level API for accessing NTFS structures. This option is useful for NTFS volumes with a large number of files. Enabling this option automatically enables ForceUsingVSS option', ParameterSetName='FileLevel')] [Switch] $UseFastNTFSScan, # [Parameter(Mandatory=$False, HelpMessage="Backup NTFS permissions", ParameterSetName='FileLevel')] [Switch] $BackupNTFSPermissions, # [Parameter(Mandatory=$False, HelpMessage='Force using VSS (Volume Shadow Copy Service).', ParameterSetName='FileLevel')] [Switch] $ForceUsingVSS, # [Parameter(Mandatory=$False, HelpMessage='Use share read/write mode on errors. Can help if file is open in share read/write mode.', ParameterSetName='FileLevel')] [Switch] $UseShareReadWriteModeOnError, # [Parameter(Mandatory=$False, HelpMessage="Delete files that have been deleted locally after specified number of days. Example: -DeleteLocallyDeletedFilesAfter 30.", ParameterSetName='FileLevel')] [timespan] $DeleteLocallyDeletedFilesAfter, # [Parameter(Mandatory=$False, HelpMessage='Backup empty folders.', ParameterSetName='FileLevel')] [Switch] $BackupEmptyFolders, # [Parameter(Mandatory=$False, HelpMessage="Backup files only after specific date. Example: ""06/09/19 7:43 AM""", ParameterSetName='FileLevel')] [datetime] $BackupOnlyAfter, # [Parameter(Mandatory=$False, HelpMessage='Exclude system and hidden files.', ParameterSetName='FileLevel')] [bool] $ExcludeSystemHiddenFiles=$true, # [Parameter(Mandatory=$False, HelpMessage="Skip folders. Example: -skipfolder ""bin,*temp*,My*""", ParameterSetName='FileLevel')] [string[]] $SkipFolder, # [Parameter(Mandatory=$False, HelpMessage="Include files mask. Example: -IncludeFilesMask ""*.doc,*.xls""", ParameterSetName='FileLevel')] [string[]] $IncludeFilesMask, # [Parameter(Mandatory=$False, HelpMessage="Exclude files mask. Example: -ExcludeFilesMask ""*.bak,*.tmp""", ParameterSetName='FileLevel')] [string[]] $ExcludeFilesMask, # [Parameter(Mandatory=$False, HelpMessage='Ignore errors path not found.', ParameterSetName='FileLevel')] [Switch] $IgnoreErrorPathNotFound, # [Parameter(Mandatory=$False, HelpMessage='Track deleted files data.', ParameterSetName='FileLevel')] [Switch] $TrackDeletedFiles, # [Parameter(Mandatory=$False, HelpMessage="Backup file", ParameterSetName='FileLevel')] [string[]] $BackupFile, # [Parameter(Mandatory=$False, HelpMessage="Backup directory", ParameterSetName='FileLevel')] [string[]] $BackupDirectory, # [Parameter(Mandatory=$False, HelpMessage="Exclude a file from backup plan", ParameterSetName='FileLevel')] [string[]] $ExcludeFile, # [Parameter(Mandatory=$False, HelpMessage="Exclude a directory from backup plan", ParameterSetName='FileLevel')] [string[]] $ExcludeDirectory, # [Parameter(Mandatory=$False, HelpMessage='Specify to generate detailed report.', ParameterSetName='FileLevel')] [Parameter(Mandatory=$False, HelpMessage='Specify to generate detailed report.', ParameterSetName='MSSQL')] [Switch] $GenerateDetailedReport, # ------------------------- Image-Based -------------------------------------- [Parameter(Mandatory=$true, HelpMessage="Backup Volumes type", ParameterSetName='ImageBased')] [ValidateSet("AllVolumes", "SystemRequired", "SelectedVolumes")] [string] $BackupVolumes, # [Parameter(Mandatory=$False, HelpMessage="Backup selected volumes with the specified ids.", ParameterSetName='ImageBased')] [string[]] $Volumes, # [Parameter(Mandatory=$False, HelpMessage='Disable VSS, use direct access to NTFS volume.', ParameterSetName='ImageBased')] [Switch] $DisableVSS, # [Parameter(Mandatory=$False, HelpMessage='Ignore bad sectors.', ParameterSetName='ImageBased')] [bool] $IgnoreBadSectors=$true, # [Parameter(Mandatory=$False, HelpMessage='Use system VSS provider.', ParameterSetName='ImageBased')] [Switch] $UseSystemVSS, # [Parameter(Mandatory=$False, HelpMessage='Disable Synthetic Full backup.', ParameterSetName='ImageBased')] [Switch] $DisableSyntheticFull, # [Parameter(Mandatory=$False, HelpMessage="Prefetch block count (0 - 100, 0 without prefetch)", ParameterSetName='ImageBased')] [Int32][ValidateRange(0,100)] $PrefetchBlockCount, # [Parameter(Mandatory=$False, HelpMessage="Block size. Possible values: 128, 256, 512, 1024", ParameterSetName='ImageBased')] [ValidateSet("128", "256", "512", "1024")] [string] $BlockSize, # [Parameter(Mandatory=$False, HelpMessage="Exclude files/folders from Image-Based backup plan", ParameterSetName='ImageBased')] [string[]] $ExcludeItem, # [Parameter(Mandatory=$False, HelpMessage='Enable KeepBitLocker option for all partitions', ParameterSetName='ImageBased')] [switch] $KeepBitLocker, # [Parameter(Mandatory=$False, HelpMessage="Enable KeepBitLocker option for volumes with specified ids", ParameterSetName='ImageBased')] [string[]] $KeepBitLockerEnableForVolume, # [Parameter(Mandatory=$False, HelpMessage="Disable KeepBitLocker option for volumes with specified ids", ParameterSetName='ImageBased')] [string[]] $KeepBitLockerDisableForVolume, # ------------------------- Hyper-V -------------------------------------- [Parameter(Mandatory=$true, HelpMessage="Backup Virtual Machine type", ParameterSetName='HyperV')] #[ValidateSet("All", "OnlyRunning", "SelectedVM")] [MBS.Agent.Plan.BackupVMType] $BackupVM, # [Parameter(Mandatory=$False, HelpMessage="Backup selected virtual machines only the specified names.", ParameterSetName='HyperV')] [string[]] $VirtualMachine, # ------------------------- MS SQL -------------------------------------- [Parameter(Mandatory=$true, HelpMessage="MS SQL server instance name", ParameterSetName='MSSQL')] [string] $InstanceName, # [Parameter(Mandatory=$False, HelpMessage='Use secure connection (SSL/TLS).', ParameterSetName='MSSQL')] [Switch] $useSSL, # [Parameter(Mandatory=$False, HelpMessage='Use Windows authentication.', ParameterSetName='MSSQL')] [Switch] $useWinauth, # [Parameter(Mandatory=$False, HelpMessage="MS SQL server user name", ParameterSetName='MSSQL')] [string] $UserName, # [Parameter(Mandatory=$False, HelpMessage="MS SQL server password", ParameterSetName='MSSQL')] [Securestring] $Password, # [Parameter(Mandatory=$False, HelpMessage="Database selection type", ParameterSetName='MSSQL')] #[ValidateSet("All", "User", "Selected")] [MBS.Agent.Plan.DatabaseSelectionType] $BackupDB, # [Parameter(Mandatory=$False, HelpMessage="Select backup database.", ParameterSetName='MSSQL')] [string[]] $Databases, # [Parameter(Mandatory=$False, HelpMessage='Use copy only.', ParameterSetName='MSSQL')] [Switch] $CopyOnly, # [Parameter(Mandatory=$False, HelpMessage='Verify.', ParameterSetName='MSSQL')] [Switch] $Verify ) begin { if (-not($CBB = Get-MBSAgent)) { Break } $CBBVersion = [version]$CBB.version if (-Not(Test-MBSAgentMasterPassword)) { $MasterPassword = $null } else { if (-Not(Test-MBSAgentMasterPassword -CheckMasterPassword -MasterPassword $MasterPassword)) { $MasterPassword = Read-Host -AsSecureString -Prompt "Master Password" if (-Not(Test-MBSAgentMasterPassword -CheckMasterPassword -MasterPassword $MasterPassword)) { Write-Error "ERROR: Master password is not specified" Break } } } } process { function Set-Schedule { param ( [Parameter()] [psobject] $Schedule, [Parameter()] [string] $Prefix = '' ) switch ($Schedule.Frequency) { Daily {$ScheduleCli += " -every$prefix day"} Weekly {$ScheduleCli += " -every$prefix week"} Monthly {$ScheduleCli += " -every$prefix month"} dayofmonth {$ScheduleCli += " -every$prefix dayofmonth"} Realtime {$ScheduleCli += " -every$prefix real-time"} Default { #Write-Host "Schedule frequency is not specified." #Break } } if ($Schedule.At){$ScheduleCli += " -at$prefix ""$($Schedule.At.ToString())"""} if ($Schedule.DayOfMonth){$ScheduleCli += " -day$prefix $($Schedule.DayOfMonth)"} if ($null -ne $Schedule.DayOfWeek){$ScheduleCli += " -weekday$prefix "+(($Schedule.DayOfWeek | foreach-object -Begin {$weekdaylocal = @()} -Process{$weekdaylocal += $_.ToString().Substring(0,2)} -End {return $weekdaylocal.ToLower()}) -join ",")} if ($Schedule.Weeknumber){$ScheduleCli += " -weeknumber$prefix $($Schedule.Weeknumber)"} if ($Schedule.OccursFrom){$ScheduleCli += " -dailyFrom$prefix $($Schedule.OccursFrom.ToString('hh\:mm'))"} if ($Schedule.OccursTo){$ScheduleCli += " -dailyTill$prefix $($Schedule.OccursTo.ToString('hh\:mm'))"} if ($Schedule.OccursEvery.TotalMinutes -ne 0){ if ($Schedule.OccursEvery.TotalHours -gt 180){ $ScheduleCli += " -occurs$prefix hour -occurValue$prefix 180" }elseif($Schedule.OccursEvery.TotalHours -lt 180 -and $Schedule.OccursEvery.TotalHours -ge 1){ $ScheduleCli += " -occurs$prefix hour -occurValue$prefix $([Math]::Round($Schedule.OccursEvery.TotalHours))" }elseif($Schedule.OccursEvery.TotalHours -lt 1 -and $Schedule.OccursEvery.TotalMinutes -ge 1){ $ScheduleCli += " -occurs$prefix min -occurValue$prefix $([Math]::Round($Schedule.OccursEvery.TotalMinutes))" }else{ Write-host "Schedule 'OccursEvery' parameter cannot be less then 1 minute." } } if ($Schedule.RepeatInterval){$ScheduleCli += " -repeatEvery$prefix $($Schedule.RepeatInterval)"} if ($Schedule.RepeatStartDate){$ScheduleCli += " -repeatStartDate$prefix ""$($Schedule.RepeatStartDate.ToString())"""} return $Schedulecli } function Set-Argument { if ($Name){$Argument += " -n ""$Name"""} if(($BackupPlanCommonOption.StorageClass -ne 'Standard') -And (-Not ($Global:MSP360ModuleSettings.SkipStorageClass))){ if (($BackupPlanCommonOption.StorageClass -eq 'GlacierInstantRetrieval') -And ($CBBVersion -lt [version]"7.3.1")){ Write-Warning "Backup agent version is $CBBVersion. GlacierInstantRetrieval storage class is supported in version 7.3.1 or higher. Ignoring StorageClass option" $Argument += " -aid ""$($StorageAccount.ID)""" }else{ $Argument += " -a ""$($StorageAccount.DisplayName)"" -sc ""$($BackupPlanCommonOption.StorageClass)""" } }else{ if($Global:MSP360ModuleSettings.SkipStorageClass){ Write-Warning "MSP360ModuleSettings.SkipStorageClass is set. Ignoring StorageClass option" } $Argument += " -aid ""$($StorageAccount.ID)""" } if ($useBlockLevelBackup) {$Argument += " -useBlockLevelBackup yes"} if($Schedule){$Argument += Set-Schedule -Schedule $Schedule} if($FullSchedule){ if ((($PSCmdlet.ParameterSetName -eq 'FileLevel') -Or ($PSCmdlet.ParameterSetName -eq 'ImageBased')) -And (-Not ($useBlockLevelBackup))) { Write-Warning "Full schedule options specified but ""useBlockLevelBackup"" parameter is not enabled. Enabling ""useBlockLevelBackup"" parameter..." $Argument += " -useBlockLevelBackup yes" } $Argument += Set-Schedule -Schedule $FullSchedule -Prefix "ForceFull" } if($MSSQLDiffSchedule){$Argument += Set-Schedule -Schedule $MSSQLDiffSchedule -Prefix "Diff"} if($MSSQLTlogSchedule){$Argument += Set-Schedule -Schedule $MSSQLTlogSchedule -Prefix "TLog"} if($BackupPlanCommonOption.SyncRepositoryBeforeRun){$Argument += " -sync yes"}#else{$Argument += " -sync no"} if(-Not ($Global:MSP360ModuleSettings.SkipSSE)) { if($BackupPlanCommonOption.UseServerSideEncryption){$Argument += " -sse yes"}else{$Argument += " -sse no"} } else { Write-Warning "MSP360ModuleSettings.SkipSSE is set. Ignoring UseServerSideEncryption option" } if(-Not ($Global:MSP360ModuleSettings.SkipEncryption)) { if($Null -ne $BackupPlanCommonOption.EncryptionPassword){$Argument += " -ea $($BackupPlanCommonOption.EncryptionAlgorithm)"} if($BackupPlanCommonOption.EncryptionPassword){$Argument += " -ep """+([System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($BackupPlanCommonOption.EncryptionPassword)))+""""} } else { Write-Warning "MSP360ModuleSettings.SkipEncryption is set. Ignoring EncryptionPassword and EncryptionAlgorithm options" } if(-Not ($Global:MSP360ModuleSettings.SkipCompression)) { if($BackupPlanCommonOption.UseCompression){$Argument += " -c yes"}else{$Argument += " -c no"} } else { Write-Warning "MSP360ModuleSettings.SkipCompression is set. Ignoring UseCompression option" } if($BackupPlanCommonOption.SaveBackupPlanConfiguration){ $Argument += " -sp yes" }else{ $Argument += " -sp no" } if($BackupPlanCommonOption.StopIfPlanRunsFor.TotalMinutes -gt 0){$Argument += " -stopAfter $( [math]::Round($BackupPlanCommonOption.StopIfPlanRunsFor.TotalHours)):$($BackupPlanCommonOption.StopIfPlanRunsFor.Minutes)"} if($BackupPlanCommonOption.RunMissedPlanImmediately){$Argument += " -runMissed yes"}else{$Argument += " -runMissed no"} if($BackupPlanCommonOption.PreActionCommand){$Argument += " -preAction $($BackupPlanCommonOption.PreActionCommand)"} if($Null -ne $BackupPlanCommonOption.PreActionContinueAnyway){ if($BackupPlanCommonOption.PreActionContinueAnyway){ $Argument += " -pac yes" } else { $Argument += " -pac no" } } if($BackupPlanCommonOption.PostActionCommand){$Argument += " -postAction $($BackupPlanCommonOption.PostActionCommand)"} if($Null -ne $BackupPlanCommonOption.PostActionRunAnyway){ if($BackupPlanCommonOption.PostActionRunAnyway){ $Argument += " -paa yes" } else { $Argument += " -paa no" } } if ($BackupPlanCommonOption.BackupChainPlanID) { if ($CBBVersion -ge [version]"7.2.1.0") { $Argument += " -chainPlanOn $($BackupPlanCommonOption.BackupChainPlanID)" if ($null -ne $BackupPlanCommonOption.BackupChainExecuteOnlyAfterSuccess) { if ($BackupPlanCommonOption.BackupChainExecuteOnlyAfterSuccess) { $Argument += " -chainPlanAfterSuccess yes" }else{ $Argument += " -chainPlanAfterSuccess no" } } if ($null -ne $BackupPlanCommonOption.BackupChainExecuteForceFull) { if ($BackupPlanCommonOption.BackupChainExecuteForceFull) { $Argument += " -chainPlanForceFull yes" }else{ $Argument += " -chainPlanForceFull no" } } }else{ Write-Warning "Backup agent version is $CBBVersion. Backup chain parameters require version 7.2.1 or higher. Ignoring backup chain options" } } if($Null -ne $BackupPlanCommonOption.ResultEmailNotification){$Argument += " -notification $($BackupPlanCommonOption.ResultEmailNotification)"} if($Null -ne $BackupPlanCommonOption.AddEventToWindowsLog){$Argument += " -winLog $($BackupPlanCommonOption.AddEventToWindowsLog)"} if($Null -ne $BackupPlanCommonOption.KeepVersionPeriod){ if($BackupPlanCommonOption.KeepVersionPeriod -gt 0){ $Argument += " -purge $($BackupPlanCommonOption.KeepVersionPeriod)d" }else{ $Argument += " -purge no" } } if($Null -ne $BackupPlanCommonOption.KeepNumberOfVersion){ if($BackupPlanCommonOption.KeepNumberOfVersion -gt 0){ $Argument += " -keep $($BackupPlanCommonOption.KeepNumberOfVersion)" }elseif ($BackupPlanCommonOption.KeepNumberOfVersion -eq 0) { $Argument += " -keep all" } } if($Null -ne $BackupPlanCommonOption.KeepLastVersion){ if ($BackupPlanCommonOption.KeepLastVersion){ $Argument += " -keepLastVersion yes" }else{ $Argument += " -keepLastVersion no" } } if($Null -ne $BackupPlanCommonOption.DelayPurgePeriod){ if($BackupPlanCommonOption.DelayPurgePeriod -gt 0){ $Argument += " -delayPurge $($BackupPlanCommonOption.DelayPurgePeriod)d" }else{ $Argument += " -delayPurge no" } } switch ($PSCmdlet.ParameterSetName){ 'FileLevel' { # --------- File-Level ------------ #$Argument += " addBackupPlan" if ($UseFastNTFSScan) { if ($CBBVersion -ge [version]"7.1.0.0") { $Argument += " -fastNtfs yes" } else { Write-Warning "Backup agent version is $CBBVersion. ""UseFastNTFSScan"" parameter requires version 7.1.0 or higher. Ignoring UseFastNTFSScan option" } } else { if ($CBBVersion -ge [version]"7.1.0.0") { $Argument += " -fastNtfs no" } } if ($BackupNTFSPermissions) {$Argument += " -ntfs yes"} if(-Not ($Global:MSP360ModuleSettings.SkipVSS)) { if ($ForceUsingVSS) {$Argument += " -vss yes"}else{$Argument += " -vss no"} } else { Write-Warning "MSP360ModuleSettings.SkipVSS is set. Ignoring ForceUsingVSS option" } if ($UseShareReadWriteModeOnError) {$Argument += " -sharerw yes"} if ($DeleteLocallyDeletedFilesAfter){$Argument += " -df $($DeleteLocallyDeletedFilesAfter.TotalDays)"} if ($BackupEmptyFolders) {$Argument += " -bef yes"} if ($BackupOnlyAfter){$Argument += " -oa $($BackupOnlyAfter.ToString('MM/dd/yyyy HH:mm tt'))"} if ($ExcludeSystemHiddenFiles) { $Argument += " -es yes" }else{ $Argument += " -es no" } if ($SkipFolder){$Argument += " -skipf ""$($SkipFolder -join ';' -replace ',',';')"""} if ($IncludeFilesMask){$Argument += " -ifm $($IncludeFilesMask -join ';' -replace ',',';')"} if ($ExcludeFilesMask){$Argument += " -efm $($ExcludeFilesMask -join ';' -replace ',',';')"} if ($IgnoreErrorPathNotFound) {$Argument += " -iepnf yes"} if ($TrackDeletedFiles) {$Argument += " -trackdeleted yes"} if ($BackupFile){$Argument += " -f "+'"{0}"' -f ($BackupFile -join '" -f "')} if ($BackupDirectory){$Argument += " -d "+'"{0}"' -f ($BackupDirectory -join '" -d "')} if ($ExcludeFile) { if ($CBBVersion -ge [version]"7.5.0") { $Argument += " -rf "+'"{0}"' -f ($ExcludeFile -join '" -rf "') }else{ Write-Warning "Backup agent version is $CBBVersion. ""ExcludeFile"" parameter requires version 7.5.0 or higher. Ignoring ExcludeFile option" } } if ($ExcludeDirectory) { if ($CBBVersion -ge [version]"7.5.0") { $Argument += " -rd "+'"{0}"' -f ($ExcludeDirectory -join '" -rd "') }else{ Write-Warning "Backup agent version is $CBBVersion. ""ExcludeDirectory"" parameter requires version 7.5.0 or higher. Ignoring ExcludeDirectory option" } } if ($GenerateDetailedReport) { $Argument += " -dr yes" }else{ $Argument += " -dr no" } } 'ImageBased' { # ------------- Image-Based ------------- #$Argument += " addBackupIBBPlan" switch ($BackupVolumes) { 'AllVolumes' {$Argument += " -av"} 'SystemRequired' {$Argument += " -r"} 'SelectedVolumes' { $Volumes | ForEach-Object -Process { $Argument += " -v $_" } } Default {} } if ($disableVSS) {$Argument += " -disableVSS yes"} if ($ignoreBadSectors) { $Argument += " -ignoreBadSectors yes" }else{ $Argument += " -ignoreBadSectors no" } if ($useSystemVSS) {$Argument += " -useSystemVSS yes"} if ($DisableSyntheticFull) {$Argument += " -syntheticFull no"} if ($prefetchBlockCount){$Argument += " -prefetchBlockCount $prefetchBlockCount"} if ($blockSize){$Argument += " -blockSize $blockSize"} if ($ExcludeItem) { if ($CBBVersion -ge [version]"6.4.0") { $Argument += " -skipf "+'"{0}"' -f ($ExcludeItem -join '" -skipf "') } else { Write-Warning "Backup agent version is $CBBVersion. ""ExcludeItem"" parameter requires version 6.4.0 or higher. Ignoring ExcludeItem option" } } if ($KeepBitLocker) { if ($CBBVersion -ge [version]"7.2.2.0") { $Argument += " -keepBitlocker yes" } else { Write-Warning "Backup agent version is $CBBVersion. ""KeepBitLocker"" parameter requires version 7.2.2 or higher. Ignoring KeepBitLocker option" } #} else { #if (($CBBVersion -ge [version]"7.2.2.0") -And (-Not($KeepBitLockerEnableForVolume)) -And (-Not($KeepBitLockerDisableForVolume))) { # $Argument += " -keepBitlocker no" #} } if ($KeepBitLockerEnableForVolume) { if ($CBBVersion -ge [version]"7.2.2.0") { if (-Not($KeepBitLocker)) { $Argument += " -keepBitlockerOn "+'"{0}"' -f ($KeepBitLockerEnableForVolume -join '" -keepBitlockerOn "') } else { Write-Warning """KeepBitLocker"" and ""KeepBitLockerEnableForVolume"" parameters are mutually exclusive. Ignoring KeepBitLockerEnableForVolume option" } }else{ Write-Warning "Backup agent version is $CBBVersion. ""KeepBitLockerEnableForVolume"" parameter requires version 7.2.2 or higher. Ignoring KeepBitLockerEnableForVolume option" } } if ($KeepBitLockerDisableForVolume) { if ($CBBVersion -ge [version]"7.2.2.0") { if (-Not($KeepBitLocker)) { $Argument += " -keepBitlockerOff "+'"{0}"' -f ($KeepBitLockerDisableForVolume -join '" -keepBitlockerOff "') } else { Write-Warning """KeepBitLocker"" and ""KeepBitLockerDisableForVolume"" parameters are mutually exclusive. Ignoring KeepBitLockerDisableForVolume option" } }else{ Write-Warning "Backup agent version is $CBBVersion. ""KeepBitLockerDisableForVolume"" parameter requires version 7.2.2 or higher. Ignoring KeepBitLockerDisableForVolume option" } } } 'HyperV' { # ------------- Hyper-V ------------- #$Argument += " addHyperVPlan" switch ($BackupVM) { 'All' {$Argument += " -all"} 'OnlyRunning' {$Argument += " -r"} 'SelectedVM' {$Argument += " -v "+"'$($VirtualMachine -join "' -v '")'"} Default {} } } 'MSSQL' { # ------------- MS SQL ------------- #$Argument += " addBackupMSSQLPlan" if ($InstanceName){$Argument += " -instancename $InstanceName"} if ($useSSL){$Argument += " -secure yes"} if ($useWinauth){$Argument += " -winauth yes"} if ($UserName){$Argument += " -username $UserName"} if ($Password){$Argument += " -password """+([System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)))+""""} switch ($BackupDB) { 'All' {$Argument += " -dbselectiontype All"} 'User' {$Argument += " -dbselectiontype User"} 'SelectedDB' {$Argument += " -dbselectiontype Selected"} Default {} } if ($Databases){$Argument += " -databases ""$($Databases -join ";")"""} if ($CopyOnly){$Argument += " -copyonly yes"} if ($Verify){$Argument += " -verify yes"} } Default {} } Return $Argument } switch ($PSCmdlet.ParameterSetName){ 'FileLevel' {$Arguments += " addBackupPlan"} 'ImageBased' {$Arguments += " addBackupIBBPlan"} 'HyperV' {$Arguments += " addHyperVPlan"} 'MSSQL' {$Arguments += " addBackupMSSQLPlan"} Default {} } $Arguments += Set-Argument (Start-MBSProcess -CMDPath $CBB.CBBCLIPath -CMDArguments $Arguments -Output short -MasterPassword $MasterPassword).result } end { } } # SIG # Begin signature block # MIIs5gYJKoZIhvcNAQcCoIIs1zCCLNMCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBljZP42sY3eZLE # IUZpe/LGUza55MMbugvbeXzihD51WaCCEekwggVvMIIEV6ADAgECAhBI/JO0YFWU # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7 # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/ # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M # UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv # ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5 # NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp # BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI # ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV # DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3 # 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw # mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm # +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe # dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4 # 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM # dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY # MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU # pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV # HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG # A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1 # YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG # AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl # U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0 # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh # w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd # OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj # cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc # WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO # hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs # zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7 # 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J # KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH # j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2 # Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/ # L9Uo2bC5a4CH2RwwggZUMIIEvKADAgECAhBQGj1MeADxcRs/FOU26uyrMA0GCSqG # SIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0 # ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYw # HhcNMjExMjAzMDAwMDAwWhcNMjQxMjAyMjM1OTU5WjBYMQswCQYDVQQGEwJVUzEV # MBMGA1UECAwMUGVubnN5bHZhbmlhMRgwFgYDVQQKDA9NU1BCeXRlcywgQ29ycC4x # GDAWBgNVBAMMD01TUEJ5dGVzLCBDb3JwLjCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAKNUOYUGihQGjTJdJ6k5Fm3+6QJGhj2wUbubiiqxJeqmW6616o5e # ExwiGSxPOqafJzOJNq0XOigb3OQhtdIR4bG38+JghFt8rZe/DxBmPBZDR9bD1hrk # 9vY714QhqvhIlUDXHnDUc9pnVGFfI945hRgaFHL77GQAEFyMvjNupOvT674/E8rI # gYKMQBwY0cqiuRQwr3FnRMmNhd8/5mqrZGglDT1JizOnpfFVgNJ0x4ev7mPYIF6T # rFGPwHsOOujzydmGgqvtGASEuz74A6arzYrhbjXv8XsEdT2tz6hHIpMwsgWMk6BD # KDCsSIl5oEmVbQNXKrC0k62/XpbWRd+i350k07kl1bdV+nbi1K62TyS+7eVxehC1 # gFp+Knob1aqAJD9sPBLdbN3E4FOB/rvOLP1i2IxAcTGirAyRkkUriD4LUSWO6pju # Qv2V4ZU/+K/3ZLXYCbIflzpDq6z9FmazK5csv99Coslv9s6lm9s1RRxgRBj5sn1q # Xe/5l0VbF7tG/cgBvt8aJBD0u8knujI17lDy1TGA77r/KKj65xSsxC6nm0RA9pTw # 0tz5OQ4ABYrH6TpdUBJz8m8cFgPipvyohN0RdE7InB3Nao11L1UHlnnL0SG1z5qQ # YU7BhvfiSu44pSY9/uTPmAPlNIj3MO5utjfMD+MX9u86d8h/DWwrvQZzAgMBAAGj # ggGcMIIBmDAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4E # FgQU7XGG9N0fpUpnonmgh6+IzR3lGj0wDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB # /wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoG # A1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8v # c2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNVHR8EQjBAMD6gPKA6hjhodHRw # Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2 # LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUHMAKGOGh0dHA6Ly9jcnQuc2Vj # dGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3J0MCMGCCsG # AQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOC # AYEAhLlUlrWxmB3MSCX9LcaY3p6jCnaeFR4chgRmhjdH+Gy5UyFpEq1/3X/Pv2Ih # GGnX0uVbXsQ90D/CwFk7bXCFUUblu4ldzNqjmnf+lcTtv/WJR9FTS9t79WdiWbuN # /YIEXVDERUGPC7v55aaJvXJbDS+4vYeJPAHl2xsvbARWui1nwBLOSVGTGk6T2Q6s # BnlHFToFc4UFtMhYUMf8L03jypocNGM9z6yamsOANd/dXt582U5DD0g7SVS2pyHD # Ot7UvVq6769TGZNwq9s1tFwQjm3IGz4DIO1ADMwoGLzqqalYQ1xq2JAqUq41hSlN # YHecLTjAOTwA81wv71XbZdARR0DfmpqdzdKkTbVucWhJFWL7clDQ0WzfAx1/ZsjR # t6X9p+XuLnJPMD3V5swX52ZCcB6LY3FyK7kgwNseH+Xqo+Ln7OtAs3Bwa/Cm9lbL # xYs8wkDitxFnpKFstyE7EE+wtEJkyszfLqjkmUCw/hjzX6I40hahbPCxaxdlv8+3 # drczMYIaUzCCGk8CAQEwaDBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGln # byBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcg # Q0EgUjM2AhBQGj1MeADxcRs/FOU26uyrMA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYB # BAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC # NwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILvxPGVFkMi8Ptrj # fE0jOsymq7Mq/rHEHa+pimR+x+WqMA0GCSqGSIb3DQEBAQUABIICAFY2yWr/w+U5 # paFQPHsJpCYkYMRGLxPDuAsCtmaKJag9NUFk/Za8pKRoQ1Jk2/5xs1AD63pt9KF1 # a2xn6xoZ5shxtYIgJ8E0ScZq+57OdPTBF7xQdSGPGpjYzFiEC9WiLW0IDIs60OOF # 9F8EkvvoUFQ7dP4eEXQc1MTOlbl+QGnPtWjPUvvfV9CXbZHmcHHCP7zWlJmNEqay # qh88+K0DgEjz2cGO9FpSBmujIXUkaLFaW8hT6JRUBadeQrxPGsS0Yhz3QFikvl+5 # ZUtpuY6LhBJVDVxklFoypBF7zUNoBFErG6/Go+Fw1zc89f4Tfjtfy3LYoCKXIEhj # iZA3cWfybwk3/bo8tanZX87QbSX1tEn/8M50iZSbM3/KNpcPKbNaZUJ+WfA5gYzZ # iW+Qsbp6cLbaO+wpjpkcBycjC4u4qdTqVZRfABY2di+mc9xggF4i53Zzd3X05pBy # SV/VdoitB8FtCB3HGTi8NPX9fvxae+kSPeQxCooyFBpkCKMZTEBWjw73765CNlzj # qpg7F0MeqM5QwoO3TJWnrM1ooyTiagZvj7gTjaQbBU/Y24toDOfu4hwrY77o5X0n # mSxeSCT/DYvI05RjbxjKYgH+Pt4q2thAUpud3XZmRAY1DBDMu1UlXZgQQHK2WiEo # OOJGnI1clkH5tBFVCkoBJe3BU3ObqeNroYIXPjCCFzoGCisGAQQBgjcDAwExghcq # MIIXJgYJKoZIhvcNAQcCoIIXFzCCFxMCAQMxDzANBglghkgBZQMEAgEFADB4Bgsq # hkiG9w0BCRABBKBpBGcwZQIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAE # IBDWLifuX8qIGgpAjqylLc6RglY2twg4vd6XESNuQ/r1AhEAivfawO40vVtKkM1g # Uris+xgPMjAyMzA3MjAxNDUzNThaoIITBzCCBsAwggSooAMCAQICEAxNaXJLlPo8 # Kko9KQeAPVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoT # DkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJT # QTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0yMjA5MjEwMDAwMDBaFw0z # MzExMjEyMzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEk # MCIGA1UEAxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIgLSAyMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43BDZrboegUhXQzGias0BxV # Hh42bbySVQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW+3KxlzpVrzPsYYrppijb # kGNcvYlT4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7KhbnUEi7iGkMiMbxvuAvfTux # ylONQIMe58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd4lz1L+2N1E2VhGjjgMtq # edHSEJFGKes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtAbm8WqJqclUeGhXk+DF5m # jBoKJL6cqtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhYHTno+EyREJZ+TeHdwq2l # fvgtGx/sK0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbvBkTkVf826uV8MefzwlLE # 5hZ7Wn6lJXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EIa/tTQznQZPpWz+D0CuYU # bWR4u5j9lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvmQaRllMBY5eUuKZCmt2Fk # +tkgbBhRYLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mNec9ixezhe7nMZxMHmsF4 # 7caIyLBuMnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XSfRkpWQNO+l3qRXMchH7X # zuLUOncCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAA # MBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsG # CWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNV # HQ4EFgQUYore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0 # cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNI # QTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0 # cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5 # NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAVaoq # GvNG83hXNzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV+zbCSVEseIhjVQlGOQD8 # adTKmyn7oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMUKkWHSphCK1D8G7WeCDAJ # +uQt1wmJefkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyYQfD2DoD75P/fnRCn6wC6 # X0qPGjpStOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrSBWcrduv/mLImlTgZiEQU # 5QpZomvnIj5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue4p7k0x+GAWScAMLpWnR1 # DT3heYi/HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5Dmhiuw8nLw/ubE19qtcfg # 8wXDWd8nYiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqLxksVStOYkEVgM4DgI974 # A6T2RUflzrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprVwvDGIqhPm73YHJpRxC+a # 9l+nJ5e6li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpxtU56mWz06J7UWpjIn7+N # uxhcQ/XQKujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxjqCU4lwHSPzra5eX25pvc # fizM/xdMTQCi2NYBDriL7ubgclWJLCcZYfZ3AYwwggauMIIElqADAgECAhAHNje3 # JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYD # VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAf # BgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBa # Fw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2Vy # dCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNI # QTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK # AoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVC # X6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf # 69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvb # REGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5 # EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbw # sDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb # 7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqW # c0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxm # SVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+ # s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11G # deJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCC # AVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxq # II+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/ # BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggr # BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVo # dHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0 # LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v # RGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjAL # BglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tgh # QuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qE # ICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqr # hc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8o # VInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SN # oOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1Os # Ox0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS # 1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr # 2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1V # wDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL5 # 0CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK # 5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjAN # BgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg # SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2Vy # dCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1 # OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVk # IFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN67 # 5F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaX # bR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQ # Lt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82s # NEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4Da # tpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwh # TNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98Fp # iHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppE # GSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+ # 9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56 # rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 # oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/ # BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgw # FoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUF # BwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMG # CCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRB # c3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwz # LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0g # BAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW # 1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH3 # 8nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMT # dydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY # 9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyer # bHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmU # MYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs # IEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEy # NTYgVGltZVN0YW1waW5nIENBAhAMTWlyS5T6PCpKPSkHgD1aMA0GCWCGSAFlAwQC # AQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUx # DxcNMjMwNzIwMTQ1MzU4WjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBTzhyJNhjOC # kjWplLy9j5bp/hx8czAvBgkqhkiG9w0BCQQxIgQgG/8y/O09haO6M1fE3fTU4AZ3 # UiJaMxzYi5BglmoqPhUwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgx/ThvjIoiSCr # 4iY6vhrE/E/meBwtZNBMgHVXoCO1tvowDQYJKoZIhvcNAQEBBQAEggIAs/jbbo0l # 24MHJe2ngPhRDaunJG7aTCZq0cgWtceYX4EBQYwC6pIzBQ/OOX+7WJSM/ZBsrsje # Inmm1cOekaS76mF/FZUYTAyye7lzWiemqUhc1H+gggIg9y+gbuQgUu7k007U9/En # 6XFGP0+6RxEmI3j8p2DKhDbFTPKRPkChukZ1r92aRYISGkSdLr/TX+kLb+OxYTlW # EPkh0cDZMqmCOHV0rw3h/lXWZMkfpMCidWUl/QjaGnfXtflF14VvcvhUUw9DqSNc # /bts1HkYiKPQMsVF3+dFblNOHkm66hcSaMQDaSQ1xn+Q2934IIR7miHmCz5K5bei # 1E7mIZH/JKtzp2MP5GvOPtsHvO2tyfJ8K5q/BL13Wv6kAvhrh8KGHRBMLdyrPDsg # A6Cvcx/cfCOpEWe5zKhQKxzjba8pATyKZ8H/UPc+31WxsSlMmPnGs7l8BHN6TUot # eOafYUVBMWk5iw/eP5x/gytLGt3y0GfpNJ18fVGYl3EjxRqIjRUpQSCT2GqtJptq # AsLGZ6Jvfny7D6UySKFX35w5nqlcCyo7UTvfvHv38Q6ydQ7f7vSB5e1JgtsvkxIP # chrCyyRJeA3TzCAbKj4PPUf3/zq1cHnpvmu51h0X9QQUid9TFpfcP0I9/1px7xIJ # LFx/dXojIGe7sj49S2yCBZR7IfDoZ6tLGnw= # SIG # End signature block |