Командная строка и сценарии Windows

Типичные администраторские сценарии WMI

Разбить на страницы
Показывать лекцию целиком

Типичные администраторские сценарии WMI

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

Управление компьютером

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

Завершение сеанса пользователя

Для завершения сеанса активного пользователя необходимо вызвать метод Win32Shutdown объекта Win32_OperatingSystem (листинг 13.1).

'*******************************************************************
' Имя: LogOff.vbs
' Язык: VBScript
' Описание: Завершение сеанса пользователя  
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objInstance       ' Элемент коллекции

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"

' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objInstance In colInstances
  ' Выводим на экран предупреждение
  WScript.Echo "На компьютере "   objInstance.CSNAME  VbCrLf _
               "сеанс текущего пользователя будет завершен "  
  ' Для каждого экземпляра вызываем метод Win32Shutdown
  objInstance.Win32Shutdown(0)      
Next
'************************* Конец ***********************************

Перезагрузка компьютера

Для перезагрузки компьютера необходимо использовать метод Reboot объекта Win32_OperatingSystem (листинг 13.2). При этом при подключении к подсистеме WMI необходимо указать дополнительные привилегии Shutdown (для перезагрузки локального компьютера) и RemoteShutdown (для перезагрузки удаленного компьютера).

'*******************************************************************
' Имя: Reboot.vbs
' Язык: VBScript
' Описание: Перезагрузка компьютера
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objInstance       ' Элемент коллекции

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"

' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}!\\" _ 
               strComputer  "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objInstance In colInstances
  ' Выводим на экран предупреждение
  WScript.Echo "Компьютер "   objInstance.CSNAME _
               " будет перезагружен "  
  ' Для каждого экземпляра вызываем метод Reboot
  objInstance.Reboot()
Next
'************************* Конец ***********************************

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

В сценарии Shutdown.vbs (листинг 13.3) кроме непосредственного выключения компьютера (метод Shutdown объекта Win32_OperatingSystem ) с помощью средств языка VBScript реализована обработка возможных ошибок.

'*******************************************************************
' Имя: Shutdown.vbs
' Язык: VBScript
' Описание: Выключение компьютера
'*******************************************************************
Option Explicit
On Error Resume Next
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objInstance       ' Элемент коллекции
Dim iAnswer           ' Код возврата функции MsgBox

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}!\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objInstance In colInstances
  ' Выводим на экран предупреждение
  iAnswer = MsgBox("Выключить компьютер "  objInstance.CSNAME  " ?", _
                  vbQuestion + vbOKCancel, "Внимание!")

  If iAnswer = vbOK Then 
    ' Выводим сообщение о перезагрузке
    WScript.Echo "Компьютер "   objInstance.CSNAME  " будет выключен"  
    ' Вызываем метод Shutdown
    objInstance.Shutdown()

    If Err.number <> 0 Then
      WScript.Echo  "Номер ошибки: "  Err.Number  vbNewLine  _
                    "Описание: "  Err.Description
    End If
  Else 
    ' Выводим сообщение об отмене операции
    WScript.Echo  "Не будем пока выключать"
  End if
Next
'************************* Конец ***********************************

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

Листинги 13.4–13.7 содержат сценарии, позволяющие получить информацию об операционной системе (серийный номер, номер сборки, номер последнего обновления, дата установки, кодовая страница, список команд, которые выполняются автоматически при старте системы, и т. д.) и о BIOS компьютера (производитель, серийный номер, номер сборки и т. д.).

Вывод информации о BIOS

В сценарии BIOSInfo.vbs (листинг 13.4) на экран выводятся некоторые свойства объекта Win32_BIOS, в котором хранятся параметры и характеристики BIOS, установленной на компьютере.

