d9e5a92d

Глава 2 Администрирование Windows средствами WMI

Понятие WMI

Одной из базовых технологий компании Microsoft, предназначенной для централизованного управления и слежения за работой различных частей компьютерной сети, под управлением Windows, является Windows Management Instrumentation (WMI).

Объектную модель WMI можно использовать практически в любых языках и средах программирования, в том числе и в системе ”1С:Предприятие". Кроме этого, в операционных системах Windows Xp или Server 2003 реализован механизм доступа к WMI из командной строки и обычных пакетных файлов (технология WMI Command line, WMIC). Применение WMI позволяет автоматически выполнять административные задачи практически любой степени сложности, включая отслеживание и обработку событий, связанных с теми или иными изменениями в информационной системе (например, появление определенной записи в журнале событий на локальном или удаленном компьютере, заполнение жесткого диска сервера до определенного предела и т. п.).

Напомним, что в Windows NT для администрирования операционной системы приходилось пользоваться несколькими утилитами и инструментами. Это обусловлено тем, что данные о компонентах системы хранятся в различных источниках (база пользователей SAM, журнал событий Event Log, системный реестр и т. д.), доступ к которым осуществлялся с помощью разных утилит (диспетчер пользователей — User Manager, просмотрщик журнала событий — Event Log Viewer, редактор реестра — Regedit) и программных интерфейсов (Network API — для работы с данными о пользователях, Event Log API — для просмотра сведений о произошедших событиях, Registry API — для чтения или редактирования системного реестра). Понятно, что это неудобно, т. к., во-первых, приходилось осваивать множество не связанных друг с другом технологий и инструментов, а во-вторых, усложнялось

взаимодействие разных компонентов компьютерной системы друг с другом (например, настройки в локальном реестре рабочей станции могли конфликтовать с политиками безопасности, которые заданы на сервере).

С появлением Windows 2000 эта ситуация была в основном исправлена. Появилась встроенная в операционную систему консоль управления ММС (Microsoft Management Console), с помощью которой можно из одной точки управлять большинством логических и физических компонентов компьютерной сети, построенной на основе Windows. В свою очередь, это стало возможным именно благодаря применению технологии WMI. Данная технология, во-первых, делает доступ к информации о самых различных компонентах информационной системы (журнал событий, системный реестр, подсистема производительности, драйверы устройств и т. д.) независимым от типа этих компонентов, а во-вторых, осуществляет управление любой подсистемой стандартным, не зависящим от реализации этой подсистемы, методом.

Итак, технология WMI — это глобальная концепция настройки, управления и слежения за работой различных частей корпоративной компьютерной сети. В частности, используя WMI, можно с помощью специальных утилит или сценариев Windows Script Host (WSH) решать ряд важных задач.



D Управление различными версиями операционной системы Windows. С помощью сценариев WMI можно обращаться к системным счетчикам производительности, анализировать журналы событий (Event Logs), работать с файловой системой, установленными принтерами, управлять запущенными процессами и сервисами, просматривать и изменять настройки реестра, создавать и удалять совместно используемые ресурсы и т. д. При этом все операции можно выполнять одинаковым образом, как на локальной, так и на удаленной машине.

О Управление ресурсами и службами сети. Сценарии WMI позволяют настраивать сетевые службы (DNS, DHCP и т. п.) и управлять сетевыми устройствами, поддерживающими технологию SNMP (Simple Network Management Protocol).

П Мониторинг состояния системы в реальном времени. Можно создавать сценарии — обработчики событий WMI, которые позволяют отслеживать и нужным образом обрабатывать события, связанные с теми или иными изменениями в информационной системе. Например, появление определенной записи в журнале событий на локальном или удаленном компьютере, заполнение жесткого диска сервера до определенного предела, изменение определенного ключа в системном реестре и т. п.

О Управление серверными приложениями Windows. С помощью WMI можно управлять различными приложениями Microsoft: Application Center, Operations Manager, Systems Management Server, Internet Information Server, Exchange Server, SQL Server.

Доступ к объектам WMI

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

О swbemLocator — обеспечивает доступ к объекту swbemServices, который осуществляет подключение к WMI. Предоставляет дополнительные возможности проверки подлинности при установлении соединения.

? swbemServices — обеспечивает доступ к экземплярам управляемых объектов, выполняет запросы к классам WMI, выполняет другие связанные с WMI операции.

П SWbemGbjectSet — является коллекцией объектов SWbemObject. Создать объект swbemobjectset и получить к нему доступ можно при помощи нескольких методов, принадлежащих объектам swbemServices

И SWbemObject.

П swbemobject — представляет собой определение одного класса WMI в форме экземпляра объекта.

Подробное описание всех объектов, их свойств и методов можно найти на сайте Microsoft Developer Network Library (MSDN) —

.

Для доступа к WMI через библиотеку сценариев WMI из системы "1 С:Предприятие" нужно сделать три шага, которые являются общими для большинства сценариев WMI. Первое — необходимо подключиться к службе Windows Management Service, второе — получить экземпляры управляемых объектов WMI, третье — вызвать метод или получить доступ к свойствам управляемого объекта. После знакомства с интерфейсами, которые используются для выполнения этих трех шагов, гораздо увереннее чувствуешь себя на пути к вершине искусства написания сценариев.

Самое неприятное в этих основных трех шагах то, что код их написания довольно коренным образом отличается в разных версиях "1 С: Предприятия" (7.7 и 8.0). Причем многие конструкции в версии 7.7 штатными средствами просто не выполнить, поэтому приходится прибегать к внешним вспомогательным инструментам.

Для доступа к объектам WMI из "1C:Предприятия" версии 8.0 вполне хватает стандартных языковых конструкций внутреннего языка, поэтому сначала будут описаны алгоритмы подключения именно для этой версии.

Рассмотрим пример подключения к классу win32_Logicaioisk (листинг 2.1).

г — ----- ------- — ........................... ............................................................................

і Листинг 2.1. Создание доступа к объектам WMI для версии 8.0

II Создать указатель на объект SWbemLocator Попытка

Locator = Новый СОМОбъект("WbemScripting.SWbemLocator");

Исключение

Сообщить(ОписаниеОшибкиО);

Возврат;

КонецПопытки;

