По мотивам темы на форуме - 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: