Существуют программные компоненты с интерфейсами платформы .NET Framework и COM, которые позволяют выполнять множество задач системного администрирования. Windows PowerShell позволяет использовать эти компоненты, поэтому задачи, которые могут быть выполнены, не ограничиваются только использованием командлетов. Большинство командлетов в первом выпуске Windows PowerShell не работают с удаленными компьютерами. Мы покажем, как преодолеть это ограничение при управлении журналами событий с помощью класса .NET Framework System.Diagnostics.EventLog непосредственно из оболочки Windows PowerShell.

Использование командлета New-Object для доступа к журналу событий

Библиотека классов платформы .NET Framework включает класс System.Diagnostics.EventLog, который используется для управления журналами событий. Можно создать новый экземпляр класса .NET Framework с помощью командлета New-Object с параметром TypeName. Например, следующая команда создает ссылку на журнал событий:

PS> New-Object -TypeName System.Diagnostics.EventLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----

Хотя команда и создала экземпляр класса EventLog, этот экземпляр не содержит данных. Это происходит в связи с тем, что не был указан определенный журнал событий. Как получить настоящий журнал событий?

Использование конструкторов с командлетом New-Object

Чтобы обратиться к определенному журналу событий, нужно указать его имя. Командлет New-Object имеет параметр ArgumentList. Значения, передаваемые в этом параметре, используются специальным методом запуска объекта. Этот метод называет конструктором, поскольку используется для создания объекта. Например, чтобы получить ссылку на журнал приложений, нужно указать строку "Application" в качестве аргумента:

PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application
Примечание.

Поскольку основные классы платформы .NET Framework содержатся в пространстве имен System, оболочка Windows PowerShell автоматически пытается найти указанные классы в пространстве имен System, если не сможет найти совпадений для указанного имени типа. Это значит, что можно указать класс Diagnostics.EventLog вместо класса System.Diagnostics.EventLog.

Сохранение объектов в переменных

Может понадобиться сохранить ссылку на объект для использования в текущей оболочки. Хотя оболочка Windows PowerShell позволяет выполнять больше задач с помощью конвейеров, что снижает необходимость в переменных, иногда сохранение ссылок на объекты в переменных позволяет работать с объектами с большим удобством.

Windows PowerShell позволяет создавать переменные, которые, по сути, являются именованными объектами. Вывод любой допустимой команды Windows PowerShell можно сохранить в переменной. Имена переменных всегда начинаются с знака "$". Если нужно сохранить ссылку на журнал приложений в переменной с именем $AppLog, введите имя переменной, знак равенства и команду, используемую для создания объекта журнала приложения:

PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Если после этого набрать $AppLog, будет выведено содержимое журнала приложения:

PS> $AppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16,384      7 OverwriteOlder          2,160 Application

Доступ к удаленному журналу событий с помощью командлета New-Object

Команды, рассмотренные в предыдущем разделе, обращаются к локальному компьютеру. Это возможно также с помощью командлета Get-EventLog . Чтобы получить доступ к журналу приложения на удаленном компьютере, необходимо в качестве аргументов ввести имя входа и имя (или IP-адрес) компьютера.

PS> $RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder            262 Application

Какие действия могут быть выполнены с переменной $RemoteAppLog после сохранения в ней ссылки на журнал событий?

Очистка журнала событий методами объектов

Для выполнения тех или иных действий у объектов часто имеются методы. Командлет Get-Member позволяет вывести методы, связанные с объектом. Следующая команда и выделенный фрагмент вывода показывают некоторые методы класса EventLog:

PS> $RemoteAppLog | Get-Member -MemberType Method


   TypeName: System.Diagnostics.EventLog

Name                      MemberType Definition
----                      ---------- ----------
...
Clear                     Method     System.Void Clear()
Close                     Method     System.Void Close()
...
GetType                   Method     System.Type GetType()
...
ModifyOverflowPolicy      Method     System.Void ModifyOverflowPolicy(Overfl...
RegisterDisplayName       Method     System.Void RegisterDisplayName(String ...
...
ToString                  Method     System.String ToString()
WriteEntry                Method     System.Void WriteEntry(String message),...
WriteEvent                Method     System.Void WriteEvent(EventInstance in...

Метод Clear() позволяет очистить журнал событий. При вызове метода в командной строке после имени метода обязательно должны следовать скобки, даже если методу не требуются аргументы. Таким образом оболочка Windows PowerShell отличает метод от возможного свойства с таким же именем. Чтобы вызвать метод Clear, нужно ввести следующую команду:

PS> $RemoteAppLog.Clear()

Введите следующую строку, чтобы отобразить журнал. Видно, что журнал событий очищен, и вместо 262 записей не содержит ни одной.

PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

Создание объектов COM с помощью командлета New-Object

Командлет New-Object может использоваться для работы с СОМ-компонентами. от различных библиотек, поставляемых с сервером сценариев Windows (WSH), до приложений ActiveX, таких как Internet Explorer, установленный на большинстве систем.

Командлет New-Object создает СОМ-объекты с помощью вызываемых оболочек среды выполнения .NET Framework, вызываемых во время выполнения, поэтому на командлет распространяются такие же ограничения, какие действуют для платформы .NET Framework во время вызова СОМ-объектов. Чтобы создать СОМ-объект, необходимо задать параметр ComObject для программного идентификатора ProgId нужного класса СОМ-объекта. Подробное обсуждение ограничений использования СОМ-объектов и определение доступных в системе программных идентификаторов выходит за рамки данного руководства пользователя, но с оболочкой Windows PowerShell может использоваться большинство хорошо известных объектов таких сред, как WHS.

Объекты среды WSH могут быть созданы заданием следующих программных идентификаторов: WScript.Shell, WScript.Network, Scripting.Dictionary и Scripting.FileSystemObject. Эти объекты создаются следующими командами:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Несмотря на то, что функциональность этих классов в большой степени может быть реализована другими способами в оболочке Windows PowerShell, некоторые действия (например создание ярлыков) проще выполнить с использованием классов WSH.

Создание ярлыков на рабочий стол с помощью метода WScript.Shell

Одной из функций, быстро выполняемых с помощью СОМ-объектов, является создание ярлыков. Допустим, на рабочем столе требуется создать ярлык для корневой папки Windows PowerShell. Сначала необходимо создать ссылку на объект WScript.Shell, который будет храниться в переменной $WshShell:

$WshShell = New-Object -ComObject WScript.Shell

Командлет Get-Member работает и с СОМ-объектами, поэтому элементы объекта можно исследовать, если ввести следующее:

PS> $WshShell | Get-Member


   TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}

Name                     MemberType            Definition
----                     ----------            ----------
AppActivate              Method                bool AppActivate (Variant, Va...
CreateShortcut           Method                IDispatch CreateShortcut (str...
...

У командлета Get-Member имеется необязательный параметр InputObject, который можно использовать вместо конвейеризации для обеспечения входных данных для командлета Get-Member. В примере выше при использовании команды Get-Member -InputObject $WshShell выводимые данные были бы такими же. При использовании параметра InputObject командлет обрабатывает свои аргументы как одно целое. Это означает, что если в переменной содержится несколько объектов, командлет Get-Member обрабатывает их как массив объектов. Пример.

PS> $a = 1,2,"three"
PS> Get-Member -InputObject $a
TypeName: System.Object[]
Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length
...

Метод WScript.Shell CreateShortcut допускает использование одного аргумента — пути к создаваемому файлу ярлыка. Можно указать полный путь к рабочему столу, но существует и более простой способ. Рабочий стол обычно представлен папкой с именем Desktop внутри домашней папки текущего пользователя. В Windows PowerShell имеется переменная $Home, в которой содержится путь к этой домашней папке. Таким образом, путь к домашней папке может быть задан указанием этой переменной, после чего нужно ввести только имя папки Desktop и имя создаваемого ярлыка:

$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")

Если похожая на переменную строка заключена в двойные кавычки, Windows PowerShell пытается заменить ее подходящим значением. При использовании одиночных кавычек значение переменной не подставляется. Для сравнения попробуйте ввести следующие команды:

PS> "$Home\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
PS> '$Home\Desktop\PSHome.lnk'
$Home\Desktop\PSHome.lnk

Итак, в переменной $lnk теперь хранится новая ссылка-ярлык. Чтобы просмотреть элементы переменной, ее можно передать по конвейеру командлету Get-Member. Выводимые данные (см. ниже) показывают все элементы, необходимые, чтобы завершить создание ярлыка:

PS> $lnk | Get-Member

TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}

Name MemberType Definition

---- ---------- ----------

...

Save Method void Save ()

...

TargetPath Property string TargetPath () {get} {set}

...

Осталось определить свойство TargetPath, указывающее путь к папке Windows PowerShell, и вызвать метод Save, чтобы сохранить ярлык $lnk . Путь к папке Windows PowerShell хранится в переменной $PSHome, поэтому это можно сделать, введя:

$lnk.TargetPath = $PSHome

$lnk.Save()

Запуск приложения Internet Explorer из Windows PowerShell

С помощью СОМ-объектов можно автоматизировать многие приложения (включая семейство приложений Microsoft Office и Internet Explorer). На примере Internet Explorer можно рассмотреть некоторые типичные технические приемы и тонкости, связанные с работой приложений, основанных на СОМ-технологии.

Экземпляр Internet Explorer создается указанием программного идентификатора этого приложения InternetExplorer.Application:

$ie = New-Object -ComObject InternetExplorer.Application

Эта команда запускает приложение Internet Explorer, но не отображает его. Если запустить командлет Get-Process, то можно увидеть выполняющийся процесс по имени iexplore. Причем после выхода из оболочки Windows PowerShell выполнение этого процесса будет продолжаться. Чтобы завершить процесс iexplore, необходимо перезагрузить компьютер или воспользоваться средством типа диспетчера задач.

Примечание.

СОМ-объекты, запускаемые в виде отдельных процессов, обычно называются исполняемыми файлами ActiveX. При их запуске окно пользовательского интерфейса отображается не всегда. Если окно создается, но не отображается, как в случае с приложением Internet Explorer, фокус обычно перемещается на рабочий стол Windows, и для взаимодействия с окном его необходимо сделать видимым.

С помощью строки $ie | Get-Member можно получить список свойств и методов приложения Internet Explorer. Чтобы отобразить окно приложения Internet Explorer, свойству Visible нужно присвоить значение $true:

$ie.Visible = $true

После этого можно перейти к какому-либо веб-адресу, используя метод Navigate:

$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")

Другие элементы объектной модели Internet Explorer позволяют получить текстовое содержание веб-страниц. Следующая команда отображает HTML-текст в теле текущей веб-страницы:

$ie.Document.Body.InnerText

Чтобы закрыть приложение Internet Explorer из оболочки PowerShell, необходимо вызвать метод Quit():

$ie.Quit()

Это приведет к закрытию приложения. В переменной $ie действительная ссылка больше не содержится, даже если она отображается как СОМ-объект. Попытка использования этой переменной приводит к ошибке автоматизации:

PS> $ie | Get-Member
Get-Member : Exception retrieving the string representation for property "Appli
cation" : "The object invoked has disconnected from its clients. (Exception fro
m HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
At line:1 char:16
+ $ie | Get-Member <<<<

В этой ситуации можно либо удалить оставшуюся ссылку, присвоив переменной нулевое значение $ie = $null, либо полностью удалить переменную:

Remove-Variable ie
Примечание.

Для исполняемых элементов ActiveX нет общего стандарта, по которому выполнение их процессов завершается или продолжается после удаления ссылки на них. Выход из приложения зависит от обстоятельств (видимо ли приложение, открыт ли в нем какой-либо отредактированный документ, а также продолжается ли выполнение программы Windows PowerShell). По этой причине требуется проверка поведения при завершении работы каждого исполняемого элемента ActiveX, используемого в оболочке Windows PowerShell.

Получение предупреждений о вызываемых .NET Framework объектах COM

В некоторых случаях у СОМ-объекта имеется соответствующая вызываемая оболочка среды выполнения .NET Framework, вызываемая во время выполнения (RCW), и именно она используется командлетом New-Object. Поведение упаковщика RCW может отличаться от поведения обычного СОМ-объекта, поэтому у командлета New-Object имеется параметр Strict, используемый для предупреждения о доступе к RCW. Если указать параметр Strict, после чего создать СОМ-объект, использующий оболочку RCW, будет получено предупреждающее сообщение:

PS> $xl = New-Object -ComObject Excel.Application -Strict
New-Object : The object written to the pipeline is an instance of the type "Mic
rosoft.Office.Interop.Excel.ApplicationClass" from the component's primary inte
rop assembly. If this type exposes different members than the IDispatch members
, scripts written to work with this object might not work if the primary intero
p assembly is not installed.
At line:1 char:17
+ $xl = New-Object  <<<< -ComObject Excel.Application -Strict

Объект создается, но предупреждение сообщает о том, что этот объект не является стандартным СОМ-объектом.




Содержание