'*******************************************************************
' Имя: BIOSInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о BIOS
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objBIOS           ' Элемент коллекции
Dim strResult         ' Результирующая строка

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_BIOS"
strResult = "Информация о BIOS :"  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("winmgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_BIOS
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objBIOS in colInstances
  strResult = strResult  "Name: "  objBIOS.Name  VbCrLf
  strResult = strResult  "Manufacturer: "  objBIOS.Manufacturer _
     VbCrLf
  strResult = strResult  "Caption: "  objBIOS.Caption  VbCrLf
  strResult = strResult  "Description: "  objBIOS.Description  VbCrLf    
  strResult = strResult  "Build Number: "  objBIOS.BuildNumber  VbCrLf
  strResult = strResult  "Current Language: "  objBIOS.CurrentLanguage  VbCrLf
  strResult = strResult  _
   "Installable Languages: "  objBIOS.InstallableLanguages  VbCrLf
  strResult = strResult  "Primary BIOS: "  objBIOS.PrimaryBIOS  VbCrLf
  strResult = strResult  "Release Date: "  objBIOS.ReleaseDate  VbCrLf
  strResult = strResult  "Serial Number: "  objBIOS.SerialNumber  VbCrLf
  strResult = strResult  "SMBIOS Version: "  _
    objBIOS.SMBIOSBIOSVersion  VbCrLf
  strResult = strResult  _
    "SMBIOS Major Version: "  objBIOS.SMBIOSMajorVersion  VbCrLf
  strResult = strResult  _
    "SMBIOS Minor Version: "  objBIOS.SMBIOSMinorVersion  VbCrLf
  strResult = strResult  "SMBIOS Present: "  objBIOS.SMBIOSPresent _
     VbCrLf
  strResult = strResult  "Status: "  objBIOS.Status  VbCrLf
  strResult = strResult  "Version: "  objBIOS.Version  VbCrLf
Next

'Выводим строку на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Вывод списка команд, выполняемых при загрузке системы

Все команды, которые выполняются автоматически при старте системы, хранятся в WMI в виде экземпляров класса Win32_StartupCommand. Сценарий StartupCommand.vbs, представленный в листинге 13.5, выводит эти команды на экран.

'*******************************************************************
' Имя: StartupCommand.vbs
' Язык: VBScript
' Описание: Вывод списка команд, выполняемых при загрузке компьютера
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colStartupCommands' Коллекция экземпляров класса WMI
Dim objStartupCommand ' Элемент коллекции
Dim strResult         ' Строка для вывода на экран

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_StartupCommand"
strResult = "Комманды выполняемые при загрузке компьютера :"  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_StartupCommand
Set colStartupCommands = objClass.Instances_

' Перебираем элементы коллекции 
For Each objStartupCommand in colStartupCommands
  strResult = strResult  objStartupCommand.Command  VbCrLf  
Next

' Выводим результат на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Вывод свойств операционной системы

Основные свойства установленной операционной системы (загрузочное устройство, номер сборки, дата установки и т. д.) можно получить с помощью объекта Win32_OperatingSystem (листинг 13.6).

'*******************************************************************
' Имя: OSProperty.vbs
' Язык: VBScript
' Описание: Вывод свойств операционной системы
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer        ' Имя компьютера
Dim strNamespace       ' Имя пространства имен
Dim strClass           ' Имя класса 
Dim objClass           ' Объект SWbemObject (класс WMI)
Dim colOperatingSystems' Коллекция экземпляров класса WMI
Dim objOperatingSystem ' Элемент коллекции
Dim strResult          ' Строка для вывода на экран

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
strResult = " Свойства операционной системы: "  VbCrLf  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colOperatingSystems = objClass.Instances_

' Перебираем элементы коллекции 
For Each objOperatingSystem in colOperatingSystems
  ' Формирум строку для вывода на экран 
  strResult = strResult  "Boot Device: "  _ 
              objOperatingSystem.BootDevice  VbCrLf
  strResult = strResult  "Build Number: "  _
              objOperatingSystem.BuildNumber  VbCrLf 
  strResult = strResult  "Build Type: "  _
              objOperatingSystem.BuildType  VbCrLf
  strResult = strResult  "Caption: "  _
              objOperatingSystem.Caption  VbCrLf
  strResult = strResult  "Code Set: "  _
              objOperatingSystem.CodeSet  VbCrLf
  strResult = strResult  "Country Code: "  _
              objOperatingSystem.CountryCode  VbCrLf
  strResult = strResult  "Install Date: "  _
              objOperatingSystem.InstallDate  VbCrLf
  strResult = strResult  "Licensed Users: "  _
              objOperatingSystem.NumberOfLicensedUsers  VbCrLf
  strResult = strResult  "Organization: "  _
              objOperatingSystem.Organization  VbCrLf
  strResult = strResult  "OS Language: "  _
              objOperatingSystem.OSLanguage  VbCrLf
  strResult = strResult  "OS Product Suite: "  _
              objOperatingSystem.OSProductSuite  VbCrLf
  strResult = strResult  "OS Type: "  _
              objOperatingSystem.OSType  VbCrLf
  strResult = strResult  "Primary: "  _
              objOperatingSystem.Primary  VbCrLf
  strResult = strResult  "Registered User: "  _
              objOperatingSystem.RegisteredUser  VbCrLf
  strResult = strResult  "Serial Number: "  _
              objOperatingSystem.SerialNumber  VbCrLf
  strResult = strResult  "Version: "  _
              objOperatingSystem.Version  VbCrLf
Next

' Выводим результат на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Определение номера последнего обновления, установленного на компьютере

Сценарий ServPack.vbs, приведенный в листинге 13.7, выводит на экран номер последнего обновления (ServicePack), которое было установлено на компьютере (свойства ServicePackMajorVersion и ServicePackMinorVersion объекта Win32_OperatingSystem ).

'*******************************************************************
' Имя: ServPack.vbs
' Язык: VBScript
' Описание: Вывод номера ServicePack для операционной системы
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer         ' Имя компьютера
Dim strNamespace        ' Имя пространства имен
Dim strClass            ' Имя класса 
Dim objClass            ' Объект SWbemObject (класс WMI)
Dim colOperatingSystems ' Коллекция экземпляров класса WMI
Dim objOperatingSystem  ' Элемент коллекции
Dim strResult           ' Строка для вывода на экран

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
strResult = "ServicePack установленный на этом компьютере "  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colOperatingSystems = objClass.Instances_

' Перебираем элементы коллекции 
For Each objOperatingSystem in colOperatingSystems
  ' Формируем строку для вывода на экран
  strResult = strResult  "№ "  _ 
              objOperatingSystem.ServicePackMajorVersion  "." _
              objOperatingSystem.ServicePackMinorVersion  VbCrLf  
Next

' Выводим результирущую строку на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Сбор сведений о подключенных устройствах

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

Получение информации о физической памяти

Получить информацию о банках физической памяти компьютера позволяют экземпляры класса Win32_PhysicalMemory. Сценарий MemoryInfo.vbs (листинг 13.8) выводит на экран наиболее важные свойства этих экземпляров.

'*******************************************************************
' Имя: MemoryInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о физической памяти
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colPhysMemory     ' Коллекция экземпляров класса WMI
Dim objPhysMemory     ' Элемент коллекции
Dim strResult         ' Результирующая строка

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_PhysicalMemory"
strResult = "Информация о физической памяти:"  vbCrLf  vbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_PhysicalMemory
Set colPhysMemory = objClass.Instances_

' Перебираем коллекцию
For Each objPhysMemory In colPhysMemory
  strResult = strResult  "Bank Label: "  _
              objPhysMemory.BankLabel  VbCrLf
  strResult = strResult  "Capacity: "  _
              objPhysMemory.Capacity  VbCrLf
  strResult = strResult  "Data Width: "  _
              objPhysMemory.DataWidth  VbCrLf
  strResult = strResult  "Description: "  _
              objPhysMemory.Description  VbCrLf
  strResult = strResult  "Device Locator: "  _
              objPhysMemory.DeviceLocator  VbCrLf
  strResult = strResult  "Form Factor: "  _
              objPhysMemory.FormFactor  VbCrLf
  strResult = strResult  "Hot Swappable: "  _
              objPhysMemory.HotSwappable  VbCrLf
  strResult = strResult  "Manufacturer: "  _
              objPhysMemory.Manufacturer  VbCrLf
  strResult = strResult  "Memory Type: "  _
              objPhysMemory.MemoryType  VbCrLf
  strResult = strResult  "Name: "  _
              objPhysMemory.Name  VbCrLf
  strResult = strResult  "Part Number: "  _
              objPhysMemory.PartNumber  VbCrLf
  strResult = strResult  "Speed: "  _
              objPhysMemory.Speed  VbCrLf
  strResult = strResult  "Tag: "  _
              objPhysMemory.Tag  VbCrLf
  strResult = strResult  "Type Detail: "  _
              objPhysMemory.TypeDetail  VbCrLf
Next

' Выводим результат на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Получение информации о сетевом адаптере

В сценарии NetworkAdapterInfo.vbs (листинг 13.9) свойства сетевых адаптеров извлекаются с помощью класса Win32_NetworkAdapter. Отметим, что с помощью сценариев WMI можно также изменять конфигурацию сетевых карт — для этого следует использовать класс Win32_NetworkAdapterConfiguration, который предоставляет множество методов для настройки сетевых служб DNS, DHCP, WINS.

'*******************************************************************
' Имя: NetworkAdapterInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о сетевых адаптерах
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer         ' Имя компьютера
Dim strNamespace        ' Имя пространства имен
Dim objService          ' Объект SWbemServices    
Dim colNetworkAdapters  ' Коллекция экземпляров класса WMI
Dim objNetworkAdapter   ' Элемент коллекции
Dim strResult           ' Результирующая строка
Dim WshShell            ' Объект WshShell
Dim theNotepad          ' Объект WshScriptExec

' Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2

' Процедура для записи информации в файл 
Sub TextOut (Text, File)
  ' Объявляем переменные
  Dim  objFSO, FOut 
  ' Создаем объект FileSystemObject
  Set  objFSO=WScript.CreateObject("Scripting.FileSystemObject")
  ' Открываем выходной файл для записи
  Set  FOut = objFSO.OpenTextFile (File,ForWriting,true)
  ' Записываем текстовую строку в файл
  FOut.WriteLine Text
  ' Закрываем выходной файл
  FOut.Close
End Sub

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Зарегистрированные сетевые адаптеры "  VbCrLf  VbCrLf

' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)

Set colNetworkAdapters = objService.ExecQuery(_
                         "SELECT * FROM Win32_NetworkAdapter",,_
                         wbemFlagReturnImmediately+wbemFlagForwardOnly)

' Перебираем элементы коллекции 
For Each objNetworkAdapter In colNetworkAdapters
  strResult = strResult  "Adapter Type: "  _
    objNetworkAdapter.AdapterType  VbCrLf _
    "Description: "  objNetworkAdapter.Description  vbCrLf _
    "Installed: "  objNetworkAdapter.Installed  vbCrLf _
    "Manufacturer: "  objNetworkAdapter.Manufacturer  vbCrLf _
    "Product Name: "  objNetworkAdapter.ProductName  vbCrLf _
    "Net Connection ID: "  objNetworkAdapter.NetConnectionID  vbCrLf _
    "Net Connection Status: "  _
      objNetworkAdapter.NetConnectionStatus  vbCrLf  _
    "MAC Address: "  objNetworkAdapter.MACAddress  vbCrLf _  
    "PNP Device ID"  objNetworkAdapter.PNPDeviceID
Next

' Выводим результат в текстовый файл
TextOut  strResult, "C:\NetworkAdapters.txt" 

'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad "  "C:\NetworkAdapters.txt" )
'************************* Конец ***********************************

Управление службами и процессами

В листингах 13.1013.14 приведены сценарии, с помощью которых можно управлять процессами и службами Windows. Подобные сценарии особенно удобно применять для выполнения групповых операций, например, при необходимости запустить все приостановленные службы или завершить все процессы с определенным именем.

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

Сценарий ServicesInfo.vbs, приведенный в листинге 13.10, выводит информацию о зарегистрированных службах (экземпляры класса Win32_Service ) в текстовый файл C:\Services.txt, который затем открывается с помощью Блокнота.

'*******************************************************************
' Имя: ServicesInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о службах 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objWMIService     ' Объект SWbemServices    
Dim colServices       ' Коллекция экземпляров класса WMI
Dim objService        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim theNotepad        ' Объект WshScriptExec

' Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2

' Функция для записи информации в файл 
Sub TextOut (Text, File)
  ' Объявляем переменные
  Dim  objFSO, FOut 
  ' Создаем объект FileSystemObject
  Set  objFSO=WScript.CreateObject("Scripting.FileSystemObject")
  ' Открываем выходной файл для записи
  Set  FOut = objFSO.OpenTextFile (File,ForWriting,true)
  ' Записываем текстовую строку в файл
  FOut.WriteLine Text
  ' Закрываем выходной файл
  FOut.Close
End Sub

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Информация о службах "  VbCrLf  VbCrLf

' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)

Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service"_
                  ,, wbemFlagReturnImmediately+wbemFlagForwardOnly)
For Each objService In colServices
  strResult = strResult  "Name: "  _
              objService.Name  VbCrLf
  strResult = strResult  "Display Name: "  _
              objService.DisplayName  VbCrLf
  strResult = strResult  "Caption: "  _
              objService.Caption  VbCrLf
  strResult = strResult  "Description: "  _
              objService.Description  VbCrLf
  strResult = strResult  "Path Name: "  _
              objService.PathName  VbCrLf
  strResult = strResult  "ServiceType: "  _
              objService.ServiceType  VbCrLf
  strResult = strResult  "Status: "  _
              objService.Status  VbCrLf
  strResult = strResult  "State: "  _
              objService.State  VbCrLf
  strResult = strResult  "Started: "  _
              objService.Started  VbCrLf
  strResult = strResult  "Start Mode: "  _
              objService.StartMode  VbCrLf
  strResult = strResult  "Start Name: "  _
              objService.StartName  VbCrLf
  strResult = strResult  "Accept pause: "  _
              objService.AcceptPause  VbCrLf
  strResult = strResult  "Accept stop: "  _
              objService.AcceptStop  VbCrLf
  strResult = strResult  "********************************"  VbCrLf _
              VbCrLf
Next

' Выводим результат в текстовый файл
TextOut  strResult, "C:\Services.txt" 

'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad "  "C:\Services.txt" )
'************************* Конец ***********************************

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

В сценарии StartStoppedServices.vbs, описанном в листинге 13.11, производится запуск всех остановленных служб (с состоянием Stopped), которые должны стартовать автоматически при запуске системы.

'*******************************************************************
' Имя: StartStoppedServices.vbs
' Язык: VBScript
' Описание: Запуск остановленных служб 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objWMIService     ' Объект SWbemServices    
Dim colServices       ' Коллекция экземпляров класса WMI
Dim objService        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim Res               

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"

' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)
' Формируем коллекцию остановленных служб 
Set colServices = objWMIService.ExecQuery _
("SELECT * FROM Win32_Service WHERE State = 'Stopped' and StartMode = " _
  "'Auto'")

' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

' Запрос на запуск служб
Res = WshShell.Popup("Запустить все остановленные службы?",0, _
  "Работа со службами Windows",vbQuestion+vbYesNo)
If Res=vbYes Then
  ' Запускаем каждую остановленную службу         
  For Each objService In colServices
    objService.StartService()
  Next
  WScript.Echo "Все остановленные службы запущены"
End If  
'************************* Конец ***********************************

Сценарий ResumePausedServices.vbs, приведенный в листинге 13.12, восстанавливает работу всех приостановленных служб (с состоянием Paused), которые должны стартовать автоматически при запуске системы.

'*******************************************************************
' Имя: ResumePausedServices.vbs
' Язык: VBScript
' Описание: Продолжение работы приостановленных служб 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objWMIService     ' Объект SWbemServices    
Dim colServices       ' Коллекция экземпляров класса WMI
Dim objService        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim Res               

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"

' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)
' Формируем коллекцию остановленных служб 
Set colServices = objWMIService.ExecQuery _
("SELECT * FROM Win32_Service WHERE State = 'Paused' and StartMode = " _
  "'Auto'")

' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

' Запрос на запуск служб
Res = WshShell.Popup("Возобновить работу всех приостановленных служб?"_
  ,0, "Работа со службами Windows",vbQuestion+vbYesNo)
If Res=vbYes Then
  ' Возобновляем каждую приостановленную службу         
  For Each objService In colServices
    objService.ResumeService()
  Next
  WScript.Echo "Работа всех приостановленных служб возобновлена"
End If  
'************************* Конец ***********************************

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

В сценарии KillProcess.vbs, описанном в листинге 13.13, на примере Блокнота (Notepad.exe) показано, каким образом можно принудительно завершить работу запущенных процессов (для этого используется метод Terminate соответствующего объекта Win32_Process ).

'*******************************************************************
' Имя: KillProcess.vbs
' Язык: VBScript
' Описание: Завершение запущенного процесса
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objService        ' Объект SWbemServices    
Dim colProcesses      ' Коллекция экземпляров класса WMI
Dim objProcess        ' Элемент коллекции
Dim WshShell          ' Объект WshShell
Dim Res

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"

' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

' Формируем коллекцию процессов NOTEPAD.EXE
Set colProcesses = objService.ExecQuery(_
           "SELECT * FROM Win32_Process WHERE Name='NOTEPAD.EXE'")

'Запрос на завершение работы всех Блокнотов
Res=WshShell.Popup("Завершить работу всех Блокнотов?",0,_
  "Работа с процессами",vbQuestion+vbYesNo)
' Проверяем введенное значение
If Res=vbYes Then
  'Перебираем коллекцию
  For Each objProcess in colProcesses
    ' Завершаем приложение
    objProcess.Terminate()
  Next
End If
'************************* Конец ***********************************

Получение информации о процессах

Сценарий ProcessInfo.vbs, приведенный в листинге 13.14, для всех запущенных процессов (экземпляры класса Win32_Process ) выводит в текстовый файл C:\Process.txt значения некоторых наиболее важных с точки зрения администратора параметров. Сформированный файл затем открывается с помощью Блокнота.

'*******************************************************************
' Имя: ProcessInfo.vbs
' Язык: VBScript
' Описание: Вывод свойств запущенных процессов 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objService        ' Объект SWbemServices    
Dim colProcesses      ' Коллекция экземпляров класса WMI
Dim objProcess        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim theNotepad        ' Объект WshScriptExec

' Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2

' Функция для записи информации в файл 
Sub TextOut (Text, File)
  ' Объявляем переменные
  Dim  objFSO, FOut 
  ' Создаем объект FileSystemObject
  Set  objFSO=WScript.CreateObject("Scripting.FileSystemObject")
  ' Открываем выходной файл для записи
  Set  FOut = objFSO.OpenTextFile (File,ForWriting,true)
  ' Записываем текстовую строку в файл
  FOut.WriteLine Text
  ' Закрываем выходной файл
  FOut.Close
End Sub

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Сведения о запущенных процессах "  VbCrLf  VbCrLf

' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)

Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process",,_
                     wbemFlagReturnImmediately+wbemFlagForwardOnly)
For Each objProcess In colProcesses
  strResult = strResult  "Name: "  objProcess.Name  VbCrLf _
  "Description: "  objProcess.Description  VbCrLf _
  "Handle: "  objProcess.Handle  VbCrLf _
  "Parent Process Id: "  objProcess.ParentProcessId  VbCrLf _
  "Command Line: "  objProcess.CommandLine  VbCrLf _
  "Creation Date: "  objProcess.CreationDate  VbCrLf _
  "Executable Path: "  objProcess.ExecutablePath  VbCrLf _
  "Priority: "  objProcess.Priority  VbCrLf _
  "Maximum WorkingSet Size: "  objProcess.MaximumWorkingSetSize  VbCrLf _
  "Minimum WorkingSet Size: "  objProcess.MinimumWorkingSetSize  VbCrLf _
  "Page File Usage: "  objProcess.PageFileUsage  VbCrLf _
  "Peak Virtual Size: "  objProcess.PeakVirtualSize  VbCrLf _
  "Peak WorkingSet Size: "  objProcess.PeakWorkingSetSize  VbCrLf _
  "********************************"  VbCrLf  VbCrLf
Next

' Выводим результат в текстовый файл
TextOut  strResult, "C:\Process.txt" 

'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad "  "C:\Process.txt" )
'************************* Конец ***********************************
Страницы:

Типичные администраторские сценарии WMI

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

Управление компьютером

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

Завершение сеанса пользователя

Для завершения сеанса активного пользователя необходимо вызвать метод Win32Shutdown объекта Win32_OperatingSystem (листинг 13.1).

'*******************************************************************
' Имя: LogOff.vbs
' Язык: VBScript
' Описание: Завершение сеанса пользователя  
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objInstance       ' Элемент коллекции

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"

' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objInstance In colInstances
  ' Выводим на экран предупреждение
  WScript.Echo "На компьютере "   objInstance.CSNAME  VbCrLf _
               "сеанс текущего пользователя будет завершен "  
  ' Для каждого экземпляра вызываем метод Win32Shutdown
  objInstance.Win32Shutdown(0)      
Next
'************************* Конец ***********************************

Перезагрузка компьютера

Для перезагрузки компьютера необходимо использовать метод Reboot объекта Win32_OperatingSystem (листинг 13.2). При этом при подключении к подсистеме WMI необходимо указать дополнительные привилегии Shutdown (для перезагрузки локального компьютера) и RemoteShutdown (для перезагрузки удаленного компьютера).

'*******************************************************************
' Имя: Reboot.vbs
' Язык: VBScript
' Описание: Перезагрузка компьютера
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objInstance       ' Элемент коллекции

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"

' Получаем указатель на класс WMI
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}!\\" _ 
               strComputer  "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objInstance In colInstances
  ' Выводим на экран предупреждение
  WScript.Echo "Компьютер "   objInstance.CSNAME _
               " будет перезагружен "  
  ' Для каждого экземпляра вызываем метод Reboot
  objInstance.Reboot()
Next
'************************* Конец ***********************************

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

В сценарии Shutdown.vbs (листинг 13.3) кроме непосредственного выключения компьютера (метод Shutdown объекта Win32_OperatingSystem ) с помощью средств языка VBScript реализована обработка возможных ошибок.

'*******************************************************************
' Имя: Shutdown.vbs
' Язык: VBScript
' Описание: Выключение компьютера
'*******************************************************************
Option Explicit
On Error Resume Next
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objInstance       ' Элемент коллекции
Dim iAnswer           ' Код возврата функции MsgBox

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:{(Shutdown,RemoteShutdown)}!\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objInstance In colInstances
  ' Выводим на экран предупреждение
  iAnswer = MsgBox("Выключить компьютер "  objInstance.CSNAME  " ?", _
                  vbQuestion + vbOKCancel, "Внимание!")

  If iAnswer = vbOK Then 
    ' Выводим сообщение о перезагрузке
    WScript.Echo "Компьютер "   objInstance.CSNAME  " будет выключен"  
    ' Вызываем метод Shutdown
    objInstance.Shutdown()

    If Err.number <> 0 Then
      WScript.Echo  "Номер ошибки: "  Err.Number  vbNewLine  _
                    "Описание: "  Err.Description
    End If
  Else 
    ' Выводим сообщение об отмене операции
    WScript.Echo  "Не будем пока выключать"
  End if
Next
'************************* Конец ***********************************

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

Листинги 13.4–13.7 содержат сценарии, позволяющие получить информацию об операционной системе (серийный номер, номер сборки, номер последнего обновления, дата установки, кодовая страница, список команд, которые выполняются автоматически при старте системы, и т. д.) и о BIOS компьютера (производитель, серийный номер, номер сборки и т. д.).

Вывод информации о BIOS

В сценарии BIOSInfo.vbs (листинг 13.4) на экран выводятся некоторые свойства объекта Win32_BIOS, в котором хранятся параметры и характеристики BIOS, установленной на компьютере.

'*******************************************************************
' Имя: BIOSInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о BIOS
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colInstances      ' Коллекция экземпляров класса WMI
Dim objBIOS           ' Элемент коллекции
Dim strResult         ' Результирующая строка

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_BIOS"
strResult = "Информация о BIOS :"  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("winmgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_BIOS
Set colInstances = objClass.Instances_

' Перебираем элементы коллекции 
For Each objBIOS in colInstances
  strResult = strResult  "Name: "  objBIOS.Name  VbCrLf
  strResult = strResult  "Manufacturer: "  objBIOS.Manufacturer _
     VbCrLf
  strResult = strResult  "Caption: "  objBIOS.Caption  VbCrLf
  strResult = strResult  "Description: "  objBIOS.Description  VbCrLf    
  strResult = strResult  "Build Number: "  objBIOS.BuildNumber  VbCrLf
  strResult = strResult  "Current Language: "  objBIOS.CurrentLanguage  VbCrLf
  strResult = strResult  _
   "Installable Languages: "  objBIOS.InstallableLanguages  VbCrLf
  strResult = strResult  "Primary BIOS: "  objBIOS.PrimaryBIOS  VbCrLf
  strResult = strResult  "Release Date: "  objBIOS.ReleaseDate  VbCrLf
  strResult = strResult  "Serial Number: "  objBIOS.SerialNumber  VbCrLf
  strResult = strResult  "SMBIOS Version: "  _
    objBIOS.SMBIOSBIOSVersion  VbCrLf
  strResult = strResult  _
    "SMBIOS Major Version: "  objBIOS.SMBIOSMajorVersion  VbCrLf
  strResult = strResult  _
    "SMBIOS Minor Version: "  objBIOS.SMBIOSMinorVersion  VbCrLf
  strResult = strResult  "SMBIOS Present: "  objBIOS.SMBIOSPresent _
     VbCrLf
  strResult = strResult  "Status: "  objBIOS.Status  VbCrLf
  strResult = strResult  "Version: "  objBIOS.Version  VbCrLf
Next

'Выводим строку на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Вывод списка команд, выполняемых при загрузке системы

Все команды, которые выполняются автоматически при старте системы, хранятся в WMI в виде экземпляров класса Win32_StartupCommand. Сценарий StartupCommand.vbs, представленный в листинге 13.5, выводит эти команды на экран.

'*******************************************************************
' Имя: StartupCommand.vbs
' Язык: VBScript
' Описание: Вывод списка команд, выполняемых при загрузке компьютера
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colStartupCommands' Коллекция экземпляров класса WMI
Dim objStartupCommand ' Элемент коллекции
Dim strResult         ' Строка для вывода на экран

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_StartupCommand"
strResult = "Комманды выполняемые при загрузке компьютера :"  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_StartupCommand
Set colStartupCommands = objClass.Instances_

' Перебираем элементы коллекции 
For Each objStartupCommand in colStartupCommands
  strResult = strResult  objStartupCommand.Command  VbCrLf  
Next

' Выводим результат на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Вывод свойств операционной системы

Основные свойства установленной операционной системы (загрузочное устройство, номер сборки, дата установки и т. д.) можно получить с помощью объекта Win32_OperatingSystem (листинг 13.6).

'*******************************************************************
' Имя: OSProperty.vbs
' Язык: VBScript
' Описание: Вывод свойств операционной системы
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer        ' Имя компьютера
Dim strNamespace       ' Имя пространства имен
Dim strClass           ' Имя класса 
Dim objClass           ' Объект SWbemObject (класс WMI)
Dim colOperatingSystems' Коллекция экземпляров класса WMI
Dim objOperatingSystem ' Элемент коллекции
Dim strResult          ' Строка для вывода на экран

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
strResult = " Свойства операционной системы: "  VbCrLf  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colOperatingSystems = objClass.Instances_

' Перебираем элементы коллекции 
For Each objOperatingSystem in colOperatingSystems
  ' Формирум строку для вывода на экран 
  strResult = strResult  "Boot Device: "  _ 
              objOperatingSystem.BootDevice  VbCrLf
  strResult = strResult  "Build Number: "  _
              objOperatingSystem.BuildNumber  VbCrLf 
  strResult = strResult  "Build Type: "  _
              objOperatingSystem.BuildType  VbCrLf
  strResult = strResult  "Caption: "  _
              objOperatingSystem.Caption  VbCrLf
  strResult = strResult  "Code Set: "  _
              objOperatingSystem.CodeSet  VbCrLf
  strResult = strResult  "Country Code: "  _
              objOperatingSystem.CountryCode  VbCrLf
  strResult = strResult  "Install Date: "  _
              objOperatingSystem.InstallDate  VbCrLf
  strResult = strResult  "Licensed Users: "  _
              objOperatingSystem.NumberOfLicensedUsers  VbCrLf
  strResult = strResult  "Organization: "  _
              objOperatingSystem.Organization  VbCrLf
  strResult = strResult  "OS Language: "  _
              objOperatingSystem.OSLanguage  VbCrLf
  strResult = strResult  "OS Product Suite: "  _
              objOperatingSystem.OSProductSuite  VbCrLf
  strResult = strResult  "OS Type: "  _
              objOperatingSystem.OSType  VbCrLf
  strResult = strResult  "Primary: "  _
              objOperatingSystem.Primary  VbCrLf
  strResult = strResult  "Registered User: "  _
              objOperatingSystem.RegisteredUser  VbCrLf
  strResult = strResult  "Serial Number: "  _
              objOperatingSystem.SerialNumber  VbCrLf
  strResult = strResult  "Version: "  _
              objOperatingSystem.Version  VbCrLf
Next

' Выводим результат на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Определение номера последнего обновления, установленного на компьютере

Сценарий ServPack.vbs, приведенный в листинге 13.7, выводит на экран номер последнего обновления (ServicePack), которое было установлено на компьютере (свойства ServicePackMajorVersion и ServicePackMinorVersion объекта Win32_OperatingSystem ).

'*******************************************************************
' Имя: ServPack.vbs
' Язык: VBScript
' Описание: Вывод номера ServicePack для операционной системы
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer         ' Имя компьютера
Dim strNamespace        ' Имя пространства имен
Dim strClass            ' Имя класса 
Dim objClass            ' Объект SWbemObject (класс WMI)
Dim colOperatingSystems ' Коллекция экземпляров класса WMI
Dim objOperatingSystem  ' Элемент коллекции
Dim strResult           ' Строка для вывода на экран

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"
strResult = "ServicePack установленный на этом компьютере "  VbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_OperatingSystem
Set colOperatingSystems = objClass.Instances_

' Перебираем элементы коллекции 
For Each objOperatingSystem in colOperatingSystems
  ' Формируем строку для вывода на экран
  strResult = strResult  "№ "  _ 
              objOperatingSystem.ServicePackMajorVersion  "." _
              objOperatingSystem.ServicePackMinorVersion  VbCrLf  
Next

' Выводим результирущую строку на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Сбор сведений о подключенных устройствах

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

Получение информации о физической памяти

Получить информацию о банках физической памяти компьютера позволяют экземпляры класса Win32_PhysicalMemory. Сценарий MemoryInfo.vbs (листинг 13.8) выводит на экран наиболее важные свойства этих экземпляров.

'*******************************************************************
' Имя: MemoryInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о физической памяти
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim strClass          ' Имя класса 
Dim objClass          ' Объект SWbemObject (класс WMI)
Dim colPhysMemory     ' Коллекция экземпляров класса WMI
Dim objPhysMemory     ' Элемент коллекции
Dim strResult         ' Результирующая строка

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_PhysicalMemory"
strResult = "Информация о физической памяти:"  vbCrLf  vbCrLf

' Получаем указатель на класс WMI 
Set objClass = GetObject("WinMgmts:\\"  strComputer  _
                         "\"  strNamespace  ":"  strClass)
' Создаем коллекцию экземпляров класса Win32_PhysicalMemory
Set colPhysMemory = objClass.Instances_

' Перебираем коллекцию
For Each objPhysMemory In colPhysMemory
  strResult = strResult  "Bank Label: "  _
              objPhysMemory.BankLabel  VbCrLf
  strResult = strResult  "Capacity: "  _
              objPhysMemory.Capacity  VbCrLf
  strResult = strResult  "Data Width: "  _
              objPhysMemory.DataWidth  VbCrLf
  strResult = strResult  "Description: "  _
              objPhysMemory.Description  VbCrLf
  strResult = strResult  "Device Locator: "  _
              objPhysMemory.DeviceLocator  VbCrLf
  strResult = strResult  "Form Factor: "  _
              objPhysMemory.FormFactor  VbCrLf
  strResult = strResult  "Hot Swappable: "  _
              objPhysMemory.HotSwappable  VbCrLf
  strResult = strResult  "Manufacturer: "  _
              objPhysMemory.Manufacturer  VbCrLf
  strResult = strResult  "Memory Type: "  _
              objPhysMemory.MemoryType  VbCrLf
  strResult = strResult  "Name: "  _
              objPhysMemory.Name  VbCrLf
  strResult = strResult  "Part Number: "  _
              objPhysMemory.PartNumber  VbCrLf
  strResult = strResult  "Speed: "  _
              objPhysMemory.Speed  VbCrLf
  strResult = strResult  "Tag: "  _
              objPhysMemory.Tag  VbCrLf
  strResult = strResult  "Type Detail: "  _
              objPhysMemory.TypeDetail  VbCrLf
Next

' Выводим результат на экран
Wscript.Echo strResult
'************************* Конец ***********************************

Получение информации о сетевом адаптере

В сценарии NetworkAdapterInfo.vbs (листинг 13.9) свойства сетевых адаптеров извлекаются с помощью класса Win32_NetworkAdapter. Отметим, что с помощью сценариев WMI можно также изменять конфигурацию сетевых карт — для этого следует использовать класс Win32_NetworkAdapterConfiguration, который предоставляет множество методов для настройки сетевых служб DNS, DHCP, WINS.

'*******************************************************************
' Имя: NetworkAdapterInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о сетевых адаптерах
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer         ' Имя компьютера
Dim strNamespace        ' Имя пространства имен
Dim objService          ' Объект SWbemServices    
Dim colNetworkAdapters  ' Коллекция экземпляров класса WMI
Dim objNetworkAdapter   ' Элемент коллекции
Dim strResult           ' Результирующая строка
Dim WshShell            ' Объект WshShell
Dim theNotepad          ' Объект WshScriptExec

' Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2

' Процедура для записи информации в файл 
Sub TextOut (Text, File)
  ' Объявляем переменные
  Dim  objFSO, FOut 
  ' Создаем объект FileSystemObject
  Set  objFSO=WScript.CreateObject("Scripting.FileSystemObject")
  ' Открываем выходной файл для записи
  Set  FOut = objFSO.OpenTextFile (File,ForWriting,true)
  ' Записываем текстовую строку в файл
  FOut.WriteLine Text
  ' Закрываем выходной файл
  FOut.Close
End Sub

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Зарегистрированные сетевые адаптеры "  VbCrLf  VbCrLf

' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)

Set colNetworkAdapters = objService.ExecQuery(_
                         "SELECT * FROM Win32_NetworkAdapter",,_
                         wbemFlagReturnImmediately+wbemFlagForwardOnly)

' Перебираем элементы коллекции 
For Each objNetworkAdapter In colNetworkAdapters
  strResult = strResult  "Adapter Type: "  _
    objNetworkAdapter.AdapterType  VbCrLf _
    "Description: "  objNetworkAdapter.Description  vbCrLf _
    "Installed: "  objNetworkAdapter.Installed  vbCrLf _
    "Manufacturer: "  objNetworkAdapter.Manufacturer  vbCrLf _
    "Product Name: "  objNetworkAdapter.ProductName  vbCrLf _
    "Net Connection ID: "  objNetworkAdapter.NetConnectionID  vbCrLf _
    "Net Connection Status: "  _
      objNetworkAdapter.NetConnectionStatus  vbCrLf  _
    "MAC Address: "  objNetworkAdapter.MACAddress  vbCrLf _  
    "PNP Device ID"  objNetworkAdapter.PNPDeviceID
Next

' Выводим результат в текстовый файл
TextOut  strResult, "C:\NetworkAdapters.txt" 

'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad "  "C:\NetworkAdapters.txt" )
'************************* Конец ***********************************

Управление службами и процессами

В листингах 13.1013.14 приведены сценарии, с помощью которых можно управлять процессами и службами Windows. Подобные сценарии особенно удобно применять для выполнения групповых операций, например, при необходимости запустить все приостановленные службы или завершить все процессы с определенным именем.

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

Сценарий ServicesInfo.vbs, приведенный в листинге 13.10, выводит информацию о зарегистрированных службах (экземпляры класса Win32_Service ) в текстовый файл C:\Services.txt, который затем открывается с помощью Блокнота.

'*******************************************************************
' Имя: ServicesInfo.vbs
' Язык: VBScript
' Описание: Вывод информации о службах 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objWMIService     ' Объект SWbemServices    
Dim colServices       ' Коллекция экземпляров класса WMI
Dim objService        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim theNotepad        ' Объект WshScriptExec

' Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2

' Функция для записи информации в файл 
Sub TextOut (Text, File)
  ' Объявляем переменные
  Dim  objFSO, FOut 
  ' Создаем объект FileSystemObject
  Set  objFSO=WScript.CreateObject("Scripting.FileSystemObject")
  ' Открываем выходной файл для записи
  Set  FOut = objFSO.OpenTextFile (File,ForWriting,true)
  ' Записываем текстовую строку в файл
  FOut.WriteLine Text
  ' Закрываем выходной файл
  FOut.Close
End Sub

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Информация о службах "  VbCrLf  VbCrLf

' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)

Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service"_
                  ,, wbemFlagReturnImmediately+wbemFlagForwardOnly)
For Each objService In colServices
  strResult = strResult  "Name: "  _
              objService.Name  VbCrLf
  strResult = strResult  "Display Name: "  _
              objService.DisplayName  VbCrLf
  strResult = strResult  "Caption: "  _
              objService.Caption  VbCrLf
  strResult = strResult  "Description: "  _
              objService.Description  VbCrLf
  strResult = strResult  "Path Name: "  _
              objService.PathName  VbCrLf
  strResult = strResult  "ServiceType: "  _
              objService.ServiceType  VbCrLf
  strResult = strResult  "Status: "  _
              objService.Status  VbCrLf
  strResult = strResult  "State: "  _
              objService.State  VbCrLf
  strResult = strResult  "Started: "  _
              objService.Started  VbCrLf
  strResult = strResult  "Start Mode: "  _
              objService.StartMode  VbCrLf
  strResult = strResult  "Start Name: "  _
              objService.StartName  VbCrLf
  strResult = strResult  "Accept pause: "  _
              objService.AcceptPause  VbCrLf
  strResult = strResult  "Accept stop: "  _
              objService.AcceptStop  VbCrLf
  strResult = strResult  "********************************"  VbCrLf _
              VbCrLf
Next

' Выводим результат в текстовый файл
TextOut  strResult, "C:\Services.txt" 

'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad "  "C:\Services.txt" )
'************************* Конец ***********************************

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

В сценарии StartStoppedServices.vbs, описанном в листинге 13.11, производится запуск всех остановленных служб (с состоянием Stopped), которые должны стартовать автоматически при запуске системы.

'*******************************************************************
' Имя: StartStoppedServices.vbs
' Язык: VBScript
' Описание: Запуск остановленных служб 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objWMIService     ' Объект SWbemServices    
Dim colServices       ' Коллекция экземпляров класса WMI
Dim objService        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim Res               

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"

' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)
' Формируем коллекцию остановленных служб 
Set colServices = objWMIService.ExecQuery _
("SELECT * FROM Win32_Service WHERE State = 'Stopped' and StartMode = " _
  "'Auto'")

' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

' Запрос на запуск служб
Res = WshShell.Popup("Запустить все остановленные службы?",0, _
  "Работа со службами Windows",vbQuestion+vbYesNo)
If Res=vbYes Then
  ' Запускаем каждую остановленную службу         
  For Each objService In colServices
    objService.StartService()
  Next
  WScript.Echo "Все остановленные службы запущены"
End If  
'************************* Конец ***********************************

Сценарий ResumePausedServices.vbs, приведенный в листинге 13.12, восстанавливает работу всех приостановленных служб (с состоянием Paused), которые должны стартовать автоматически при запуске системы.

'*******************************************************************
' Имя: ResumePausedServices.vbs
' Язык: VBScript
' Описание: Продолжение работы приостановленных служб 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objWMIService     ' Объект SWbemServices    
Dim colServices       ' Коллекция экземпляров класса WMI
Dim objService        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim Res               

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"

' Подключаемся к пространству имен WMI
Set objWMIService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)
' Формируем коллекцию остановленных служб 
Set colServices = objWMIService.ExecQuery _
("SELECT * FROM Win32_Service WHERE State = 'Paused' and StartMode = " _
  "'Auto'")

' Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

' Запрос на запуск служб
Res = WshShell.Popup("Возобновить работу всех приостановленных служб?"_
  ,0, "Работа со службами Windows",vbQuestion+vbYesNo)
If Res=vbYes Then
  ' Возобновляем каждую приостановленную службу         
  For Each objService In colServices
    objService.ResumeService()
  Next
  WScript.Echo "Работа всех приостановленных служб возобновлена"
End If  
'************************* Конец ***********************************

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

В сценарии KillProcess.vbs, описанном в листинге 13.13, на примере Блокнота (Notepad.exe) показано, каким образом можно принудительно завершить работу запущенных процессов (для этого используется метод Terminate соответствующего объекта Win32_Process ).

'*******************************************************************
' Имя: KillProcess.vbs
' Язык: VBScript
' Описание: Завершение запущенного процесса
'*******************************************************************
Option Explicit
 
' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objService        ' Объект SWbemServices    
Dim colProcesses      ' Коллекция экземпляров класса WMI
Dim objProcess        ' Элемент коллекции
Dim WshShell          ' Объект WshShell
Dim Res

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"

' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)
'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

' Формируем коллекцию процессов NOTEPAD.EXE
Set colProcesses = objService.ExecQuery(_
           "SELECT * FROM Win32_Process WHERE Name='NOTEPAD.EXE'")