// Шаг 1. Подключение к WMI на локальном компьютере ServicesSet = Locator.ConnectServer;

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.InstancesOf("Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из ObjectSet Цикл Сообщить("Имя: " + Item.Caption);

КонецЦикла;

Данный код покажет название всех имеющихся логических дисков на локальном компьютере, но это пока нам не важно. Можно также просмотреть все процессоры не только на локальном компьютере, но и на удаленном. Для этого необходимо в предыдущем коде только изменить первый шаг (листинг 2.2).

Листинг 2.2. Подключение к удаленному серверу для вер

И Шаг 1 .^Подключение к WMI на удаленном компьютере

ServicesSet = Locator.ConnectServer("MainServor", "root\cimv2", "Achin", "password");

Рассмотрим каждый из параметров метода ConnectServer в отдельности.

П Первый — имя удаленного компьютера (для локального указывается точка

П Второй — имя пути для WMI. По умолчанию roots с іют2 можно не указывать;

О Третий — имя пользователя (для авторизации).

О Четвертый — пароль пользователя (для авторизации).

Иногда возникает необходимость подключиться к компьютеру создав СОМ-объект с помощью расширенной функции Получить СОМОбъект (аналог Getobject в Visual Basic и Visual Basic Script). Пример такого подключения показан в листинге 2.3.

Листинг 2.3. Подключение к серверу с помощью моникера для версии 8.0

[ЩнВИнПНжНЯНИ______ИЯ_________У-. - V/¦' г- -. У- ____КяМЕазЯИі_______і___т_____________

ИмяКомпьютера = ".";

// Шаг Подключение к WMI на локальном компьютере ServicesSet =

nony4HTbC0M06beKT("winmgmts:{impersonationLevel=impersonate}!\\ + ИмяКомпьютера +"\root\cirnv2”);

// Шаг 2. Извлечение экземпляров класса Win32 LogicalDisk ObjectSet = ServicesSet.ExecQuery("Select * from Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из Obj ectSet Цикл

Сообщить("Имя: ' + Item.Caption);

КонецЦикла;

В данном примере для подключения к WMI на целевом компьютере и доступа ко всем экземплярам класса Win32 _LogicalDisk используется WMI-моникер (moniker) winmgmts. Моникер — это специальный СОМ-объект, который отыскивает в сети или создает и инициализирует экземпляр объекта и возвращает клиенту указатель на него. Для повышения безопасности WMI-моникер использует встроенные средства аутентификации, а также позволяет устанавливать дополнительные маршруты к объектам.

Сценарий возвращает каждый экземпляр Win32_LogicalDisk как SWbemObject из коллекции SWbemObjectSet. SWbemObjectSet И SWbemObject — ЭТО ЛИШЬ ДВ& ИЗ

нескольких интерфейсов, которые предоставляет библиотека сценариев WM1. Так как SWbemObj ectSet является коллекцией, то доступ к ее элементам можно организовать При ПОМОЩИ КОНСТРУКЦИИ Для каждого..Из...Цикл...КонецЦикла. Внутри цикла организован доступ к свойству caption, которое определено в классе Win32_LogicalDisk.

Самое интересное в этом примере то, что на втором шаге пишется текст запроса, который очень похож на конструкции структуризированного языка запросов (SQL). Благодаря этому мы можем выбрать не все экземпляры выборки, а только необходимые, т. е. соответствующие некоторым условиям отбора.

Модифицируем последний пример так, чтобы он выводил информацию только о жестких дисках (HDD) и не показывал CD-ROM, дисководы FDD и т. п. (листинг 2.4).

I Листинг 2.4. Пример извлечения экземпляров класса с условием для версии 8.0

// Шаг 2. Извлечение экземпляров класса Win32 LogicalDisk

ObjectSet = ServicesSet.ExecQuery{"Select * from Win32 LoqicalDisk Where DriveType=3");

// Шаг Просмотр SWbemObjeerSet, ' содержащего экземпляры Для каждого Item Из ObjectSet Цикл

Сообщить("Имя: " + Item.Caption) ;

КонецЦикла;

В данном примере тип диска (DriveType), равный трем, соответствует жестким дискам. Это бывает довольно удобно для ограничения выборки элементов и повышения производительности системы.

Хотя варианты подключения с помощью моникера и объекта SWbemLocator функционально одинаковы, они демонстрируют действие различных механизмов, заложенных в библиотеке WMI. Новичкам может показаться, что синтаксис моникера излишне запутан, поэтому вначале они могут поработать С SWbemLocator. С ТОЧКИ зрения фунКЦИОНЭЛЬНОСТИ метод ConnectServer, который предоставляет swbemLocator, позволяет распределять полномочия, необходимые для проведения аутентификации WM 1-соединения. Синтаксис моникера предоставляет возможность выполнения нескольких действий в одной строке кода.

Теперь рассмотрим, как все то же самое выполняется в системе "1С:Предприятие" версии 7.7.

Сразу необходимо отметить, что в версии 7.7 невозможно штатными средствами:

? перебрать элементы коллекции, так как в 7.7 нет цикла, аналогичному КОНСТРУКЦИИ Для каждого...Из...Цикл...КонецЦикла;

П получить доступ к экземплярам классов, если используется WMI-моникер, так как в 7.7 нет аналога функции ПолучитьСОМОбъект.

Это довольно серьезные ограничения, связанные с работой СОМ-объектов, но вполне решаемые с помощью вспомогательных внешних компонент или дополнительных СОМ-объектов, которые можно написать на любом другом языке программирования. Так как эта глава книги (как, впрочем, и многие другие) посвящена СОМ-технолопіям, то и для обхода ограничений версии 7.7 будет использоваться СОМ-объект.

Для обхода данных ограничений понадобятся всего три функции (листинг 2.5):

0 функция получения очередного элемента коллекции;

? функция получения количества элементов в коллекции;

? функция, заменяющая функцию получитьсомобъект в версии 8.0.

Местоположение файла COMServices.dll не важно, главное зарегистрировать его в системе командой regsvr32 COMServices.dll.

Теперь рассмотрим, как описанные ранее три шага подключения к WMI будут выглядеть в версии 7.7 с использованием вспомогательного СОМ-объекта COMServices (листинг 2.6).

ЯШШВШШШШШШШШШВШВ---------------------------------------..............................~

Листинг 2.6. Создание доступа к объектам WMI для версии 8.0

______1---—...........................................................- .........................J

// Создать указатель на объект COMServices Попытка

COMServices = СоздатьОбъект("COMServices.СОМ");

Исключение

Предупреждение("Ошибка загрузки COM-объекта COMServices.");

Возврат,-КонецПопытки;

// Создать указатель на объект SWbernLocator Попытка

Locator = СоздатьОбъект("WbemScripting.SWbernLocator");

Исключение

Сообщить(ОписаниеОшибки());

Возврат,-КонецПопытки;

// Шаг 1. Подключение к WMI на локальном компьютере ServicesSet = Locator.ConnectServer(".");

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.InstancesOf("Win32_LogicalDisk") ;

// Шаг З. Просмотр SWbernObjectSet, содержащего экземпляры Для Ном = 0 По ObjectSet.Count-1 Цикл

Item = COMServices.EnumerateCollection(ObjectSet, Ном);

Сообщить("Имя: " + ioerv Caption);

КонецЦикла;

В данном примере используется конструкция цикла Для...По...Иукл...конеиЦукла от нуля до количества элементов (свойство count) коллекции минус один. Внутри цикла вызывается метод EnumerateCol lection объекта COMServices ,

в который передается ссылка на коллекцию objectset и номер извлекаемого элемента коллекции. Во всем остальном код ничем не отличается от аналогичного кода в версии 8.0. Важно отметить, что не каждый класс имеет свойство Count. Если оно отсутствует, то для определения количества элементов в коллекции применяется метод GetCountCoiiection объекта COMServices.

Рассмотрим второй вариант подключения к объектам WMI с помощью моникеров в версии 7.7 (листинг 2.7).

Листинг 2.7.

Подключение к серверу с помощью моникера для версии 7.7

// Сетевое имя компьютера, к которому производится подключение

ИмяСервера = "

// Шаг Подключение к WMI на локальном компьютере

ServicesSet = COMServices.GetCOMObject

("winmgmts:{impersonationLevel=impersonate}!\\" + ИмяСервера + "\root\cimv2");

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.ExecQuery("Select * from Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для Ном = 0 По ObjectSet.Count-1 Цикл

Item = COMServices.EnumerateCollection(Objectset, Ном);

Сообщить (:’Имя: + Item, Caption) ;

КонецЦикла;

Данный пример модифицировался лишь в том, что на первом шаге добавился вызов метода GetCOMObject для получения объекта swbemservices.

В следующих частях этой главы будут показаны примеры практического применения технологии WMI. Большинство примеров будет написано только для версии 8.0 системы "1C:Предприятие". При необходимости перевести их в формат версии 7.7 не составит труда.

Сбор данных об аппаратном составе

В листинге 2.1 приведен пример вывода названий всех имеющихся логических дисков локального компьютера. Помимо названий класс Win32 LogicaiDisk имеет еще очень большое количество свойств, таких как описание, файло-

вая система, метка диска и т. п. В листинге 2.8 приведен пример вывода основных свойств каждого элемента класса win32_LogicalDisk.

; Листинг 2.8. Вывод ОСНОВНЫХ СВОЙСТВ класса Win32_LogicalDi.sk.

// Создать указатель на объект SWbemLocator Попытка

Locator ¦= Новый СОМОбъект("WbemScripting.SWbemLocator");

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

// Шаг 1. Подключение к WMI на локальном компьютере ServicesSet = Locator.ConnectServer

// Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.InstancesOf("Win32_LogicalDisk");

// Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из ObjectSet Цикл

Сообщить("Имя: ” + Item.Caption);

Сообщить("Описание: " + Item.Description);

Сообщить("Файловая система: " + Item.FileSystem); Сообщить ("Свободное место: " + Item.FreeSpace);

Сообщить ("Метка диска: " + Item.VolumeName) ;

Сообщить ( "=========================;==" )

КонецЦикла;

Для вывода всех имеющихся свойств класса win32_LogicaiDisk необходимо модифицировать только третий шаг (листинг 2.9).

// Шаг 3. Просмотр SWbemObjectSet, содержащего экземпляры Для каждого Item Из ObjectSet Цикл

Сообщить("Диск: " + Item.Caption) ;

// Выборка по всем свойствам

Для каждого Свойство Из Item. Propertie.s_ Цикл

Сообщить(Свойство.Name + "

" + Свойство.Value); ”);

КонецЦикла;

Сообщить ("=============

КонецЦикла;

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

Помимо класса win32_LogicalDisk есть еще ряд классов, позволяющих получать информацию об аппаратном составе локального или удаленного компьютера. Наиболее интересные из них следующие:

? win32_Processor — информация о процессорах;

? win32_BaseBoard — информация о материнской плате;

? Win32 DiskDrive — информация о дисковых накопителях (HDD);

? win32_PhysicalMemory — информация о физической памяти (RAM);

П win32_SoundDevice — информация о звуковых картах;

О Win32 NetworkAdapter — информация о сетевых адаптерах;

П win32_CDROMDrive — информация о приводах CD-ROM;

П win32_FloppyDrive — информация о дисководах (Floppy);

G Win32 DesktopMoni tor — информация о мониторах;

О win32_videoController — информация о видеосистеме;

П win32_Pr inter — информация о принтерах;

П win32_Keyboard — информация о клавиатуре;

П — информация о точечных манипуляторах (мыши, трекболы и т. и.); •

П win32_usBHub — информация о портах USB.

Работа с программным обеспечением

Для работы с программным обеспечением предназначен класс win32_Product. Единственное ограничение данного класса состоит в том, что он работает только с тем программным обеспечением, которое было установлено с помощью Microsoft Windows Installer (MSI).

Основные свойства класса win32_Product:

О Name — название продукта;

П Description — описание;

П identifyingNumber — идентификационный номер продукта (например серийный номер или номер аппаратного устройства);

П instaiiDate — дата инсталляции;

? instaliLocation — путь к продукту; О vendor — производитель;

П version — версия.

Основные методы win32_Product:

П Install(PackageLocation, Options, AllUsers) — установка продукта, причем параметры метода определяются как:

• PackageLocation — путь К файлу установки;

• Options — параметры командной строки;

•Aiiusers — признак установки продукта для всех пользователей;

П Reinstall (ReinstallMode) — переустановить продукт с параметром:

• ReinstaiiMode — режим переустановки продукта (например і — скопировать только недостающие файлы, б — обновить все файлы).

П uninstall О — удалить целиком продукт.

|^|ВниманиеР^|

Все методы возвращает о, если они завершены успешно. Иначе возвращается ЧИСЛО 2147549445.

Получение списка

установленного программного обеспечения

Пример получения всего списка установленного на данном компьютере программного обеспечения, с помощью класса win32_Product, представлен в листинге 2.10.

I ЛИСТИНГ2.10. Получение списка установленного программного обеспечения

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, ”root\cimv2"( Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_Product");

Для каждого Item Из Items Цикл

Сообщить ("Имя: " + Item.Name + " (Вер.” + Item.Version +

КонецЦикла;

Если есть необходимость получить список программного обеспечения по какому-либо условию, можно в запросе использовать выражение where. Приведем пример получения списка всех продуктов компании Microsoft, установленных в операционной системе (листинг 2.11).

| Листинг2.11. Получение списка продуктов Microsoft

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery!"Select * from Win32_Product Where Vendor LIKE '%Microsoft%';

Для каждого Item Из Items Цикл

Сообщить ("Имя: " + I ten'.. Name + (Вер.” + Item.Version +

КонецЦикла;

В данном примере используется фильтр по маске — "%Microsofl%". Это означает, что в запрос попадут все объекты, у которых свойство vendor содержит строку "Microsoft".

Удаление программного обеспечения

Для удаления какого-либо программного продукта используется метод Uninstall класса Win32 Product. Приведем пример удаления программы Adobe Acrobat 6.0 Professional (листинг 2.12).

і Acrobat 6.0 Professional

Листинг 2.12. Удаление продух

ИмяПрограммы = "Adobe Acrobat 6.0 Professional";

Если Вопрос ("Вы уверены, что хотите удалить " + ИмяПрограммы +

РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_Product Where Name = ’" + ИмяПрограммы +

Для каждого Item Из Items Цикл

Item.Uninstall() ;

КонецЦикла;

КонецЕсли;

Работа со службами и процессами

Для работы со службами (сервисами) в WMI используется класс Win32 Service. Класс имеет довольно большое количество свойств. Рассмотрим только основные:

? Accept Pause — признак возможности приостановить службу;

? Acceptstop — признак возможности остановить службу;

О Name — название службы;

? Description — описание;

П DisplayName — имя службы, показываемое пользователю;

О PathName — Путь К файлу;

О Process!d — идентификатор процесса;

П started — признак, показывающий, запущена служба или нет;

O State — строка, описывающая состояние службы (stopped, Start Pending, Stop Pending, Running, Continue Pending, Pause Pending, Paused, Unknown).

Рассмотрим основные методы класса win32_Service:

O startservice () — запускает службу;

П stopservice О — останавливает службу;

П PauseService — приостанавливает работу службы;

П ResumeService <; — восстанавливает работу после приостановления;

П Delete — удалить службу;

O Create (...) — создать службу (метод имеет множество параметров, которые не будут рассматриваться в рамках данной книги).

Для работы с процессами в WMI используется класс win32_ Process. Рассмотрим основные свойства класса:

П Description — описание процесса;

П Process id — идентификатор процесса;

П Name — имя процесса;

П Priority — приоритет (от 0 до 37);

П virtuaisize — объем памяти, необходимый процессу.

Основные методы класса Win32 Process

П SetPriority (Priority) — установить приоритет процесса, при этом параметр Priority может принимать значения:

• 64 — Idle (Ожидание, наиболее низкий приоритет);

• 16384 — Below Normal (Ниже нормального);

• 32 — Normal (Обычный);

• 32768 — Above Normal (Выше нормального);

•128 — High Priority (Высокий приоритет);

• 256 — Realtime (Приоритет реального времени, наивысший приоритет).

О Terminate о — завершить процесс и выгрузить его из памяти.

Получение списка сервисов

Для получения списка установленных сервисов используется класс Win32_service (ЛИСТИНГ 2.13).

Листинг 2.13. Получение списка сервисов

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\

" + ИмяКомпыотера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * from Win32_3ervice’') ;

Для каждого Item Из |Items Цикл

Сообщить ("Сервис: " + Item.DisplayName + " (" + Item.State +

КонецЦикла;

Для определения списка сервисов, которые возможно остановить, используется также класс win32_Service. Однако запрос ограничивается условием того, что свойство Acceptstop равно True (истина). Пример определения такого списка показан в листинге 2.14.

Листинг 2.14. Получение списка сервисов с ограничением по условию

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}! \\" + ИмяКомпыотера + "\root\cimv2"); _

Items = ServicesSet.ExecQuery("Select * from Win32 Service Where Acceptstop = True");

Для каждого Item Из Items Цикл

Сообщить ("Имя процесса: " + Item.DisplayName) ;

КонецЦикла;

Установка приоритета процесса

Рассмотрим пример (листинг 2.15) установки среднего приоритета для запущенного процесса Notepad.exe (блокнот).

7— -------------Я---------------Щ— "Т-’і

Листинг 2.15. Установка приоритета процесса

....... .Safi___ашщзямвгшаШш___¦НшвВВВННЬ;___шаіг&іьдаа:—.—я.—ляат

ABOVE_NORMAL = 32768;

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" + ИмяКомпыотера + "\root\cimv2");

Items

= ServicesSet.ExecQuery("Select * from Wm32_Process Where Name =

'Notepad.exe'");

Для каждого Item Из Items Цикл

Item.SetPriority(ABOVE_NORMAL); КонецЦикла;

Завершение процесса

Для завершения процесса используется метод Terminate без параметров (листинг 2.16).

процесса

I Листинг 2.16. Завершение

ServicesSet = ПолучитьСОМОбъект

("winmgmts:{impersonationLevel=impersonate}!\\" +

ИмяКомпьютера + "\root\cimv2");

Items = ServicesSet.ExecQuery("Select * from Win32_Process Where Name =

'Notepad.exe'");

Для каждого Item Из Items Цикл

Item.Terminate();

КонецЦикла;

Запуск и приостановка выполнения сервиса

Для запуска сервиса используется метод startservice (листинг 2.17). Для приостановки - метод stopservice. Оба метода используются без параметров .

Листинг 2.17. Приостановление Сервиса

ServicesSet = ПолучитьСОМОбъект ("winmgmts:{impersonationLevel=impersonate}!\\" +

ИмяКомпьютера + "\root\cimv2");

Items = ServicesSet.ExecQuery("Select * from Win32jService Where Name.

='Alerter; // Оповещатель

Для каждого Item Из Items Цикл

Item.StartService(); // Запустить процесс КонецЦикла;

В запросе метода ExecQuery используется фильтрация списка сервисов по имени Alerter (Оповещатель). Таким образом, в выборку попадает всего один сервис — Оповещатель, который и запустится после выполнения метода StartService.

Работа с операционной системой

Для работы с операционной системой в WMI существует несколько классов,

ОСНОВНЫМ ИЗ КОТОРЫХ ЯВЛЯетСЯ — Win32_OperatingSystem. Рассмотрим ОСновные свойства данного класса:

О Name — название операционной системы;

О BootDevice — имя физического диска, с которого загружается операционная сиситема;

П SystemDrive — символ логического диска, на котором установлена система;

О windowsDirectory — папка, в которой установлена система;

П Description — описание к объекту класса;

? FreePhysicalMemory — размер свободной физической памяти (в килобайтах);

? FreeVirtualMemory — размер свободной виртуальной памяти (в килобайтах);

П Manufacturer — производитель операционной системы. Обычно данное свойство имеет значение "Microsoft Corporation";

? NumberOfProcesses — количество запущенных процессов;

? organization — название организации, на которую зарегистрирована данная копия системы;

? RegisteredUser — имя пользователя, на которого зарегистрирована данная копия системы;

П serialNumber — регистрационный номер;

О osLanguage — языковая версия системы. Например с со 9 — английская, 0419 — русская и т. д.;

П озтуре — тип операционной системы. Например, — WIN98, 18 — WINNT, зо - SunOS и т. д.;

П Primary — признак основной операционной системы;

? version — версия системы;

П BuildNumber — номер сборки операционной системы;

Основные методы класса Win32_OperatingSystem:

П Reboot — перезагрузить систему;

П shutdown — выключить компьютер;

П win323hutdown (Flag) — управление функциями выключения компьютера (для\?іп32-операционных систем). Параметр Flag может принимать следующие значения:

• о — завершить работу пользователя (Log Off);

• 4 — принудительное завершение работы пользователя (Forced LogOff);

• 1 — выключение компьютера (Shutdown);

• 5 — принудительное выключение компьютера (Forced Shutdown);

• 2 — перезагрузка( Reboot);

• 6 — принудительная перезагрузка (Forced Reboot);

• 8 — выключение питания (PowerOf'f);

• 12 — принудительное выключение питания (Forced Power Off).

Определение информации об ОС

Рассмотрим пример вывода основных свойств операционной системы. В программном коде, представленном в листинге 2.18, показан пример вывода названия, пути установки и номера версий установленных операционных систем (их может быть несколько).

ии об ОС

Листинг 2.18. Определение информаци

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQueryt"Select * from Win32_OperatingSystem"); Для каждого Item Из Items Цикл

Сообщить("Название: " + Item.Caption);

Сообщить("Путь: " + Item.WindowsDirectory);

Сообщить("Версия: "• + Item.Version);

КонецЦикла;

Выключение компьютера

Рассмотрим пример выключения компьютера с помощью метода Win32 Shutdown (ЛИСТИНГ 2.19).

ШШННШНМНШНВННу ' ‘ : —т:------------

i Листинг 19 Выключение компьютера

L_-__________J________— — ____U-._J_Li._-'--.!__________

ServicesSet=nony4MTbC0M06beKT("winmgmts:{impersonationLevel=impersonate, (Shutdown)}!\\" + ИмяКомпыотера + "\root\cimv2");

Stems = ServicesSet.ExecQuery("Select * from Win32_OperatingSystem");

Для каждого Item Из Items Цикл

Item.Win32Shutdown(5); // Выключение КонецЦикла;

Определение разрешения экрана

Для определения разрешения экрана используются свойства Screenwidth

(ширина) И ScreenHeight (высота) класса wi.n32_DesktopMonitor (ЛИСТИНГ 2.20).

мннмшнмнмшмммамшшнннншмнн-------иннишшшшкш

Листинг 2.20. Определение разрешения экрана

-................'.'..Л'.................................................................................................................

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, ”root\cimv2",

Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_DesktopMonitor");

Для каждого Item Из Items Цикл

Сообщить ("Разрешение: " + Item.ScreenWidth + ,f- x " + Item. ScreenHeight); КонецЦикла;

Список элементов автозагрузки

Для определения списка программ, которые загружаются при запуске операционной системы Windows, предназначен класс win32_startupCommand (листинг 2.21).

Листинг 2.21. Получение списка элементов автозагрузки

.........*____................. ....................................-і__

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_StartupCommand");

Для каждого Item Из Items Цикл

Сообщить("Команда: " + Item. Command);

Сообщить("Описание: " + Item.Description);

Сообщить("Путь: " + Item.Location);

Сообщить("Имя: " + Item.Name);

Сообщить("Пользователь: " + Item.User);

КонецЦикла;

Активизация копии Windows XP/Server 2003

Для активации операционной системы Windows XP или Windows Server 2003 используется метод ActivateOnline () класса Win32_WindowsProductActivation (листинг 2.22).

Листинг 2.22. Активизация копии Windows XP/Server 2003

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2', Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_WindowsProductActivation");

Для каждого Stem Из кtems Цикл

Item.ActivateOnline();

КонецЦикла;

Просмотр учетных записей и доменов

Для работы с учетными записями и доменами обычно используются следующие классы:

О win32_ComputerSystem — содержит системную информацию компьютера; П win32_Group — содержит данные о пользовательских группах;

О win32_Account — содержит данные о группах и пользователях системы. Рассмотрим основные свойства класса Win32_ComputerSystem:

П Description — описание объекта;

О Domain — имя домена, в котором зарегистрирован компьютер;

П DomainRole — роль компьютера;

О infraredSupported — признак поддержки работы с инфракрасным портом; П Manufacturer — производитель компьютера;

П Model — название компьютера;

П NumberOfProcessors — количество процессоров;

П UserName — имя пользователя, работающего в настоящее время с системой; П workgroup — имя рабочей группы.

Класс win32_ComputerSystem имеет важный метод Rename (строка), который может изменять сетевое имя компьютера. Метод имеет один параметр — строка, содержащий новое имя компьютера.

Так как классы Win32_Group И Win32_Account довольно простые, поэтому подробно они рассматриваться не будут.

Определение домена компьютера

Для определения домена, в котором находится компьютер, необходимо прочитать СВОЙСТВО Domain класса Win32_ComputerSystem (ЛИСТИНГ 2.23).

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem"); Для каждого Computer Из Computers Цикл

Сообщить("Имя: " + Computeг.Name);

Сообщить("Домен: " + Computer.Domain);

КонецЦикла;
Для определения домена так же можно использовать свойство DNSDomain класса Win32_NetworkAdapterConfiguration.

Определение роли компьютера

Для определения роли компьютера, т. е. является ли компьютер сервером или рабочей станцией, используется свойство DomainRole класса win32_ComputerSystem. Данное свойство может возвращать одно из следующих значений:

? 0 — самостоятельная рабочая станция (Standalone Workstation);

П 1 — член рабочей станции (Member Workstation);

П 2 — самостоятельный сервер (Standalone Server);

П з — рядовой сервер, т. е. сервер, не имеющий статуса контроллера в конкретном домене (Member Server);

П 4 — резервный контроллер домена, т. е. компьютер в домене Windows NT, который содержит копию политики безопасности домена и его базы данных, а также служит резервом на случай, если главный контроллер домена недоступен (Backup Domain Controller);

П 5 — главный контроллер домена, е. компьютер в домене, который хранит главную копию базы данных учетных записей домена, проводит аутентификацию пользователей, а также может работать как файл-сервер, принт-сервер и сервер приложений (Primary Domain Controller).

Пример определения сетевой роли компьютера показан в листинге 2.24.

і Листинг 2.24. Определение роли компьютера

L.............—.......................-____д_-_--------------------------------

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem") ;

Для каждого Computer Из Computers Цикл

Массив = Новый Массив();

Массив.Добавить("Standalone Workstation");

Массив.Добавить("Member Workstationn");

Массив.Добавить("Standalone Server");

Массив.Добавить("Member Server");

Массив.Добавить("Backup Domain Controller");

Массив.Добавить("Primary Domain Controller");

Сообщить("Роль компьютера: " + Массив[Computer.DomainRole]);

КонецЦикла;

Определение имени текущего пользователя

Для определения имени пользователя, который в настоящее время подключен К компьютеру, используется СВОЙСТВО UserName класса Win32_ComputerSystem (листинг 2.25).

Листинг 2.25. Определение имени текущего пользователя

ЯЯНВНІННННННННННННІ^НІНННННВНЯННННшиКаСіяНИВИпЯІНВНИИВНІНВНМИНННННИНЯНИННННННННЯнЯНННІ^ІНІ

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",

Пользователь, Пароль);

Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem") ,-Для каждого Computer Из Computers Цикл

Сообщить("Пользователь: " + Computer.UserName);

КонецЦикла;

Определение локальныхгрупп компьютера

Для определения только локальных групп компьютера используется класс

Win32_Group С условием, ЧТО СВОЙСТВО LocalAccount равно True (Истина) .

Пример определения локальных групп приведен в листинге 2.26.

Листинг 2.26. Определение локальных групп компьютера

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2”, Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_Group Where LocalAccount = True");

Для каждого Item Из Items Цикл

Сообщить("Локальная запись: " + Item.LocalAccount);

Сообщить ("Имя группы: + Item.Name) ;

Сообщить("Идентификатор: " + Item.SID);

Сообщить("Тип: " + Item.SIDType) ;

Сообщить("Статус: " + Item.Status);

КонецЦикла;

Определение списка пользователей и групп

Для получения полного списка пользователей и групп используется класс win32__Account. Данный класс имеет свойство SIDType, которое может принимать следующие значения:

П 1 — если объект представляет свойства пользователя;

0 2 — группы пользователей;

П з — домена;

П 4 — псевдонима;

П 5 — общие группы;

О 0 — удаленной учетной записи;

П 7 — ошибочной учетной записи;

П 8 — неизвестной учетной записи;

П 9 — компьютера.

Ниже приведен пример вывода только пользователей и групп (листинг 2.27).

! Листинг 2.27. Определение списка пользователей и групп

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",

Пользователь, Пароль);

Items = ServicesSet.InstancesOf("Win32_Account");

Для каждого Item Из Items Цикл

Если Item.SIDType = 1 Тогда

Сообщить("Пользователь: " + Item.Caption);

ИначеЕсли (Item. SIDType = 2) или (Item. SIDType = 4) или (Item. SIDType = 5) Тогда Сообщить("Группа: " + Item.Caption);

КонецЕсли;

КонецЦикла; ,

Важно отметить, что объекты данного класса имеют разные наборы свойств в зависимости от значения свойства SIDType.

Работа с системной датой и временем

Для работы с датой и временем в WMI используется класс Win32 LccalTime Подробно останавливаться на нем не будем, т. к. он довольно простой.

Определение даты и времени

Приведем пример определения даты и времени, установленные на конкретном компьютере с помощью класса win32__LocalTime (листинг 2.28).

ши

{Листинг 2.28. Определение даты и времени

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32 LocalTime"); Для каждого Item Из Items Цикл Сообщить("День: " + Item.Day);

Сообщить("Месяц: " + Item.Month) ;

Сообщить("Год: ” + Item.Year);

Сообщить ("Час: ’’ + Item. Hours ;

Сообщить("Минута: " + Item.Minute);

Сообщить ("Секунда ; + item. Second) ;

КонецЦикла;

Определение временной зоны

Для определения временной зоны, установленной на компьютере, используется класс win32_?imeZone (листинг 2.29). В данном классе имеется два свойства: для отображения имени временной зоны, соответствующей летнему Времени (Day light Name), И стандартное ИМЯ (StandardNarne), которое СОответствует временной зоне зимнего времени.

Класс win32_TimeZone имеет следующие свойства для определения данных летнего времени:

DaylightName — ИМЯ Временной ЗОНЫ;

? Day.l iqhtDayOfWeek — день недели — воскресенье, 2 — понедельник и т. д., 7 — суббота);

П DaylightHour — час ДНЯ;

П DaylightMinute — Минута;

П DaylightSecond — секунда;

Администрирование Windows средствами WMI__83

П DaylightDay — день;

CD DaylightMonth — месяц;

? DaylightYear — ГОД.

Для временной зоны зимнего времени существует такой же набор свойств, ТОЛЬКО префикс Daylight заменен на Standard.

Листинг 2.29. Определение названий временных зон и их времени

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_TimeZone");

Для каждого Item Из Items Цикл

Сообщить ("Временная зона (светлое время суток) : " + Item. DaylightName) ;

Сообщить("Время: " + Item.DaylightHour + + Item.DaylightMinute +

+ Item.DaylightSecond) ;

Сообщить ("Временная зона (стандартное имя) : " + Item. StandardName) ;

Сообщить ("Время: " + Item. StandardHour + + Item. StandardMinute +

":" + Item.StandardSecond);

КонецЦикла;

Работа с журналами событий

Для работы с журналами событий в WMI существуют два класса:

? Win32_NTEventLogFile — работа с файлами журналов событий;

CJ Win32_NTLogEvent — просмотр записей журналов.

Класс win32_NTEventLogFile имеет следующие свойства:

? compressed — признак сжатия файла журнала событий;

П CompressionMethod — метод сжатия файла;

? Description — описание объекта;

О Drive — имя логического диска, на котором располагается файл;

ГН Encrypted — признак криптования файла;

П EncryptionMethod — метод криптования файла;

? FileName — имя файла;

? FileSize — размер файла в байтах;

П NumberOfRecords — количество записей в журнале.

Класс win32_NTEventLogFile имеет следующие методы:

П Copy (FiieName) — копирует файл журнала в имя, указанное в параметре FiieName;

О Rename{Filename) — переименовывает файл журнала. Новое имя файла задается в параметре FiieName;

О Delete () — удаляет файл журнала; ?

? compress о — сжимает (архивирует) файл;

П Uncompress о — разархивирует файл журнала;

П ClearEventLog () — очистка записей журнала.

Свойства класса win32._NTLogEvent рассматриваться не будет, т. к. их довольно немного и все предназначены только для просмотра журнала событий. Пример просмотра журнала событий показан в листинге 2.32.

Получение информации о журнале событий

Приведем пример просмотра количества записей журнала "System", максимально допустимого размера и имени файла (листинг 2.30).

[/Листинг2.30. Получение информации о журнале событий

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль) ;

Items = ServicesSet.ExecQuery("Select * from Win32_NTEventLogFile where LogFileName='System'");

Для каждого Item Из Items Цикл

Сообщить("Количество записей в журнале: " + Item.NumberOfRecords); Сообщить ("Максимальный размер файла: " + Item.MaxFileSize) ,•

Сообщить("Имя файла журнала: " + Item. Name);

КонецЦикла;

В запросе данного кода происходит фильтрация объектов по условию — метод LogFileName (имя журнала) равен строке 'System'.

Копирование и очистка журнала

Иногда бывает необходимо сделать копию журнала событий, после чего очистить его. Для этих целей предназначены методы сору и ciearEventLog класса Win32_NTEventLogFile (ЛИСТИНГ 2.31).

LogFileName='Application'");

Для каждого Item Из Items Цикл

Item.Copy("c:\application.evt"); // Копирование журнала Item.ClearEventLog(); // Очистка журнала от записей

КонецЦикла;

Просмотр записей журнала

Для просмотра записей журнала используется класс win32__NTLogF,vent. Приведем пример просмотра записей журнала "System" (листинг 2.32).

Листинг 2.32. Просмотр записей журнала

ServicesSet - Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",

Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from Win32_NTLogEvent where Logfile='System'");

Для каждого Item Из Interns Цикл

Сообщить("Category: " + Item. Category);

Сообщить("ComputerName: " + Item.ComputerName);

Сообщить("Message: " + Item.Message);

Сообщить("RecordNumber: " + Item.RecordNumber);

Сообщить("TimeWritten: " + Item.TimeWritten);

Сообщить("User: " + Item.User);

Сообщить - ;

КонецЦикла;

Работа с файлами и папками

Для работы с файлами обычно применяется класс ciM_DataEiie. Основные свойства класса:

? Name — полное имя файла;

П Path — путь к файлу;

? Archive — признак архивного файла;

? system — признак системного файла;

О compressed — признак сжатого файла;

П Drive — символ (идентификатор) логического диска, на котором записан файл;

О Extension — расширение файла;

? FileSize — размер файла;

? EightDotThreeFiieName — DOS-совместимое имя файла (например, c:\progra~l).

Основные методы класса:

Г1 Compress о — сжимает файл;

? Copy (FiicName) — копирует файл (новое имя файла определяется параметром File Name5 ;

О Delete о — удаляет файл;

П Rename (FileName) — переименовывает файл (новое имя файла определяется параметром FileName).

В листингах 2.33 и 2.34 приведены примеры работы со свойствами и методами данного класса.

Переименование файлов

Приведем пример переименования файла ReadMe.txt, который находится в папке c:\Program Files\lCv77 (листинг 2.33).

-¦’•-—¦-Гт*’-—

| Листинг 2.33. Переименование файлов

ННЕВЕшЗ&Яееэ!

ServicesSet = ПолучитьСОМОбъект ("winmgmts: !\\" + ИмяКомпьютера + "\root\cimv2");

Items = ServicesSet.ExecQuery("Select * from CimDatafile where Name = 'c:WProgram Files\\lCv77\\ReadMe.txt'");

Для каждого Item Из Items Цикл

Результат = Item.Rename("с:WProgram Files\\lCv77\\ReadMe.bak"); КонецЦикла;

Поиск всех файлов по расширению

Для того чтобы найти все файлы пользователя по расширению, используется запрос к классу clM_DataFile с условием по расширению (свойство Extension). Пример поиска всех файлов с расширением МРЗ приведен в листинге 2.34.

| Листинг 2.34. Поиск всех файлов по расширению

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2", Пользователь, Пароль);

Items = ServicesSet.ExecQuery("Select * from CIM_DataFile where Extension

= 'mp3'");

Для каждого Item Из Items Цикл

Сообщить("Имя файла: + Item.Name)

КонецЦикла;

Открытие общего доступа к папке

Для управления доступом к папкам в WMI используется класс win32_Share. Для создания доступа к папке предназначен метод Create, который имеет следующие параметры:

П Path — путь к папке;

? Name — имя общего ресурса;

П туре — тип общего ресурса (о — папка или диск, — принтер, 2 — какое-либо устройство);

? Max imumAI lowed — максимальное количество подключений;

П Description — описание.

Для удаления доступа предназначен метод Delete без параметров.

Пример создания общего доступа к папке C:\Program Files приведен в листинге 2.35).

гт~~——~——-г“~ —щагмишм

i Листинг 2.35. Открытие общего доступа к пап

FILE_SHARE =

MAXIMUM_CONNECTIONS = 25;

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" + ИмяКомпьютера +

NewShare = ServicesSet.Get("Win32_Share");

Попытка

'Share4You",

Результат = NewShare.Create("C:\Program Files”, FILE_SHARE, MAXIMUM__CONNECTIONS, "Общшя доступ.") ,

Исключение

Сообщить("Ошибка. Невозможно открыть доступ."); КонецПопытки;

Работа с принтерами

Для работы с принтерами используется класс Win32_Printer. Рассмотрим основные свойства данного класса:

О Name — имя принтера;

П Comment — комментарий к принтеру;

d Default — признак принтера по умолчанию;

? Description — описание;

О DriverName — название драйвера принтера;

О Local — признак локального принтера;

П Network — признак сетевого принтера;

? shared — признак наличия общего доступа к принтеру;

О PortName — имя порта принтера;

? PrinterStatus — текущий статус принтера (і — прочий, 2 — неизвестный, з — ожидает, 4 — печатает, 5 — подготавливается, 6 — остановлен, 7 — выключен).

Класс Win32_Printer имеет следующие методы:

О AddPrinterCor.nection (Name) — добавить новый сетевой принтер с сетевым именем Name;

П SetDefaultPrinter() — установить принтер по умолчанию;

П cancelftUJofcs о — отменить все задания;

О Pause {) — приостановить печать;

? Resume {) — возобновить печать;

? PrintTestPage о — распечатать тестовую страницу;

? RenamePrinter(NewPrinterName) — переименовать принтер (новое ИМЯ принтера задается в параметре NewPrinterName).

Добавление нового сетевого принтера

Приведем пример добавления сетевого принтера с сетевым именем "\\OfficeServer\MainOfficePrinter" (листинг 2.36).

Листинг 2.36. Добавление нового сетевого принтера

ServicesSet =

ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!W" + ИмяКомпьютера + "\root\cimv2");

NewPrinter = ServicesSet.Get("Win32_Printer");

Попытка

Результат = NewPrinter.AddPrinterConnection ("\\0fficeServer\MainOfficePrinter");

Исключение

Сообщить("Ошибка. Невозможно добавить принтер.");

КонецПопытки;

Установка принтера по умолчанию

Пример установки принтера по умолчанию приведен в листинге 2.37.

адюдам

Іш

Листинг 2.37. Установка принтера по умолчанию

?НННКгаЯгаНмМННИЯНЯШННННННННИЯНштИВЛНшІЕзІішІ

ИмяПринтера = "MainOfficePrinter";

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel= impersonate}!\\" + ИмяКомпыотера + "\root\cimv2");

Printers = ServicesSet.Get("Win32_Printer");

Items “ ServicesSet.ExecQuery("Select * from Win32_Printer Where Name = ' " + ИмяПринтера + " ' ");

Для каждого Item Из Items Цикл

Item.SetDefaultPrinter() ;

КонецЦикла;

В данном примере, в запросе, используется конструкция where для фильтрации объектов коллекции по имени (свойство Name).

Работа с заданиями планировщика

Для работы с заданиями планировщика используется класс Win32 SchedulodJob.

Основные свойства данного класса определены на примере просмотра заданий (листинг 2.38).

Класс win32_ Scheduled job имеет два метода.

О create — добавить задание. Метод имеет следующие параметры:

• Command — путь к программе, которая будет запускаться;

• startTime — время запуска в UTC-формате (Universal Time Coordinated — универсальное синхронизированное время), при этом общее представление формата можно записать в виде — "YYYYMMDDHHMMSS.MMMMMM(+-)000", где "YYYYMMDD" можно заменить на "*******=1=" (например, дата "******** 123000.000000420" означает запуск в 12:30 после полудня;

• RunRepeatedly — признак многократного выполнения;

• Daysofweek — день недели (1 — понедельник, 2 — вторник, 4 — среда, 8 — четверг, 16 — пятница, 32 — суббота, 64 — воскресенье);

• DaysOfMonth — число месяца;

• interactWithDesktop — признак взаимодействия с рабочим столом;

• Jobld — идентификационный номер задания.

О Delete () — удалить задание.

Просмотр заданий в планировщике

Рассмотрим пример просмотра всех заданий планировщика (листинг 2.38).

Листинг 2,38; Просмотр заданий в планировщике

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel= impersonate}! \\" + ИмяКомпьютера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * from Win32_ScheduledJob"); Для каждого Item Из Items Цикл

Сообщить("Заголовок: " + Item.Caption);

Сообщить("Команда: " + Item.Command) ;

Сообщить ("День месяца : " + Item. DaysOfMonth) ;

Сообщить("День недели: " + Item. DaysOfWeek);

Сообщить("Описание: " + Item.Description);

Сообщить("Продолжительность: " + Item.ElapsedTime);

Сообщить ("Дата инсталляции: " + Item. InstallDate) ;

Сообщить("Имя: ” + Item.Name);

Сообщить ("Оповещение: Item.Notify) ;

Сообщить("Приоритет: " + Item.Priority);

Сообщить("Время старта: " + Item. StartTime);

Сообщить("Статус: " + Item.Status);

Сообщить("====================5==========”);

КонецЦикла;

Создание заданий

Для создания задания используется метод create. Приведем пример ежемесячного запуска программы "Блокнот" (notepad.exe) каждого второго числа месяца в 23:30 (листинг 2.39).

ний в планировщик-

at:іл??ЗяшаСа

Листинг 2.39. Создание:

Номер;

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLeveb impersonate}!\\" + ИмяКомпьютера +

Obj ectSet = ПолучитьСОМОбъект("WinMgmts:Win32_ScheduledJob")

ObjectSet.Create("notepad.exe", "********123000.000000 420",True,1,2,True,Номер);

Сообщить ("Заданию присвоен номер: " + Номер) ;

Работа с системным реестром

Для работы с системным реестром предназначен класс stdRegProv, принадлежащий пространству имен root\defauIt. Данный класс совсем не имеет свойств, все действия и значения ключей доступны только через методы.

? CreateKey(DefKey, SubKeyName) — создание нового ключа. Параметры метода могут принимать значения:

• DefKey — идентификатор корневого имени раздела, определяется значениями:

О 2147483648 — HKEY_CLASSES_ROOT;

О 214 7 4 83649 -HKEY_CURRENT_USER;

О 2147483650 - HKEY_LOCAL_MACHINE;

О 2147483651-HKEY_USERS;

О 2147483653 - HKEY_CURRENT_CONFIG;

О 2147483654- HKF.Y DYN.....DATA:

• SubKeyName — имя создаваемого ключа (раздела).

О De]eteKey(DefKey, SubKeyName) — удаление раздела. Параметры метода

аналогичны Методу CreateKey.

? DeleteValue (DefKey, SubKeyName, ValueName) — удаление параметра. Параметры DefKey и SubKeyName аналогичны параметрам метода create-Кеу, параметр ValueName задает имя удаляемого параметра.

П GetDWORDValu.e (De СКеу, SubKeyName, ValueName, Value) — Получение

значения параметра типа DWORD. Параметры DefKey, SubKeyName и ValueName аналогичны параметрам метода DeleteValue. В параметр value возвращается значение ключа ValueName.

П GetStringValue(DefKey, SubKeyName, ValueName, Value) — Получение строкового параметра. Все параметры аналогичны параметрам метода

GetDWORDValue.

О GetExpandedStringValue(DefKey, SubKeyName, ValueName, Value) —

получение значения расширяемого строкового параметра. Все параметры аналогичны параметрам метода GetStringValue.

П SetDWORDVaiue (DefKey, SubKeyName, ValueName, Value) — создание нового параметра типа DWORD. Здесь параметр value задает значение ключа, остальные аналогичны параметрам метода GetStringValue.

П SetStringValue(DefKey, SubKeyName, ValueName, Value) — создание строкового параметра. Все параметры аналогичны параметрам метода SetDWORDVaiue.

О SetExpandedStringValue(DefKey, SubKeyName, ValueName, Value) — создание параметра расширяемого строкового типа. Все параметры аналогичны параметрам метода SetowoRDvaiue.

Чтение значений ключей реестра

Для чтения значений ключей реестра используются методы Getstringvaiue, GetExpandedStringValue И GetstringValue, В зависимости ОТ Типа значения параметра.

Рассмотрим пример чтения значения параметра с именем "HistoryBuffersize", находящимся в разделе HKEY__CURRENT_USER\Console (листинг 2.40).

! Листинг 2.40. Чтение значений ключей реестра

I,..........................................................і..............................................................I—

Перем Значение;

HKEY_CURRENT_USER = 2:47483649; ПутьККлючу = "Console"; ИмяПараметра = "HistoryBufferSize"

Reg = ПолучитьСОМОбъект("winmgmts: {impersonationLevel=impersonate} !\\" + ИмяКомпьютера + "\root\default:StdRegProv")

Reg.GetDWORDValue(HKEY_CURRENT_USER, ПутьККлючу, ИмяПараметра, Значение); Сообщить("Значение: " + Значение);

Создание нового раздела

Приведем пример создания нового раздела с помощью класса StdRegProv (листинг 2.41).

I Листинг 2.41. Создание нового ключа раздела

HKEY_LOCAL_MACHINE = 2147483650;

Reg -- ПолучитьСОМОбъект (’Vinmgmts : { iir'.personationLevei=impersonate} !W" + ИмяКомпьютера + "\root\default:StdRegProv");

ПутьККлючу = "SOFTWAREXNewKey";

Reg.CreateKey(HKEY_LOCAL_MACHINE, ПутьККлючу);

В приведенном примере создается раздел HKEY_LOCAL_MACHINE\ SOFTWARE\ NewKey.

Создание нового параметра

Рассмотрим пример создания нового параметра реестра (листинг 2.42). В примере создается параметр "Форум для вопросов" со значением "" в разделе HKEY_L0CAL_MACH1NE\ SOFlWARE\ NewKey.

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

I Листинг 2.42. Создание нового параметра реестра

L.„: _______----______.___ „..L__________!u: '

HKEY LOCAL MACHINE = 2147483650;

ПутьККлючу = " SOFTWARE\NewKey" ,• .

Reg = ПолучитьСОМОбъект("winrngmts:{impersonationLevel=impersonat.eji\\" + ИмяКомпьютера + "\root\default:StdRegProv");

ИмяПараметра = "Форум для вопросов";

Значение = "";

Reg.SetExpandedStringValue(HKEY_LOCAL_MACHINE, ПутьККлючу, ИмяПараметра Значение);

Работа с сетью

Для работы с сетью в WMI предназначены два основных класса: Win32_NetworkAdapterConfiguration И Win32_NetworkAdapter. Перечислять все свойства и методы не имеет смысла, т. к. их огромное количество. Назначение многих очень специфичные и будут понятны только сетевым администраторам.

Рассмотрим только некоторые из них.

Отключение сетевого соединения

Если вы используете протокол динамической конфигурации хоста (DHCP, Dynamic Host Configuration Protocol), то отключить сетевое соединение можно методом ReleaseDHCPLease класса Win32_NetworkAdapterConfiguration (листинг 2.43). Иначе, с помощью WMI, это выполнить невозможно. Для возобновления соединения используется метод RenewDHCPLease.

Листинг 2.43. Отключение сетевого соединения

ЯНБшЯНННННІ—ИНННННННННН_____ИННЯН—ЯН—Hi

ServicesSet = ПолучитьСОМОбъект("winrngmts:{impersonationLevel impersonate}!\\” + ИмяКомпьютера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True");

Для каждого Item Из Items Цикл Item.ReleaseDHCPLease ();

КонецЦикла;

Определение MAC- и ІР-адресов

Для определения IP-адреса, который назначен данному сетевому компьютеру, необходимо сначала определить его МAC-адрес, используя класс Win32_NetworkAdapter. А затем, ИСПОЛЬЗуя класс Win32j>fetworkMapterConfiguratian, найти IP-адрес, соответствующий данному МАС-адресу. Пример реализации такого механизма поиска приведен в листинге 2.44.

Листинг 2.44. Определение MAC- IP-адресов

MACAddress =

ServicesSet ¦= ПолучитьСОМОбъектГ?іптдпЛз:{impersonationLevel= impersonate!і W‘ + ИмяКомпьютера + "\root\cimv2") ;

Items = ServicesSet.ExecQuery("Select * From Win32_NetworkAdapter")

Для каждого Item Из Items Цикл MACAddress = Item.MACAddress;

КонецЦикла;

Если MACAddress о Тогда

Сообщить("MAC адрес: + MACAddress;;

Items = ServicesSet.ExecQuery("Select * From Win32_JsIetworkAdapterConf iguration") ;

Для каждого Item Из Items Цикл

Если Item,MACAddress = MACAddress Тогда

Для каждого IPAddress Из Item,IPAddress Цикл Сообщить(”IP адрес: + IPAddress);

КонецЦикла;

КонецЕсли;

КонецЦикла;

КонецЕсли;

Использование команды Ping

Для проверки доступности адресата путем передачи ему специального сигнала можно использовать программу ping.exe. Средствами WMI это можно сделать с помощью проверки значения свойства statusCode класса Win32_PingStatus (ЛИСТИНГ 2.45).

В качестве значения свойства Address, в запросе, может использоваться как имя компьютера (Hostname), так и IP-адрес.

Администрирование Windows средствами WMI_

95

Листинг 2.45, Использоізание команды Ping

//IPAddress = "172.20.129.102"; // IP-адрес IPAddress = "MAVCOMP"; // Hostname

ServicesSet = ПолучитьСОМОбъект ("winmgmts:\\" + ИмяКомпыотера + "\root\cimv2");

Items = ServicesSet,ExecQuery; "Select * From Win32 PingStatus

where Address = + IPAddress +

Для каждого Item Из Items Цикл

Если (Item,StatusCode = NULL) или (Item. StatusCode <> 0) Тогда

Сообщить("Компьютер не отвечает.");

Иначе

Сообщить("Компьютер ответил.");

КонецЕсли;





Содержание раздела