Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Консоль управления Microsoft (MMC): использование объектной модели OLE Automation

Консоль управления Microsoft (MMC) 2.0 включает объектную модель OLE-Automation, которая может использоваться для разработки различных надстроек и расширений, а также любых программ, которые взаимодействуют с MMC, например, скриптов. Данная статья представляет собой некоторый обзор возможностей объектной модели OLE Automation MMC и не претендует на полноту изложения. Полное описание объектной модели OLE Automation MMC вы можете найти в MSDN. Примеры в статье будут приводиться на языке VBScript для Windows Script Host.

При выполнении сценария тот или иной запрос к интерфейсу объектной модели MMC может сгенерировать ошибку времени выполнения, которая остановит исполнение сценария. Таким образом, вы обязаны использовать механизм обработки ошибок вашего языка сценариев. Например, VBScript использует конструкцию "On Error Resume Next" и обеспечивает работу с объектом Err.

Объект Application

Объект Application используется, чтобы инициализировать и управлять сеансом работы с MMC. Вы должны создать объект Application перед использованием любого другого объекта автоматизации MMC.

Свойства объекта Application:


Document Возвращает объект Document, соответствующий msc-документу (файлу консоли).
Frame Возвращает объект Frame, соответствующий окну MMC.
UserControl Устанавливает или возвращает флаг, который определяет, может ли управлять пользователь приложением MMC интерактивно (чтение и запись). Если свойство UserControl установлено в 1, то, когда сценарий заканчивается, не завершая приложение MMC, приложение MMC остается активным для пользователя. Кроме того, в этом случае приложение MMC не может быть скрыто (метод Hide будет терпеть неудачу). Значение по умолчанию - 0. Значение 0 приводит к завершению приложения MMC, когда сценарий завершает работу. Если приложение MMC скрыто, а значение свойства UserControl изменено с 0 на 1, приложение MMC будет визуализировано.
VersionMajor Возвращает номер версии MMC (число).
VersionMinor Возвращает номер подверсии MMC (число).
Visible Возвращает флаг, который определяет, видимо ли приложение MMC (только чтение). Это 1, если приложение видимо, и 0, если приложение скрыто. Это свойство изменяется при вызове методов Show и Hide.

Методы объекта Application:


Help() Выводит на экран справку по MMC.
Hide() Скрывает окно приложения MMC.
Load(FileName As String) Загружает указанный msc-документ (файл консоли).
Quit() Завершает работу приложения MMC.
Show() Делает окно приложения MMC видимым.

Пример интерактивного запуска и загрузки нужного документа:

Set objMMC = CreateObject("MMC20.Application")
objMMC.Load "compmgmt.msc"
objMMC.UserControl = 1

Объект Frame

Объект, соответствующий окну MMC.

Методы объекта Frame:


Maximize() Разворачивает окно MMC во весь экран.
Minimize() Сворачивает окно MMC.
Restore() Восстанавливает окно MMC.

Свойства объекта Frame:


Bottom Устанавливает или возвращает нижнюю координату окна MMC (чтение и запись).
Left Устанавливает или возвращает левую координату окна MMC (чтение и запись).
Right Устанавливает или возвращает правую координату окна MMC (чтение и запись).
Top Устанавливает или возвращает верхнюю координату окна MMC (чтение и запись).

Пример интерактивного запуска и управления окном MMC:

Set objMMC = CreateObject("MMC20.Application")
objMMC.Frame.Top = 0
objMMC.Frame.Left = 0
objMMC.Frame.Right = 300
objMMC.Frame.Bottom = 500
objMMC.UserControl = 1

Объект Document

Объект, соответствующий msc-документу (файлу консоли).

Некоторые полезные методы объекта Document:


Close(SaveChanges As Long) Закрывает активный документ. Параметр SaveChanges - значение, определяющее, сохранить ли изменения документа. Если этот параметр равен 1, документ будет сохранен перед закрытием, а у пользователя будет запрошено имя файла, если это необходимо. Если параметр SaveChanges равен 0, документ будет закрыт без сохранения изменений.
Save() Сохраняет активный документ.
SaveAs(FileName As String) Сохраняет активный документ в указанном файле.

Некоторые полезные cвойства объекта Document:


ActiveView Возвращает активный объект отображения (View).
Application Возвращает родительский объект Application.
IsSaved Возвращает 1, если документ не имеет никаких несохраненных изменений, и 0 в противном случае (только чтение).
Location Возвращает полный путь файла без его имени (только чтение).
Name Возвращает или устанавливает полный путь файла консоли (чтение и запись). Если документ никогда не сохранялся, содержит пустую строку.
RootNode Возвращает объект корневого узла консоли (объект Node).
ScopeNamespace Возвращает объект пространства имён дерева консоли (объект ScopeNamespace).

Пример сохранения файла консоли:

Set objMMC = CreateObject("MMC20.Application")
objMMC.Load "compmgmt.msc"
objMMC.Document.SaveAs "C:\temp\my.msc"

Объект ScopeNamespace

Объект, соответствующий дереву документа. Возвращается свойством ScopeNamespace объекта Document.

Некоторые полезные методы объекта ScopeNamespace:


GetChild(Node As Node) Возвращает первый дочерний узел указанного узла дерева документа.
GetNext(Node As Node) Возвращает следующий узел за указанным узлом дерева документа.
GetParent(Node As Node) Возвращает родительский узел указанного узла дерева документа.
GetRoot() Возвращает корневой узел дерева документа.

Объект Node

Объект, соответствующий узлу дерева документа или элементу списка отображения (View).

Метод IsScopeNode() объекта Node возвращает 1, если это узел дерева, и 0 в противном случае.

Свойство Name объекта Node возвращает отображаемое имя узла (только чтение). Если узел соответствует элементу списка отображения (View), может быть возвращена строка списка в текстовом виде.

Пример обхода элементов дерева документа:

On Error Resume Next
Set objMMC = CreateObject("MMC20.Application")
objMMC.Load("compmgmt.msc") 'Управление компьютером (локальным)
Set objDoc = objMMC.Document 'Документ
Set objSN = objDoc.ScopeNamespace 'Пространство имён
Set objRoot = objDoc.RootNode 'Корневой узел
Set objNode = objSN.GetChild(objRoot) 'Узел "Управление компьютером (локальным)"
Set objNode = objSN.GetChild(objNode) 'Получение первого вложенного узла
If (objNode Is Nothing) Then WScript.Quit
Do Until (objNode is Nothing)
    WScript.Echo objNode.Name
    Set objSib = Nothing
    Set objSib = objSN.GetNext(objNode) 'Получение следующего узла
    Set objNode = objSib
Loop

Объект View

Объект отображения.

Некоторые полезные свойства объекта View:


ActiveScopeNode Возвращает или устанавливает активный узел дерева для отображения (чтение и запись).
ListItems Возвращает список данных в отображении (объект Nodes, коллекция узлов). Коллекция узлов имеет метод Item(Index As Long), который возвращает узел по индексу (начиная с 1), и свойство Count, которое возвращает количество узлов. Коллекцию можно обойти в цикле For Each.
CellContents(Node As Node, Column As Long) Возвращает в виде строки содержимое указанной ячейки (второй параметр - номер колонки, нумерация начинается с 1) в строке списка отображения (первый параметр).
Columns Возвращает коллекцию колонок в отображении (объект Columns). Коллекция колонок имеет метод Item(Index As Long), который возвращает колонку по индексу (начиная с 1), и свойство Count, которое возвращает количество колонок. Коллекцию можно обойти в цикле For Each. Объект Column (колонка) имеет свойство Name и некоторые другие свойства и методы (подробнее - см. MSDN)
Document Возвращает родительский объект документа для данного отображения.
Frame Возвращает объект Frame, соответствующий окну данного отображения (дочернему по отношению к окну MMC).
ScopeNodeContextMenu(ScopeNode As Variant) Возвращает объект ContextMenu, соответствующий контекстному меню узла дерева (коллекция элементов меню). Коллекция элементов меню имеет метод Item(IndexOrPath As Variant), который возвращает элемент меню, и свойство Count, которое возвращает количество элементов меню. Коллекцию можно обойти в цикле For Each. Элемент меню (объект MenuItem) имеет, помимо прочего, метод Execute(), который позволяет выполнить команду меню.
ScopeTreeVisible Возвращает или устанавливает видимость дерева в интерактивном режиме работы (чтение и запись). Значение 1 - дерево видимо, 0 - скрыто.
Selection Возвращает коллекцию выделенных узлов (объект Nodes). Выделить узлы можно, например, методом Select().
SelectionContextMenu Возвращает объект ContextMenu, соответствующий контекстному меню выделенного узла дерева (коллекция элементов меню).
StatusBarText Устанавливает текст строки состояния MMC в интерактивном режиме работы (только запись). Строка состояния имеет три раздела, текст которых отделяется символом "|". Кроме того, средний раздел может функционировать как прогресс-бар. Чтобы использовать эту возможность, используйте символ "%" как первый символ в среднем разделе, за которым следует число от 0 до 100. При необходимости символ "%" может быть экранирован тем же символом.

Некоторые полезные методы объекта View:


Select(Node As Node) Выделяет (выбирает) указанный узел.
Deselect(Node As Node) Убирает указанный узел из выделения.
DisplayScopeNodePropertySheet(ScopeNode As Variant) Отображает диалог свойств указанного узла дерева в интерактивном режиме работы. Если узел не указан, используется активный в данный момент узел. Если у указанного узла нет диалога свойств, возникнет ошибка.
DisplaySelectionPropertySheet() Отображает диалог свойств выделенных узлов списка отображения в интерактивном режиме работы.
ExecuteScopeNodeMenuItem(MenuItemPath As String, ScopeNode As Variant) Выполняет указанную команду меню указанного узла дерева. Если узел не указан, используется текущий активный узел.
ExecuteSelectionMenuItem(MenuItemPath As String) Выполняет указанную команду меню выделенных элементов в отображении.
ExportList(File As String, ExportOptions As ExportListOptions) Выгружает текущий список отображения в текстовый файл. Параметр ExportOptions - набор флагов, которые могут принимать значения (значения можно суммировать):
ExportListOptions_Default = 0x0000, умолчание: текст ANSI, разделённый запятыми.
ExportListOptions_UnicodeThe = 0x0001, текст Unicode.
ExportListOptions_TabDelimitedThe = 0x0002, текст, разделённый символами табуляции.
ExportListOptions_SelectedItemsOnlyThe = 0x0004, только выделенные элементы.

Пример чтения ошибок из логов событий:

On Error Resume Next
Set objMMC = Wscript.CreateObject("MMC20.Application")
objMMC.Load("eventvwr.msc") 'Просмотр событий (локальных)
Set objDoc = objMMC.Document 'Документ
Set objSN = objDoc.ScopeNamespace 'Пространство имён
Set objRoot = objDoc.RootNode 'Корневой узел
Set objEvtVwrNode = objSN.GetChild(objRoot) 'Узел "Просмотр событий (локальных)"
Set objView = objDoc.ActiveView 'Отображение
Set objNode = objSN.GetChild(objEvtVwrNode) 'Получение первого журнала
If (objNode Is Nothing) Then WScript.Quit
Do Until (objNode is Nothing)
    Wscript.echo "Сообщения об ошибках в логе " & objNode.Name & ":"
    objView.ActiveScopeNode = objNode 'Установка активного узла для отображения
    Set objList = objView.ListItems 'Получение списка в отображении
    For Each objItem In objList 'Обход списка
        Str = objView.CellContents(objItem, 1) 'Значение в первой колонке
        If (Str = "Ошибка") Then 'If (str = "Error") Then
            Wscript.echo objView.CellContents(objItem, 1) + ",", objView.CellContents(objItem, 2) + ",", _
                         objView.CellContents(objItem, 3) + ",", objView.CellContents(objItem, 4) + ",", _
                         objView.CellContents(objItem, 5) + ",", objView.CellContents(objItem, 6) + ",", _
                         objView.CellContents(objItem, 7) + ",", objView.CellContents(objItem, 8)
        End If
    Next
    Wscript.echo ""
	Set objSib = Nothing
    Set objSib = objSN.GetNext(objNode) 'Получение следующего журнала
    Set objNode = objSib
Loop

Пример чтения информации о службах:

