Невозможно получить доступ к теневому копированию тома, пока к нему не получит доступ через графический интерфейс [powershell] - PullRequest
0 голосов
/ 27 июня 2018

Я пишу простой скрипт powershell, который автоматизировал бы внешнее резервное копирование с файлового сервера Windows на другой удаленный сервер Windows. Файлы могут использоваться, поэтому для того, чтобы Robocopy успешно скопировал их, мне нужно скопировать файлы из последней доступной теневой копии тома для этого конкретного диска.

Я могу найти последний Shadow Copy с Powershell просто отлично; проблема в том, что я не могу «ссылаться» на него (монтировать) для доступа к файлам в теневой копии.

Но это «волшебным образом» изменится, если я впервые получу доступ к содержимому Shadow Copy через Windows Explorer GUI

И вдруг я могу получить доступ к теневому копированию и скопировать содержимое на удаленный сервер резервного копирования.

Вот код, о котором идет речь:

#Find the latest Shadow copy
$HDDriveID = (Get-WmiObject win32_volume -filter "DriveLetter='E:'").DeviceID
$LastShadowCopy = Get-WmiObject win32_shadowcopy | Where-Object {$_.VolumeName -eq $HDDriveID} | Sort-Object InstallDate | Select-Object -Last 1

# And parse the path so that we can mount it
$arr = $LastShadowCopy.InstallDate.Split('+').Split('.')
$VolumeShadowCopytime = [DateTime]::ParseExact($arr[0], 'yyyyMMddHHmmss', $null)
$UTCTime = $VolumeShadowCopytime.AddHours(-[int]$arr[2]/60)
$VolumeShadowCopyPath = "\\127.0.0.1\E$\@GMT-" + (Get-Date $UTCTime).ToString("yyyy.MM.dd-HH.mm.ss") + "\"

# Then, let's actually mount it:
New-PSDrive -Name Y -PSProvider FileSystem -Root $VolumeShadowCopyPath

Если я запускаю эту часть скрипта без доступа к последней теневой копии через графический интерфейс, я получаю следующую ошибку:

New-PSDrive : The specified drive root "\\127.0.0.1\E$\@GMT-2018.06.27-05.00.09\" either does not exist, or it is not a folder.
At [scriptlocation]\BackupToAzureDrive.ps1:21 char:1
+ New-PSDrive -Name Y -PSProvider FileSystem -Root $VolumeShadowCopyPat ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ReadError: (Y:PSDriveInfo) [New-PSDrive], IOException
    + FullyQualifiedErrorId : DriveRootError,Microsoft.PowerShell.Commands.NewPSDriveCommand

Опять же, как только на теневую копию (по-видимому?) Правильно ссылается Windows, когда я открываю ее через Проводник Windows, я не получаю такой ошибки. Shadow Copy монтируется без проблем, и я могу получить доступ к файлам и папкам.

Я не гуру Powershell, и я не очень увлечен этим. Я застрял с этой проблемой в течение нескольких дней. Кто-нибудь есть идеи, как решить эту проблему и / или знает об обходном пути?

1 Ответ

0 голосов
/ 01 июля 2018

Посмотрев на этот вопрос о переполнении стека здесь Я получил свой ответ. Я встречал этот ответ ранее, но отклонил его, потому что он предлагает использовать mklink для «сопоставления» копии VS, а не нативного New-PSDrive . На самом деле я слишком быстро просмотрел ответ и пропустил важный совет. Виноват. Престижность парню, отвечающему в первый раз, Ансгар Вичерс .

В любом случае, похоже, что правильный способ ссылки на теневую копию - сначала выбрать нужную теневую копию, а затем получить доступ к свойству DeviceObject . Таким образом, мой код, необходимый для отображения конкретной теневой копии, сокращается до трех строк (и да, скорее всего, его можно уменьшить еще больше (и преобразовать в CIM вместо od WMI)):

#Find the latest Shadow copy
$HDDriveID = (Get-WmiObject win32_volume -filter "DriveLetter='E:'").DeviceID
$LastShadowCopy = Get-WmiObject win32_shadowcopy | Where-Object {$_.VolumeName -eq $HDDriveID} | Sort-Object InstallDate | Select-Object -Last 1
# Then mount it:
New-PSDrive -Name Y -PSProvider FileSystem -Root ($LastShadowCopy.DeviceObject + "\")

Работает отлично. Опять же, поведение согласуется с предыдущим: как только я ссылаюсь (и сопоставляю букву диска) с определенным Shadow Copy с кодом выше, я снова могу использовать форму "\ 127.0.0.1 \ E $ \ @ GMT-2018.06.27 -05.00.09 \ ". В любом случае, это не имеет значения, потому что, когда мне назначено теневое копирование на букву диска, я, очевидно, могу получить доступ к содержимому через эту букву диска.

В любом случае, я доволен решением. Хотя вопрос был задан и получен ответ, я подумал, что это может помочь кому-то с такой же проблемой, если я не просто сделаю ссылку на существующий вопрос.

...