По мотивам темы на форуме - http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=4255895&SiteID=40. PowerShell без проблем может управлять восстановлением системы - SystemRestore средствами WMI. За это отвечает классы
Примечание: SystemRestore доступно только на клиентских версиях - Windows XP/Windows Vista. В серверных редакицях Windows Server нереализовано никак.
вот так выглядит GUI окно системы восстановления в Windows Vista:
Следует так же учесть, что эти классы не находятся в пространстве имён по умолчанию Root\Cimv2, а в Root\Default. Для просмотра всех точек восстановления нужно просто получить объект данного класса (если вы работаете под управлением Windows Vista, то потребуется запустить консоль с повышенными привилегиями!). При получении объекта класса не забудьте указать правильный путь размещения класса в пространстве имён:
PS C:\> gwmi -Namespace "root\default" -class systemrestore __GENUS : 2 __CLASS : SystemRestore __SUPERCLASS : __DYNASTY : SystemRestore __RELPATH : SystemRestore.SequenceNumber=473 __PROPERTY_COUNT : 5 __DERIVATION : {} __SERVER : THOR __NAMESPACE : root\default __PATH : \\THOR\root\default:SystemRestore.SequenceNumber=473 CreationTime : 20081220184403.157460-000 Description : Scheduled Checkpoint EventType : 100 RestorePointType : 7 SequenceNumber : 473 ......
у меня этих точек восстановления несколько, поэтому я показал только первую точку. Здесь нам будут интересны следующие свойства - Description (название точки восстановления), EventType (тип точки восстановления) и SequenceNumber (порядковый номер точки восстановления). Эти значения нам пригодятся для создания новых точек восстановления и отката системы до определённой точки. Если посмотреть методы класса, то получим:
PS C:\> gwmi -Namespace "root\default" -class systemrestore | gm TypeName: System.Management.ManagementObject#root\default\SystemRestore Name MemberType Definition ---- ---------- ---------- CreationTime Property System.String CreationTime {get;set;} Description Property System.String Description {get;set;} EventType Property System.UInt32 EventType {get;set;} RestorePointType Property System.UInt32 RestorePointType {get;set SequenceNumber Property System.UInt32 SequenceNumber {get;set;} __CLASS Property System.String __CLASS {get;set;} __DERIVATION Property System.String[] __DERIVATION {get;set;} __DYNASTY Property System.String __DYNASTY {get;set;} __GENUS Property System.Int32 __GENUS {get;set;} __NAMESPACE Property System.String __NAMESPACE {get;set;} __PATH Property System.String __PATH {get;set;} __PROPERTY_COUNT Property System.Int32 __PROPERTY_COUNT {get;set; __RELPATH Property System.String __RELPATH {get;set;} __SERVER Property System.String __SERVER {get;set;} __SUPERCLASS Property System.String __SUPERCLASS {get;set;} ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime(); ConvertToDateTime ScriptMethod System.Object ConvertToDateTime(); Delete ScriptMethod System.Object Delete(); GetType ScriptMethod System.Object GetType(); Put ScriptMethod System.Object Put(); PS C:\>
Мы здесь не видим никаких методов, которые бы позволяли создавать и откатываться. Получив объект мы можем его только удалить. Сами методы хранятся в самом классе:
PS C:\> [wmiclass]'\\.\root\default:systemrestore' | gm -MemberType method TypeName: System.Management.ManagementClass#ROOT\default\SystemRestore Name MemberType Definition ---- ---------- ---------- CreateRestorePoint Method System.Management.ManagementBaseObject CreateRestorePoint(System.String Description,... Disable Method System.Management.ManagementBaseObject Disable(System.String Drive) Enable Method System.Management.ManagementBaseObject Enable(System.String Drive, System.Boolean Wa... GetLastRestoreStatus Method System.Management.ManagementBaseObject GetLastRestoreStatus() Restore Method System.Management.ManagementBaseObject Restore(System.UInt32 SequenceNumber) PS C:\>
вот тут и хранятся наши методы. Методы Enable и Disable позволяют глобально включать режим восстановления системы или отключать для определённого диска. Чтобы включить мониторинг для всей системы в целом или для конкретного диска нужно выполнить:
# объявляем класс: $sysrestore = [wmiclass]'\\.\root\default:systemrestore' # выбираем одно из нужных действий. Обратите внимание, что для изменения состояния # мониторинга всей системы скобки не должны быть пустые, а содержать пустые двойные кавычки $sysrestore.Enable("") $sysrestore.Enable("c:\") $sysrestore.Disable("") $sysrestore.Disable("c:\")
Для создания новой точки воспользуемся методом CreateRestorePoint:
$sysrestore = [wmiclass]"\\.\root\default:systemrestore" $sysrestore.CreateRestorePoint("MyRestorePoint", 0, 100)
где MyRestorePoint - название точки восстановления, 0 - тип точки восстановления (возможные значения можно посмотреть по ссылке на MSDN) и 100 - тип события. Давайте создадим новую точку восстановления:
PS C:\> $sysrestore = [wmiclass]"\\.\root\default:systemrestore" PS C:\> $sysrestore.CreateRestorePoint("MyRestorePoint", 0, 100) __GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : ReturnValue : 0 PS C:\>
Значение RetrunValue = 0 говорит, что точка восстановления создана. Убедимся в этом:
PS C:\> gwmi -Namespace "root\default" -class systemrestore | select -Last 1 __GENUS : 2 __CLASS : SystemRestore __SUPERCLASS : __DYNASTY : SystemRestore __RELPATH : SystemRestore.SequenceNumber=475 __PROPERTY_COUNT : 5 __DERIVATION : {} __SERVER : THOR __NAMESPACE : root\default __PATH : \\THOR\root\default:SystemRestore.SequenceNumber=475 CreationTime : 20081221183404.006675-000 Description : MyRestorePoint EventType : 100 RestorePointType : 0 SequenceNumber : 475 PS C:\>
Вот теперь мы видим нашу точку восстановления с названием MyRestorePoint и её SequenceNumber стал на 1 больше. Чтобы откатиться на эту точку восстановления нужно выполнить метод Restore с указанием SequenceNumber:
$sysrestore = [wmiclass]"\\.\root\default:systemrestore" $sysrestore.Restore("475") (gwmi win32_operatingsystem).reboot()
Для успешного завершения восстановления точки восстановления потребуется перезагрузка системы, которую мы проводим последней строчкой. Вот так просто можно включать, отключать создавать точки восстановления и откатывать систему до их состояния. Чтобы управлять дополнительными параметрами восстановления системы, как выделение места для них, время жизни и т.д. воспользуемся соседним классом:
PS C:\> gwmi -Namespace "root\default" -class systemrestoreconfig __GENUS : 2 __CLASS : SystemRestoreConfig __SUPERCLASS : __DYNASTY : SystemRestoreConfig __RELPATH : SystemRestoreConfig.MyKey="SR" __PROPERTY_COUNT : 5 __DERIVATION : {} __SERVER : THOR __NAMESPACE : ROOT\default __PATH : \\THOR\ROOT\default:SystemRestoreConfig.MyKey="SR" DiskPercent : 15 MyKey : SR RPGlobalInterval : 86400 RPLifeInterval : 4294967295 RPSessionInterval : 1 PS C:\>
тут всё просто. DiskPercent показывает процент дискового пространства, которое выделяется под восстановление системы. RPGlobalInterval показывает периодичность создания точек восстановления (а для Windows Vista создание теневых копий) в секундах. RPLifeInterval - время жизни точек восстановления (и теневых копий для Windows Vista) в секундах (по умолчанию 90 дней). Эти параметры можно изменять простым переприсвоением и применением новых значений скриптметодом Put(). К сожалению, провайдер SystemRestore не позволяет удалять точки восстановления (вообще это можно с использованием функции SRRemoveRestorePoint, но это уже совсем другая история программирования).
Вот теперь мы готовы написать скрипт, который позволит в однострочном режиме управлять восстановлением системы.
######################################################## # SystemRestore.ps1 # Version 1.0 # # Functions for System Restore management # Note: available for Windows XP and Windows Vista only! # # Vadims Podans (c) 2008 # http://www.sysadmins.lv/ ######################################################## # функция для преобразования кода возврата в текстовое значение function _SysRestore_Get-Code ($Action) { switch ($Action.ReturnValue) { "0" {"Success"} default {"Unknown error $Action.ReturnValue"} } } # простая функция получения списка всех доступных точек восстановления в табличном виде function Get-SystemRestore { gwmi -Namespace "root\default" -class systemrestore | Select Description, @{n="Date/Time"; e={([System.Management.ManagementDateTimeconverter]::ToDateTime($_.CreationTime)).tostring()}}, @{n="Point number"; e={$_.SequenceNumber}} | ft -AutoSize } # функция включения или отключения System Restore для указанного диска или, если диск не указан # то действие будет принято для всей системы в целом. А так же позволяет откатывать систему # в более раннее состояние. function Set-SystemRestoreStatus ($Status, $arg) { # собственно, само действие включения или отключения System Restore switch ($status) { "Enable" {$action = ([wmiclass]'\\.\root\default:systemrestore').Enable("$arg")} "Disable" {$action = ([wmiclass]'\\.\root\default:systemrestore').Disable("$arg")} # процесс отката системы в более раннюю точку восстановления "Restore" {$RP = gwmi -Namespace "root\default" -class systemrestore | ?{$_.SequenceNumber -eq [int]$arg} # проверяем, что указанная точка восстановления существует. if ($RP) { # если существует, то проводим процесс восстановления в указанную точку $action = ([wmiclass]'\\.\root\default:systemrestore').Restore("$arg") Write-Host "Performing system restore to earlier status ..." # получаем код возврата операции _SysRestore_Get-Code $action # если восстановление системы прошло успешно, то принудительно перезагружаем систему if ($(_SysRestore_Get-Code $action) -eq "Success") { Write-Warning "To complete System Restore system will reboot in 15 sec" shutdown.exe -r -t 15 -f } }else { Write-Host "Specified restore point does not found!" } } "Create" {$action = ([wmiclass]'\\.\root\default:systemrestore').CreateRestorePoint("$arg", 0, 100)} } # здесь происходит только генерация сообщения о ходе выполнения операций if ($arg -and ("Enable", "Disable" -contains $status)) { Write-Host "Setting SystemRestore status to $status on" $arg _SysRestore_Get-Code $action } else { Write-Host "Setting SystemRestore status to $status on all drives: " _SysRestore_Get-Code $action } } # функция для изменения настроек System Restore function Set-SystemRestoreSetting ($setting, $value) { # получаем текущие настройки $SRSetting = gwmi -Namespace "root\default" -class systemrestoreconfig # проверяем выбранный параметр, который будет изменяться switch ($setting) { "DiskSpace" { # т.к. дисковое место указывается в процентах, то проверяем, что указано число от 1% до 99% if ($value -lt 99 -and $value -gt 1) { $SRSetting.DiskPercent = $value } else { Write-Warning "Disk space percentage must be integer and vlaue must be between 1-99"} } # установка глубины точек восстановлений. Указывается в днях. По истечении этого времени # точки восстановления удаляются, высвобождая место для более новых точек восстановления "HistoryDepth" { $SRSetting.RPLifeInterval = [int]$value * 86400 } # частота автоматического создания точек восстановлений "Frequency" { # извлекаем из заданного параметра периодичности последние 4 символа, которые образуют префикс # в днях или часах и выставляем множитель для получения секунд. Если это часы, то множитель будет # 3600, а если в днях, то множитель будет 86400 секунд $time = $value.substring($value.length - 4, 4) switch ($time) { "hour" {$sec = 3600} "days" {$sec = 86400} } # извлекаем из заданного параметра периодичности все символы, чтобы получить целочисленное значение # кроме последних 4, которые являются текстовыми и обозначают лишь префикс $SRSetting.RPGlobalInterval = $sec * $value.substring(0, $value.length - 4) } default {Write-Warning "Parameter must be DiskSpace or HistoryDepth or Frequency"} } # применение новых параметров $SRSetting.Put() }
Синтаксис функций может быть следующий:
Comments: