Как найти и открыть предыдущие версии папки программно (используя PowerShell, WMI и т. Д.)?
Я использую Windows 8 Enterprise x64. Когда я открою \\localhost\c$
в качестве сетевой папки, а затем с помощью контекстного меню откройте окно свойств подпапки (например, \\localhost\c$\Deploy
как в примере ниже), есть вкладка Предыдущие версии, где я могу увидеть список доступных предыдущих версий папки вместе с соответствующими временными метками:
Если я выбираю версию и нажимаю кнопку " Открыть", открывается новое окно проводника, где я могу просмотреть выбранную предыдущую версию папки:
В адресной строке отображается место, где к каждому имени папки добавляется метка времени (в длинной, удобочитаемой форме). Это местоположение, если оно скопировано оттуда, не может быть напрямую использовано в качестве допустимого пути в другом окне проводника или в инструменте командной строки. Но если я открою окно свойств субфлода, то оно отображает расположение подпапки в форме, подобной \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy
, Эта форма может фактически использоваться как в Проводнике, так и в командной строке:
C:\>dir \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy /s
Volume in drive \\localhost\c$ is OSDisk
Volume Serial Number is ▨▨▨▨-▨▨▨▨
Directory of \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy
04/11/2013 10:53 AM <DIR> .
04/11/2013 10:53 AM <DIR> ..
04/11/2013 10:53 AM <DIR> Tools
0 File(s) 0 bytes
Directory of \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy\Tools
04/11/2013 10:53 AM <DIR> .
04/11/2013 10:53 AM <DIR> ..
04/11/2013 10:53 AM <DIR> x64
0 File(s) 0 bytes
Directory of \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy\Tools\x64
04/11/2013 10:53 AM <DIR> .
04/11/2013 10:53 AM <DIR> ..
08/30/2012 06:10 PM 325,272 ▨▨▨▨▨▨▨▨.dll
1 File(s) 325,272 bytes
Total Files Listed:
1 File(s) 325,272 bytes
8 Dir(s) 70,546,321,408 bytes free
И в PowerShell тоже:
PS C:\> pushd \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy
PS Microsoft.PowerShell.Core\FileSystem::\\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy> ls -r
Directory: \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 4/11/2013 10:53 AM Tools
Directory: \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy\Tools
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 4/11/2013 10:53 AM x64
Directory: \\localhost\c$\@GMT-2013.08.27-04.01.18\Deploy\Tools\x64
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 8/30/2012 6:10 PM 325272 ▨▨▨▨▨▨▨▨.dll
Похоже, папка с волшебным именем @GMT-2013.08.27-04.01.18
(предположительно представляющий метку времени в часовом поясе GMT) ведет себя так, как если бы он действительно вышел из нее, за исключением того, что вы не можете обнаружить его существование с помощью dir
команда, если вы уже не знаете его имя. Все файлы и папки в этой папке доступны только для чтения: ничто не может быть создано, удалено, переименовано или изменено там (включая атрибуты файла / папки и разрешения). Если вы являетесь администратором, но у вас нет разрешений на просмотр определенных файлов, вы не можете изменить это, если сначала вам не удастся скопировать содержащую папку в не доступное для чтения место.
Вопрос: Можно ли получить список версий определенной папки, такой как показана на первом снимке экрана, и программно открыть одну из них в новом окне проводника (используя PowerShell, WMI, WSH, BAT, Win32 API и т. Д.)? Можно ли получить список соответствующих папок с волшебными именами вроде
@GMT-2013.08.27-04.01.18
программно?
1 ответ
volrest
Утилита, доступная в Windows Server 2003 Resource Kit Tools, может быть использована для отображения предыдущих версий папки. Он работал для меня в Windows 7 и все еще должен работать в Windows 8. Просто будьте осторожны с вашими параметрами, так как он также может восстановить предыдущие версии.
Пример использования (из приведенной ниже ссылки):
C:\>volrest "\\test220\reports\Annual Reports 2004\doc.4.rtf"
VOLREST 1.1 - Previous Version command-line tool
(C) Copyright 2003 Microsoft Corp.
Searching previous versions on \\test220\reports\annual report 2004\doc.4.rtf
07/01/2004 01:28 PM 37,786 \\test220\reports\@GMT-2004.07.01-18.34.35\annual
report 2004\doc.4.rtf
07/01/2004 01:27 PM 37,740 \\test220\reports\@GMT-2004.07.01-18.28.02\annual
report 2004\doc.4.rtf
07/01/2004 11:47 AM 37,690 \\test220\reports\@GMT-2004.07.01-18.24.41\annual
report 2004\doc.4.rtf
3 File(s) 113,216 bytes
0 Dir(s)
С выходом этой программы, может быть использован с /B
Параметр для пустого формата, вы должны быть в состоянии создать сценарий, который будет исследовать одну из перечисленных версий.
Для получения дополнительной информации см.: Windows Server Hacks: Восстановление теневых копий с помощью командной строки.
Вот пример того, как использовать
volrest
в пакетном файле, чтобы найти путь к самым новым и самым старым теневым копиям на локальном или удаленном сервере. Возвращенные пути можно использовать напрямую без необходимости использования
mklink
. Протестировано локально на Windows Server 2019 и удаленно из Windows 10.
:: Proof of concept for finding shadow copy paths on a local or remote server.
:: Requires volrest.exe from the Windows Server 2003 Resource Kit Tools:
:: https://www.microsoft.com/en-us/download/details.aspx?id=17657
@ECHO OFF
SET SERVER=LOCALHOST
:: Loop through output of volrest run against a test folder. Note that volrest returns
:: items in reverse chronological order and skips shadow copies if the folder hasn't
:: changed between shadow copies. I found that the Windows\Temp folder was updated
:: frequently enough for my purposes.
::
:: If we're run after the last shadow copy but BEFORE the Windows\Temp folder has been
:: updated, then volrest won't list the latest shadow copy. We can fix this by writing a
:: dummy file to the Windows\Temp folder first and then deleting it. Uncomment the
:: following two commands if this might be an issue for you.
:: Optional code to force a dummy update to ensure latest shadow copy is found
:: TYPE NUL > \\%SERVER%\C$\Windows\Temp\ShadowCopyFind.tmp
:: DEL \\%SERVER%\C$\Windows\Temp\ShadowCopyFind.tmp
FOR /F "TOKENS=3 DELIMS=\" %%A IN ('volrest.exe /B \\%SERVER%\C$\Windows\Temp*') DO (
IF NOT DEFINED GMT_TOKEN_NEWEST SET GMT_TOKEN_NEWEST=%%A
SET GMT_TOKEN_OLDEST=%%A
)
ECHO Path to Newest Shadow Copy: \\%SERVER%\C$\%GMT_TOKEN_NEWEST%
ECHO Path to Oldest Shadow Copy: \\%SERVER%\C$\%GMT_TOKEN_OLDEST%
Пример вывода:
Path to Newest Shadow Copy: \\LOCALHOST\C$\@GMT-2020.05.05-16.30.02
Path to Oldest Shadow Copy: \\LOCALHOST\C$\@GMT-2020.03.20-22.30.01
Я использую это как часть ночного
robocopy
задание, которое я запланировал запустить после последней теневой копии моего Сервера за день. Это позволяет мне использовать теневые копии предыдущих версий, которые уже создает мой сервер, и гарантирует, что мои
robocopy
job не обнаруживает заблокированных файлов и обеспечивает истинную согласованность "на определенный момент времени".
Поздний ответ, но я пытался volrest
и он не работает на Windows 10. Как заметил OP, @GMT-yadayadayada
Волшебная папка не появится, пока вы не откроете ее в Проводнике на вкладке Предыдущие версии в Свойствах.
Подход, который работал для меня, это использовать mklink
, В качестве администратора на рассматриваемом компьютере / сервере откройте командную строку и введите vssadmin list shadows
:
C:\WINDOWS\system32>vssadmin list shadows
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2013 Microsoft Corp.
Contents of shadow copy set ID: {5a052a28-96de-4924-b669-9e671b5ce069}
Contained 1 shadow copies at creation time: 4/07/2019 4:31:12 PM
Shadow Copy ID: {aaeab260-fef9-4ddc-9190-78d226de07a7}
Original Volume: (C:)\\?\Volume{010e4355-9f97-4911-99f7-4ef45974b946}\
Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
Originating Machine: DESKTOPPC.domain.local
Service Machine: DESKTOPPC.domain.local
Provider: 'Microsoft Software Shadow Copy provider 1.0'
Type: ClientAccessibleWriters
Attributes: Persistent, Client-accessible, No auto release, Differential, Auto recovered
Contents of shadow copy set ID: {f2494e05-cb0c-4161-aa67-a545fe562b50}
Contained 1 shadow copies at creation time: 11/07/2019 3:00:16 AM
Shadow Copy ID: {c3e0566b-0b39-4080-b5ae-ca6e2a2c56c4}
Original Volume: (C:)\\?\Volume{010e4355-9f97-4911-99f7-4ef45974b946}\
Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2
Originating Machine: DESKTOPPC.domain.local
Service Machine: DESKTOPPC.domain.local
Provider: 'Microsoft Software Shadow Copy provider 1.0'
Type: ClientAccessibleWriters
Attributes: Persistent, Client-accessible, No auto release, Differential, Auto recovered
Contents of shadow copy set ID: {aa9f8acb-0a06-4584-9f9e-dee2269b88f3}
Contained 1 shadow copies at creation time: 19/07/2019 3:45:20 AM
Shadow Copy ID: {9e3044a8-19e9-4fa8-82ea-b97a836a71d2}
Original Volume: (C:)\\?\Volume{010e4355-9f97-4911-99f7-4ef45974b946}\
Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3
Originating Machine: DESKTOPPC.domain.local
Service Machine: DESKTOPPC.domain.local
Provider: 'Microsoft Software Shadow Copy provider 1.0'
Type: ClientAccessibleWriters
Attributes: Persistent, Client-accessible, No auto release, Differential, Auto recovered
Найдите поле " Объем теневого копирования" и используйте следующую команду, чтобы сопоставить нужную папку с новой папкой (в данном случае последней в списке):
C:\>mklink /d C:\vsstest \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\
symbolic link created for vsstest <<===>> \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\
Убедитесь, что вы добавили обратную косую черту, как я сделал выше, иначе она не будет работать.
Теперь у вас будет собственная волшебная папка для доступа к предыдущей версии содержимого вашего жесткого диска:
C:\>dir vsstest
Volume in drive C is Local Disk
Volume Serial Number is DEAD-BEEF
Directory of C:\vsstest
26/06/2018 12:49 PM 1,024 .rnd
01/07/2019 01:01 PM <DIR> apps
20/12/2018 10:51 AM <DIR> ESD
29/05/2019 09:16 PM <DIR> inetpub
29/01/2018 12:33 PM <DIR> Intel
19/03/2019 02:52 PM <DIR> PerfLogs
04/07/2019 04:32 PM <DIR> Program Files
16/07/2019 12:40 PM <DIR> Program Files (x86)
30/05/2019 11:26 AM <DIR> Scripts
14/06/2019 10:46 AM <DIR> temp
16/10/2018 01:12 PM <DIR> Tools
28/05/2019 09:19 AM <DIR> Users
18/06/2019 09:22 AM <DIR> VMs
11/07/2019 03:39 AM <DIR> Windows
1 File(s) 1,024 bytes
14 Dir(s) 107,573,796,864 bytes free
Чтобы удалить его после того, как вы закончите, используйте rmdir
,
$DST_info = Get-WmiObject -Class Win32_TimeZone |select @{n='DST_end';e={get-date ([string]$_.StandardMonth+'/'+$_.StandardDay+'/'+(get-date).year) -f "MM/dd/yy"}},@{n='DST_Start';e={get-date ([string]$_.DaylightMonth+'/'+$_.DaylightDay+'/'+(get-date).year) -f "MM/dd/yy"}}
# DST_end DST_Start
# ------- ---------
# 11/01/20 03/02/20
$shadows = Get-CimInstance -ClassName Win32_ShadowCopy -ComputerName MyFileServer
# $shadows | select installDate
foreach($shadow in $shadows)
{
if ([datetime]$shadow.installdate -ge [datetime]$DST_info.DST_Start -and [datetime]$shadow.installdate -lt [datetime]$DST_info.DST_end) {$offset = 4} else {$offset = 5}
ls ("K:\@GMT-" + (get-date (get-date $shadow.installdate).addhours($offset) -f "yyyy.MM.dd-HH.mm.ss"))
}
Я нашел решение, использующее.NET.
Я искал и искал возможность программно перечислить предыдущие версии, но не смог найти решения для просмотра предыдущих версий на общем ресурсе SMB / CIFS. Volrest, vssadmin, alphaVss и т. Д. Даже win32_shadowCopy не удалось, потому что наши целевые машины - это netapps. Ничего не получилось.
Затем я нашел этот пост, в котором говорится, что они могут использовать команды SMB в Perl для их просмотра. Если Perl может это сделать, то наверняка сможет и WinAPI. FSCTL_SRV_ENUMERATE_SNAPSHOTS
нужна команда SMB.
Наконец, я нашел эту DLL, созданную kenjiuno для.NET. После добавления ссылки на DLL kenjiuno я назвал ее:
Dim s() as String = LibEnumRemotePreviousVersion.PreviousversionOnRemote("\\server\share")
Все предыдущие версии были возвращены как
@GMT-blablabla
. Затем все, что вам нужно сделать, это добавить тот, который вы хотите, в конец вашего UNC-пути.
Нет
mklink
, нет сопоставления дисков и т.д. Все работает ровно и просто.