У меня есть то, что, как я думал, будет простой задачей с Data Protection Manager 2010, которая оказалась довольно неприятной. У меня есть файловый сервер на одном сервере, и это единственный сервер в группе защиты. Этот файловый сервер является репозиторием для приложения для управления документами, которое хранит файлы в соответствии с данными в базе данных SQL. Иногда пользователи непреднамеренно удаляют файлы из нашего приложения, и нам необходимо их восстановить. У нас есть вся информация, необходимая для восстановления файлов, включая имя файла, папку, в которой он был сохранен, и точную дату удаления файла. Мне легко восстановить файл из консоли DPM, так как точка восстановления создается каждый день, я просто перехожу на день до удаления, перехожу в нужную папку и восстанавливаю файл. Проблема в том, что при использовании консоли DPM громоздкому мастеру требуется около 20 щелчков мышью для восстановления одного файла, а для прохождения всех окон требуется 2–4 минуты. Это очень раздражает, когда клиенту нужно восстановить сотни файлов ... для восстановления файлов требуется целый день лишних щелчков мышью.
Поэтому я хочу использовать сценарий PowerShell (а я новичок в PowerShell) для автоматизации этого процесса. Я хочу иметь возможность создать сценарий, в котором я передаю имя файла, папку, дату точки восстановления (и, если необходимо, имя группы защиты / сервера) и просто восстанавливаю файл в исходное местоположение с помощью какого-то уведомление об успехе / неудаче. Я думал, что это простая основная задача решения для резервного копирования, но у меня чертовски много времени на поиск правильного кода.
Я видел образец кода на http://social.technet.microsoft.com/wiki/contents/articles/how-to-use-a-windows-powershell-script-to-recover-an-item-in-data-protection-manager.aspx я пытался следовать, но он не достигает того, что я действительно хочу сделать (это слишком упрощенно), и в образце кода есть ошибки. Поэтому я хотел бы получить помощь в написании сценария для восстановления этих файлов.
Примеры известных значений для восстановления данных:
DPM Server: BACKUP01
Protection Group: Document Repository Data
Protected Server: FILER01
File Path: R:\DocumentRepository\ToBackup\ClientName\Repository\2010\07\24\filename.pdf
Date Deleted: 8/2/2010 (last recovery point = 8/1/2010)
Если вы можете помочь мне не только создать этот сценарий, но и показать мне, как его автоматизировать, предоставив текстовый файл с указанной выше информацией, которую сценарий PowerShell просматривает, или, что еще лучше, может запросить наш SQL-сервер для получения необходимых данных, тогда я был бы более чем готов заплатить за эту разработку.
Что ж, после долгих разочарований и исследований я придумал рабочий сценарий. Для тех, кто хочет знать, как сделать то же самое, приведенный ниже сценарий отлично подходит для восстановления любого заданного файла.
<#
Parameters: Folder Path, File to Restore, Deletion Date
Example Usage:
.\RecoverFile.ps1 "ClientName\Folder\2010\02\03\" "mydoc.pdf" "2010-08-04 09:54:24.117"
#>
$filePath = [IO.Path]::Combine("D:\ClientData\", $args[0] )
$fileName = $args[1]
$dateDeleted = Get-Date $args[2]
Write-Host "Restoring '" -NoNewLine
Write-Host $filePath -NoNewLine
Write-Host $fileName -NoNewLine
Write-Host "' which was deleted on '" -NoNewLine
Write-Host $dateDeleted -NoNewLine
Write-Host "'"
$recoveryDate = Get-Date $dateDeleted.AddDays(-1).ToShortDateString()
$pg = Get-ProtectionGroup -DPMServerName DPMSERVER01 | Where-Object {$_.FriendlyName -eq "Document Repository Data"}
$ds = Get-Datasource $pg
$so = New-SearchOption -FromRecoveryPoint $recoveryDate.AddDays(-1).ToShortDateString() -ToRecoveryPoint $recoveryDate.ToShortDateString() -SearchDetail FilesFolders -SearchType exactMatch -Location $filePath -SearchString $fileName
$ri = Get-RecoverableItem -Datasource $ds -SearchOption $so
$ro = New-RecoveryOption -TargetServer CLIENTDATASERVER01 -RecoveryLocation OriginalServer -FileSystem -OverwriteType overwrite -RecoveryType Recover
$recoveryJob = Recover-RecoverableItem -RecoverableItem $ri -RecoveryOption $ro
#4.3 Wait till the recovery job completes
while (! $recoveryJob.hasCompleted )
{
# Show a progress bar
Write-Host "." -NoNewLine
Start-Sleep 1
}
if($recoveryJob.Status -ne "Succeeded")
{
Write-Host "Recovery failed" -ForeGroundColor Red
}
else
{
Write-Host "Recovery successful" -ForeGroundColor Green
}