Управление сетями Windows с помощью сценариев (Часть 3)

Published on Февраль 19, 2009 by   ·   Комментариев нет

В первой статье из этой серии мы узнали, как изменить IP адрес сетевого адаптера на компьютере с операционной системой Windows с помощью языка программирования VBScript. Наряду с этим мы изучили много основных концепций для написания сценариев Windows, таких как классы (class), объекты (object), свойства (property), методы (method) и различные типы переменных, включая строковые переменные (string variables), целые переменные (integer variables), массивы (arrays) и коллекции (collections). Также мы изучили некоторые основы написания хороших сценариев, описание переменных, использование обработок ошибок, пользовательского ввода, отображение подтверждения вывода, а также использование комментария в сценарии.

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

Set objWMIService = GetObject(«winmgmts:\\» & strComputer & «\root\cimv2″)

В моей первой статье я сделал следующий комментарий, относящийся к этой строке: «Это подключает вас к пространству имен root\cimv2 namespace на локальном компьютере, благодаря описанию объекта под названием objWMIService, и присвоению ему ссылки, возвращаемой методом GetObject.»

Так что же это значит на понятном языке? Что такое WMI и как он работает? И почему так важно его изучить, если вы хотите научиться писать сценарии, помогающие управлять компьютерами Windows?

Описание WMI

WMI присутствовал начиная со времен операционной системы Windows 98 и даже еще раньше, только тогда он назывался немного по-другому: Web-Based Enterprise Management (WBEM). WBEM – это технология, которая была разработана совместно компаниями Microsoft, Cisco, Intel, Compaq и BMC Software, для того чтобы облегчить управление рабочими станциями и серверными системами в корпоративной среде. WMI предоставляет модель для описания, хранения и обращения к конфигурации и информации о статусе, а также многих других аспектов компьютеров, работающих под управлением операционной системы Windows. Разработчики могут использовать WMI для написания сценариев или управляемого кода для просмотра и изменения конфигурационных настроек на компьютерах с Windows, для просмотра статуса приложений и служб Windows, а также для того, чтобы выполнять еще много других вещей, облегчающих жизнь администраторам, которые занимаются установкой, поддержкой и отладкой сетей Windows.

Другими словами WMI можно перевести так:

  • Windows – работает на компьютерах под управлением операционной системы Microsoft Windows
  • Management – может быть использована для управления этими компьютерами
  • Instrumentation – предоставляет инструменты для просмотра и модификации процессов, происходящих внутри этих компьютеров

Хорошей аналогией может служить представление компьютера с операционной системой Windows в виде машины, а WMI в виде электроники (инструментария), которая позволяет вашей панели инструментов показывать скорость вашей машины, температуру двигателя, обороты RPM, и т.д. Сами по себе эти приборы не являются WMI – вы по-прежнему должны узнать способ, чтобы получить эту информацию из электроники и представить в подходящем виде. Написание сценариев на VBScript, которые используют WMI, аналогично созданию панели инструментов, которая получает информацию из инструментария, и сообщает вам то, что вы хотите узнать, а также то, что делает ваш двигатель. Другими словами, Windows управляется с помощью всего этого инструментария, встроенного в WMI – вы лишь должны выяснить, как получить эту информацию, чтобы вы могли сделать то, что вам нужно, например, изменить IP адрес, узнать вашу временную зону, перезагрузить удаленную машину, посмотреть список установленных обновлений – в общем, все, что угодно.

Пространства имен WMI

Практически все – это не совсем верно. В действительности объяснение, что может и что не может WMI, требует немного спокойствия и внимания. Давайте начнем с рассмотрения пространства имен WMI. В терминологии WMI, пространство имен (namespace) – это своего рода логическая база данных классов и их ссылок. Ниже приведен простой сценарий под названием ShowNamespaces.vbs, который отображает все пространства имен WMI, находящиеся под корневым пространством имен:

Set objWMIService = GetObject(«winmgmts:\\.\root»)
Set colNamespaces = objWMIService.InstancesOf(«__NAMESPACE»)

For Each objNamespace In colNamespaces
WScript.Echo objNamespace.Name
Next

