sergey vasin

The IT blog

Используем PowerShell и WMI или CIM для просмотра и настройки планов электропитания – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Microsoft Scripting Guy, Ed Wilson показывает как использовать Windows PowerShell и WMI или CIM для просмотра и настройки планов электропитания.

Все эти поезда, выступления на User Groups, и опять поезда заставили меня задуматься: я обычно включаю мой ноутбук на полную мощность во время выступления – конечно на это время я всегда включаю его в розетку. Но когда я в поезде или в самолете, мой ноутбук обычно работает от аккумулятора. Таким образом, когда я подключаю ноутбук к электросети, я хочу, чтобы он работал на полную мощность, а когда он работает от аккумулятора, мне нужно чтоб он работал в режиме экономии энергии. Мне кажется это повод для написания нового PowerShell скрипта. Но сначала я хочу немного поговорить о WMI, CIM и WMI-классе Win32_PowerPlan.

Получаем список планов электропитания

В Windows 7 появился новый класс WMI – Win32_PowerPlan. Он находится в пространстве имен (namespace) Root\Cimv2\Power. Так как это не пространство имен по умолчанию – Root\Cimv2 – мы должны явно указывать его в коде. Для получения списка всех планов электропитания на ноутбуке я могу воспользоваться либо командлетом Get-WmiObject, либо — если это WindowsPowerShell 3.0 – командлетом Get-CIMInstance. Оба командлета предоставляют необходимую информацию и разница в их использовании заключается в простой замене имени одного командлета на имя другого. Пример использования Get-WmiObject приведен ниже, где gwmi– это алиас для командлета Get-WmiObject, -NS – алиас для параметра -NameSpace, select – алиас для командлета Select-Object, ft – алиас для командлета Format-Table, -a– первая буква параметра -autosize.

gwmi -NS root\cimv2\power -Class win32_PowerPlan | select ElementName, IsActive | ft -a

ElementName      IsActive

————      ———

Balanced            False

High performance     True

Power saver         False

Расширенная версия команды приведена ниже. Это та же однострочная команда с полными именами командлетов и параметров. Она разделена на несколько строк для удобства восприятия:

Get-WmiObject -Namespace root\cimv2\power -Class win32_PowerPlan |

Select-Object -Property ElementName, IsActive |

Format-Table -Property * -AutoSize

Если в сокращенной версии команды просто заменить имя командлета на Get-CimInstance – при запуске появится сообщение об ошибке. Это потому, что командлет Get-CimInstance не обладает алиасом -NS для параметра -Namespace (кроме того, Get-CimInstance использует параметр -classname, а не -class для указания класса). Ошибка приведена на рисунке ниже.

01

Простое решение заключается в указании алиаса -N вместо -NS.

PS C:\> Get-CimInstance -N root\cimv2\power -Class win32_PowerPlan | select ElementNa

me, IsActive | ft -a

ElementName      IsActive

————      ———

Balanced            False

High performance     True

Power saver         False

Активируем определенный план электропитания

Для активизации плана электропитания мне всего лишь нужно вызвать метод Activate для определенного экземпляра WMI-класса Win32_PowerPlan. Это означает, что мне нужно получить определенный план электропитания посредством класса WMI Win32_PowerPlan и вызвать метод Activate. Это достаточно просто при использовании командлета Get-WmiObject, и чуть сложнее при использовании CIM.

Заметка: Новый метод работы с классами WMI – это использование интерфейса CIM. WMI COM интерфейс теперь считается устаревшим. Это означает, что вам нужно начать изучать новые CIM-командлеты и использовать вместо устаревших методов. CIM-командлеты гораздо более мощные, и изучив их, вы найдете, что они более просты в понимании и использовании. Хороший обзор CIM-командлетов вы можете найти в этой статье.

Я проиллюстрирую каждый из вариантов в следующих разделах.

Используем Get-WmiObject

Сначала я добавлю фильтр в командлет Get-WmiObject, чтобы он вернул только один план электропитания. В моем случае мне нужен план «PowerSaver». Я сохраню возвращенный объект в переменной $p. После этого я вызову метод Activate.

$p = gwmi -NS root\cimv2\power -Class win32_PowerPlan -Filter «ElementName =’Power Saver'»

$p.Activate()

Для того, чтобы убедиться, что команда сработала, я могу воспользоваться следующим запросом, однако это и так очевидно, судя по потемневшему экрану.

gwmi -NS root\cimv2\power -Class win32_PowerPlan -Filter «IsActive = ‘true'»

Если и это не развеет мои сомнения, я могу открыть диалоговое окно PowerOptions.

 02

Используем CIM-командлеты для изменения плана электропитания

Процедура изменения плана электропитания на моем ноутбуке одинакова как при использовании CIM-командлетов, так и при использовании командлета Get-WmiObject – мне нужно получить экземпляр плана электропитания и активировать его.

Однако, CIM-командлеты на позволяют вызывать методы из десериализованных (de-serialized) или не живых (non-live) объектов. Делать это – не самая лучшая идея, так как это потенциально может вызвать некоторую нестабильность. Интерфейс WMI COM позволяет вызывать методы из неживых объектов. Когда я использую командлет Get-WmiObject для получения списка процессов (посредством класса Win32_Process), полученные объекты процессов больше не являются живыми. Я могу остановить процессы, запустить процессы, однако эти изменения не отобразятся на объекте, содержащемся в переменной.

Это то – о чем часто забывают. Если я решу остановить процесс, объект которого содержится в переменной, но этот процесс более не существует, появится сообщение об ошибке. При использовании CIM, эта ошибка никогда не появится, поскольку я не могу вызывать методы для возвращенных объектов. Вместо этого, мне нужно использовать командлет Invoke-CimMethod. Я воспользуюсь той же процедурой, что и с командлетом Get-WmiObject.

p = Get-CimInstance -Name root\cimv2\power -Class win32_PowerPlan -Filter «ElementName = ‘High Performance'»

Invoke-CimMethod -InputObject $p -MethodName Activate

Заметка: О чем мне следует упомянуть, так это о том, что CIM-интерфейс работает поразительно быстро. Если вызов метода при использовании Get-WmiObject занимал около 10 секунд, то Invoke-CimMethod отработал почти мгновенно.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/27/use-powershell-and-wmi-or-cim-to-view-and-to-set-power-plans.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Декабрь 6, 2012 в 12:43

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with , ,

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s