'Запрос на завершение работы всех Блокнотов
Res=WshShell.Popup("Завершить работу всех Блокнотов?",0,_
  "Работа с процессами",vbQuestion+vbYesNo)
' Проверяем введенное значение
If Res=vbYes Then
  'Перебираем коллекцию
  For Each objProcess in colProcesses
    ' Завершаем приложение
    objProcess.Terminate()
  Next
End If
'************************* Конец ***********************************

Получение информации о процессах

Сценарий ProcessInfo.vbs, приведенный в листинге 13.14, для всех запущенных процессов (экземпляры класса Win32_Process ) выводит в текстовый файл C:\Process.txt значения некоторых наиболее важных с точки зрения администратора параметров. Сформированный файл затем открывается с помощью Блокнота.

'*******************************************************************
' Имя: ProcessInfo.vbs
' Язык: VBScript
' Описание: Вывод свойств запущенных процессов 
'*******************************************************************
Option Explicit

' Объявляем переменные
Dim strComputer       ' Имя компьютера
Dim strNamespace      ' Имя пространства имен
Dim objService        ' Объект SWbemServices    
Dim colProcesses      ' Коллекция экземпляров класса WMI
Dim objProcess        ' Элемент коллекции
Dim strResult         ' Результирующая строка
Dim WshShell          ' Объект WshShell
Dim theNotepad        ' Объект WshScriptExec

' Объявляем константы
Const wbemFlagForwardOnly = 32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2

' Функция для записи информации в файл 
Sub TextOut (Text, File)
  ' Объявляем переменные
  Dim  objFSO, FOut 
  ' Создаем объект FileSystemObject
  Set  objFSO=WScript.CreateObject("Scripting.FileSystemObject")
  ' Открываем выходной файл для записи
  Set  FOut = objFSO.OpenTextFile (File,ForWriting,true)
  ' Записываем текстовую строку в файл
  FOut.WriteLine Text
  ' Закрываем выходной файл
  FOut.Close
End Sub

'********************** Начало *************************************
' Присваиваем начальные значения переменным
strComputer = "."
strNamespace = "Root\CIMV2"
strResult = "Сведения о запущенных процессах "  VbCrLf  VbCrLf

' Подключаемся к пространству имен WMI
Set objService = GetObject("WinMgmts:\\"  _
                                   strComputer  "\"  strNamespace)

Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process",,_
                     wbemFlagReturnImmediately+wbemFlagForwardOnly)
For Each objProcess In colProcesses
  strResult = strResult  "Name: "  objProcess.Name  VbCrLf _
  "Description: "  objProcess.Description  VbCrLf _
  "Handle: "  objProcess.Handle  VbCrLf _
  "Parent Process Id: "  objProcess.ParentProcessId  VbCrLf _
  "Command Line: "  objProcess.CommandLine  VbCrLf _
  "Creation Date: "  objProcess.CreationDate  VbCrLf _
  "Executable Path: "  objProcess.ExecutablePath  VbCrLf _
  "Priority: "  objProcess.Priority  VbCrLf _
  "Maximum WorkingSet Size: "  objProcess.MaximumWorkingSetSize  VbCrLf _
  "Minimum WorkingSet Size: "  objProcess.MinimumWorkingSetSize  VbCrLf _
  "Page File Usage: "  objProcess.PageFileUsage  VbCrLf _
  "Peak Virtual Size: "  objProcess.PeakVirtualSize  VbCrLf _
  "Peak WorkingSet Size: "  objProcess.PeakWorkingSetSize  VbCrLf _
  "********************************"  VbCrLf  VbCrLf
Next

' Выводим результат в текстовый файл
TextOut  strResult, "C:\Process.txt" 

'Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
'Открываем созданный файл в Блокноте
Set theNotepad = WshShell.Exec("notepad "  "C:\Process.txt" )
'************************* Конец ***********************************
Вернуться к учебному плану