Set objMMC = CreateObject("MMC20.Application")
objMMC.Load("services.msc") 'Службы (локальные)
Set objView = objMMC.Document.ActiveView 'Отображение
Set objList = objView.ListItems 'Получение списка в отображении
For Each objItem In objList 'Обход списка
    sName = objView.CellContents(objItem, 1) 'Имя службы
    sStatus = objView.CellContents(objItem, 3) 'Состояние службы
    sStartType = objView.CellContents(objItem, 4) 'Тип запуска
    sLogon = objView.CellContents(objItem, 5) 'Вход от имени
    Wscript.echo sName & vbCrLf & sStatus & vbCrLf & sStartType & vbCrLf & sLogon & vbCrLf & "***"
Next

Пример чтения информации о локальных пользователях:

Set objMMC = CreateObject("MMC20.Application")
objMMC.Load("lusrmgr.msc") 'Локальные пользователи и группы
Set objDoc = objMMC.Document 'Документ
Set objSN = objDoc.ScopeNamespace 'Пространство имён
Set objRoot = objDoc.RootNode 'Корневой узел
Set objNode = objSN.GetChild(objRoot) 'Узел "Локальные пользователи и группы (локально)"
Set objNode = objSN.GetChild(objNode) 'Узел "Пользователи"
Set objView = objDoc.ActiveView 'Отображение
objView.ActiveScopeNode = objNode 'Установка активного узла для отображения
Set objList = objView.ListItems 'Получение списка в отображении
For Each objItem In objList 'Обход списка
    sName = objView.CellContents(objItem, 1) 'Имя
    sFullName = objView.CellContents(objItem, 2) 'Полное имя
    sDescr = objView.CellContents(objItem, 3) 'Описание
    Wscript.echo sName & vbCrLf & sFullName & vbCrLf & sDescr & vbCrLf & "***"
Next

Пример вызова интерактивного диалога добавления нового локального пользователя (вызов указанного пункта контекстного меню нужного узла дерева):

Set objMMC = CreateObject("MMC20.Application")
objMMC.Load("lusrmgr.msc") 'Локальные пользователи и группы
Set objDoc = objMMC.Document 'Документ
Set objSN = objDoc.ScopeNamespace 'Пространство имён
Set objRoot = objDoc.RootNode 'Корневой узел
Set objNode = objSN.GetChild(objRoot) 'Узел "Локальные пользователи и группы (локально)"
Set objNode = objSN.GetChild(objNode) 'Узел "Пользователи"
Set objView = objDoc.ActiveView 'Отображение
'objView.ExecuteScopeNodeMenuItem "Новый пользователь...", objNode
Set objContextMenu = objView.ScopeNodeContextMenu(objNode)
objContextMenu.Item(2).Execute 'Меню "Новый пользователь..."

Пример вызова интерактивного диалога свойств локального пользователя (вызов указанного пункта контекстного меню нужного элемента списка отображения):

Set objMMC = CreateObject("MMC20.Application")
objMMC.Load("lusrmgr.msc") 'Локальные пользователи и группы
Set objDoc = objMMC.Document 'Документ
Set objSN = objDoc.ScopeNamespace 'Пространство имён
Set objRoot = objDoc.RootNode 'Корневой узел
Set objNode = objSN.GetChild(objRoot) 'Узел "Локальные пользователи и группы (локально)"
Set objNode = objSN.GetChild(objNode) 'Узел "Пользователи"
Set objView = objDoc.ActiveView 'Отображение
objView.ActiveScopeNode = objNode 'Установка активного узла для отображения
objView.Select objView.ListItems.Item(1) 'Выбор первого пользователя из списка
'objView.ExecuteSelectionMenuItem "Свойства"
objView.SelectionContextMenu.Item(5).Execute 'Вызов диалога свойств пользователя из контекстного меню
objMMC.UserControl = 1

Пример выгрузки списка локальных пользователей в текстовый файл:

Set objMMC = CreateObject("MMC20.Application")
objMMC.Load("lusrmgr.msc") 'Локальные пользователи и группы
Set objDoc = objMMC.Document 'Документ
Set objSN = objDoc.ScopeNamespace 'Пространство имён
Set objRoot = objDoc.RootNode 'Корневой узел
Set objNode = objSN.GetChild(objRoot) 'Узел "Локальные пользователи и группы (локально)"
Set objNode = objSN.GetChild(objNode) 'Узел "Пользователи"
Set objView = objDoc.ActiveView 'Отображение
objView.ActiveScopeNode = objNode 'Установка активного узла для отображения
objView.ExportList "C:\temp\test.txt"

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.