Ниже представлен результат работы этого сценария на компьютере с операционной системой Windows XP:

C:\scripts>cscript ShowNamespaces.vbs

Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

SECURITY
RSOP
Cli
SecurityCenter
WMI
CIMV2
Policy
Microsoft
DEFAULT
directory
subscription

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

Set objWMIService = GetObject(«winmgmts:\\.\root\CIMV2»)

После запуска этого модифицированного сценария, мы увидим следующий результат:

C:\scripts>cscript ShowNamespaces.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All
rights reserved.

ms_409
Applications

В действительности, root\CIMV2 – это пространство имен WMI по умолчанию на компьютерах с операционной системой Windows. Это значит, что если вы не укажете названия пространства имен, к которому вы подключаетесь в первой сточке этого сценария, то WMI автоматически подключится к пространству имен по умолчанию, которым является пространство имен root\CIMV2 namespace. Поэтому, если мы изменим первую строку нашего сценария на такую:

Set objWMIService = GetObject(«winmgmts:\\»)

то мы получим тот же самый результат. Обратите внимание, что мы также убрали точку из строки winmgmts:\\.\root\CIMV2. Если вы помните из нашей первой статьи, эта точка обозначала локальный компьютер и по умолчанию WMI предполагает, что мы работаем с локальным компьютером, а поэтому, если вы хотите, то можете не использовать точку. Однако, лучше всего использовать в сценарии переменные (а также описать их), поэтому ниже представлен более общий и аккуратный сценарий, который мы можем использовать для просмотра пространства имен WMI:

Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim objWMIService
Dim colNamespaces
Dim objNamespace

strComputer = «.»
strWMINamespace = «\root\CIMV2»

Set objWMIService = GetObject(«winmgmts:\\» & strComputer & strWMINamespace)
Set colNamespaces = objWMIService.InstancesOf(«__NAMESPACE»)

For Each objNamespace In colNamespaces
WScript.Echo objNamespace.Name
Next

Для чего нужно все это лишнее беспокойство? Основная причина заключается в гибкости! Например, если нам необходимо запустить сценарий для удаленного компьютера, мы можем изменить значение переменной strComputer на IP адрес удаленной машины. Или если нам нужно увидеть другой раздел пространства имен, мы можем добавить несколько строк в наш сценарий, и с помощью ввода пользователя получить значение переменной strWMINamespace.

Поставщики WMI

Определение правильного пространства имен – это лишь первая проблема (хотя в большинстве случает будет достаточно подключения к пространству имен по умолчанию). Вы также должны обратиться к правильному поставщику, для того чтобы получить или обновить данные на интересующей вас системе. Ниже приведен сценарий под названием ShowProviders.vbs, который позволяет увидеть всех поставщиков WMI providers для пространства имен root\CIMV2:

Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim objWMIService
Dim colWin32Providers
Dim objWin32Provider

strComputer = «.»
strWMINamespace = «\root\CIMV2»

Set objWMIService = GetObject(«winmgmts:\\» & strComputer & strWMINamespace)
Set colWin32Providers = objWMIService.InstancesOf(«__Win32Provider»)

For Each objWin32Provider In colWin32Providers
WScript.Echo objWin32Provider.Name
Next

А ниже можно увидеть результат работы сценария на компьютере с операционной системой Windows XP:

