По мотивам темы на форуме - 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, то потребуется запустить консоль с повышенными привилегиями!). При получении объекта класса не забудьте указать правильный путь размещения класса в пространстве имён:
[System32] 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 (порядковый номер точки восстановления). Эти значения нам пригодятся для создания новых точек восстановления и отката системы до определённой точки. Если посмотреть методы класса, то получим:
[System32] 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();
[System32]
Мы здесь не видим никаких методов, которые бы позволяли создавать и откатываться. Получив объект мы можем его только удалить. Сами методы хранятся в самом классе:
[System32] [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)
[System32]
вот тут и хранятся наши методы. Методы 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 - тип события. Давайте создадим новую точку восстановления:
[System32] $sysrestore = [wmiclass]"\\.\root\default:systemrestore"
[System32] $sysrestore.CreateRestorePoint("MyRestorePoint", 0, 100)
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0
[System32]
Значение RetrunValue = 0 говорит, что точка восстановления создана. Убедимся в этом:
[System32] 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
[System32]
Вот теперь мы видим нашу точку восстановления с названием MyRestorePoint и её SequenceNumber стал на 1 больше. Чтобы откатиться на эту точку восстановления нужно выполнить метод Restore с указанием SequenceNumber:
$sysrestore = [wmiclass]"\\.\root\default:systemrestore"
$sysrestore.Restore("475")
(gwmi win32_operatingsystem).reboot()
Для успешного завершения восстановления точки восстановления потребуется перезагрузка системы, которую мы проводим последней строчкой. Вот так просто можно включать, отключать создавать точки восстановления и откатывать систему до их состояния. Чтобы управлять дополнительными параметрами восстановления системы, как выделение места для них, время жизни и т.д. воспользуемся соседним классом:
[System32] 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
[System32]
тут всё просто. 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()
}
Синтаксис функций может быть следующий:
- Get-SystemRestore - показывает в табличном виде все существующие точки восстановления. Аргументов не принимает.
- Set-SystemRestoreStatus Enable c:\ - включает режим SystemRestore.
где c:\ - диск, для которого включается мониторинг SystemRestore. Параметр опциональный. Если не указан, то включается для всех дисков.
- Set-SystemRestoreStatus Disable c:\ - отключает режим systemRestore.
где c:\ - диск, для которого выключается мониторинг SystemRestore. Параметр опциональный. Если не указан, то выключается для всех дисков.
- Set-SystemRestoreStatus Restore 5 - производит откат системы до указанной точки восстановления. После отката произойдёт принудительная перезагрузка системы.
где 5 - номер точки восстановления. Номер можно получить выполнив функцию Get-SystemRestore.
- Set-SystemRestoreStatus Create "MyNewRestorePoint" - создаёт новую точку восстановления
где MyNewRestorePoint - название точки восстановления.
- Set-SystemRestoreSetting DiskSpace 10 - задаёт резервируемое место для точек восстановления в процентах от ёмкости диска.
где 10 - процент диска, которое отводится под SystemRestore. Может иметь значение от 1 до 99
- Set-SystemRestoreSetting HistoryDepth 10 - задаёт время хранения точек восстановления
где 10 - количество дней, в течении которого будут храниться точки восстановления. Более старые будут автоматически удаляться.
- Set-SystemRestoreSetting Frequence 5days - задаёт частоту автоматического создания точек восстановления.
где 5days - периодичность создания точек восстановления в днях. Можно указывать и в часах, например, 10hour (будет делать автоматические точки восстановления каждые 10 часов). В общем смысле сначала идёт число и потом без пробелов суффикс days или hour.