Contents of this directory is archived and no longer updated.

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

systemrestore

Следует так же учесть, что эти классы не находятся в пространстве имён по умолчанию 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()
}

Синтаксис функций может быть следующий:

  • 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.

Share this article:

Comments:

Comments are closed.