C:\scripts>cscript ShowProviders.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Win32_WIN32_TSLOGONSETTING_Prov
MS_NT_EVENTLOG_PROVIDER
Win32_WIN32_TSENVIRONMENTSETTING_Prov
SCM Event Provider
ProviderSubSystem
VolumeChangeEvents
NamedJobObjectLimitSettingProv
HiPerfCooker_v1
WMIPingProvider
Microsoft WMI Forwarding Event Provider
Win32_WIN32_TSNETWORKADAPTERSETTING_Prov
SystemConfigurationChangeEvents
Win32_WIN32_TERMINALSERVICE_Prov
Win32_WIN32_TSREMOTECONTROLSETTING_Prov
Win32_WIN32_TSNETWORKADAPTERLISTSETTING_Prov
Win32_WIN32_COMPUTERSYSTEMWINDOWSPRODUCTACTIVATIONSETTING_Prov
Win32_WIN32_TSSESSIONDIRECTORY_Prov
CmdTriggerConsumer
Standard Non-COM Event Provider
SessionProvider
WBEMCORE
RouteEventProvider
WhqlProvider
Win32_WIN32_TSSESSIONSETTING_Prov
Win32_WIN32_TERMINALTERMINALSETTING_Prov
Win32_WIN32_TSCLIENTSETTING_Prov
Win32_WIN32_TERMINALSERVICESETTING_Prov
WMI Kernel Trace Event Provider
Win32_WIN32_PROXY_Prov
NamedJobObjectProv
MS_Shutdown_Event_Provider
SECRCW32
Win32ClockProvider
MS_Power_Management_Event_Provider
Win32_WIN32_WINDOWSPRODUCTACTIVATION_Prov
RouteProvider
Cimwin32A
Msft_ProviderSubSystem
Win32_WIN32_TERMINALSERVICETOSETTING_Prov
NamedJobObjectSecLimitSettingProv
Win32_WIN32_TSSESSIONDIRECTORYSETTING_Prov
Win32_WIN32_TSPERMISSIONSSETTING_Prov
Win32_WIN32_TSACCOUNT_Prov
Win32_WIN32_TERMINAL_Prov
MSIProv
DskQuotaProvider
NetDiagProv
Win32_WIN32_TSGENERALSETTING_Prov
CIMWin32
NamedJobObjectActgInfoProv
NT5_GenericPerfProvider_V1
WMI Self-Instrumentation Event Provider
MS_NT_EVENTLOG_EVENT_PROVIDER

Выглядит немного пугающе, не так ли? Однако с помощью этого списка поставщиков вы легко найдете в MSDN более подробную информацию относительно конкретного поставщика, узнаете, какие методы от поддерживает, для чего он нужен, и что вы сможете с ним сделать в WMI.

Классы WMI

Кроме пространств имен и поставщиков, вы также должны знать, что такое классы WMI, если вы хотите использовать всю мощь WMI для создания сценариев по выполнению административных задач в Windows. Класс – это некий шаблон для типа объекта, которым вы можете управлять с помощью WMI. Например, класс под названием Win32_LogicalDisk – это шаблон для локальных дисков на компьютере Windows, и WMI использует этот класс для формирования одной ссылки Win32_LogicalDisk для каждого установленного диска.

Ниже представлен сценарий под названием ShowClasses.vbs, который позволяет увидеть все классы (потенциально управляемых объектов) для пространства имен root\CIMV2:

Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim objWMIService
Dim colClasses
Dim objClass

strComputer = «.»
strWMINamespace = «\root\CIMV2»

Set objWMIService = GetObject(«winmgmts:\\» & strComputer & strWMINamespace)
Set colClasses = objWMIService.SubclassesOf()

For Each objClass In colClasses
WScript.Echo objClass.Path_.Path
Next

А ниже вы можете увидеть результат выполнения этого сценария на компьютере с операционной системой Windows XP:

C:\scripts>cscript ShowClasses.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

\\XP\ROOT\CIMV2:__SystemClass
\\XP\ROOT\CIMV2:__thisNAMESPACE
\\XP\ROOT\CIMV2:__Provider
\\XP\ROOT\CIMV2:__Win32Provider
\\XP\ROOT\CIMV2:__IndicationRelated
\\XP\ROOT\CIMV2:__EventGenerator
\\XP\ROOT\CIMV2:__TimerInstruction
\\XP\ROOT\CIMV2:__IntervalTimerInstruction

\\XP\ROOT\CIMV2:MSFT_WMI_GenericNonCOMEvent
\\XP\ROOT\CIMV2:MSFT_WmiSelfEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_OperationEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_ComServerLoadOperationEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_InitializationOperationFailureEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_LoadOperationEvent
\\XP\ROOT\CIMV2:Msft_WmiProvider_OperationEvent_Pre
\\XP\ROOT\CIMV2:Msft_WmiProvider_DeleteClassAsyncEvent_Pre
\\XP\ROOT\CIMV2:Msft_WmiProvider_GetObjectAsyncEvent_Pre

\\XP\ROOT\CIMV2:Win32_ComputerSystemEvent
\\XP\ROOT\CIMV2:Win32_ComputerShutdownEvent
\\XP\ROOT\CIMV2:Win32_SystemTrace
\\XP\ROOT\CIMV2:Win32_ModuleTrace
\\XP\ROOT\CIMV2:Win32_ModuleLoadTrace
\\XP\ROOT\CIMV2:Win32_ThreadTrace
\\XP\ROOT\CIMV2:Win32_ThreadStartTrace
\\XP\ROOT\CIMV2:Win32_ThreadStopTrace
\\XP\ROOT\CIMV2:Win32_ProcessTrace
\\XP\ROOT\CIMV2:Win32_ProcessStartTrace
\\XP\ROOT\CIMV2:Win32_ProcessStopTrace

И снова все это выглядит слишком ошеломляюще, но с помощью этого списка классов вы сможете воспользоваться MSDN и получить более подробную информацию относительно конкретного класса WMI, узнать его методы и свойства.

Использование WMI

Теперь давайте воспользуемся знаниями, которые мы получили выше. Один из классов, который мы получили выше, называется Win32_TimeZone, поэтому давайте воспользуемся им для того, чтобы узнать временную зону, которая настроена на нашем компьютере. Сперва мы должны узнать немного больше об этом классе, и в результате поиска с ключевым словом «Win32_TimeZone class» мы получим следующую страницу в MSDN. На этой странице мы можем найти информацию относительно свойств и методов, которые поддерживает этот класс (хотя в действительности у этого класса есть только свойства, и нет методов), и с помощью этой информации мы сможем написать необходимый нам сценарий.

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

Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem

strComputer = «.»
strWMINamespace = «\root\CIMV2»
strWMIQuery = «SELECT * FROM Win32_TimeZone»

Set objWMIService = GetObject(«winmgmts:\\» & strComputer & strWMINamespace)
Set colItems = objWMIService.ExecQuery(strWMIQuery)

For Each objItem In colItems
WScript.Echo objItem.Caption
Next

Ниже представлен результат выполнения этого сценария:

C:\scripts>cscript DisplayTimeZone.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

(GMT-06:00) Central Time (US & Canada)

Давайте разберемся, как работает этот сценарий. Во-первых, вы можете основную его часть вы уже видели в предыдущих сценариях. Другими словами мы начинаем с подключения к WMI с помощью следующей строки:

Set objWMIService = GetObject(«winmgmts:\\» & strComputer & strWMINamespace)

Однако, следующая строка новая:

Set colItems = objWMIService.ExecQuery(strWMIQuery)

В этой строке мы обращаемся к WMI для сбора некоторой информации с запросом. Запрос был определен в строке выше и выглядит следующим образом:

strWMIQuery = «SELECT * FROM Win32_TimeZone»

Этот запрос наподобие SQL SELECT возвращает все (символ звездочка), что предлагает нам поставщик Win32_TimeZone, и запоминает результат в коллекции под названием colItems. Если мы просмотрим все элементы из этой коллекции (не самом деле в этой коллекции есть только один элемент) и выведем свойство Caption, каждого из элементов, то получим следующую строку:

(GMT-06:00) Central Time (US & Canada)

Попробуйте это упражнение

В следующих статьях мы углубимся в написание сценариев с использованием WMI, а сейчас давайте попробуем выполнить следующее небольшое упражнение. Скопируйте содержимое сценария под названием DisplayTimeZone.vbs в блокнот Notepad (убедитесь, что перенос строк выключен) и сохраните его под названием PageFile.vbs. Теперь измените одну строку в сценарии (в действительности лишь небольшую часть строки), чтобы после выполнения сценарий позволил нам узнать название страничного файла системы вместо временной зоны. Ниже приведена подсказка: поищите в MSDN информацию о классе Win32_PageFile. В следующей статье я приведу ответ на это упражнение.

bruxism treatment

www.windowsnetworking.com

zp8497586rq




















































































































































Смотрите также:

Tags: , , , ,

Readers Comments (Комментариев нет)

Comments are closed.



Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]