Мордовский государственный университет имени Н.П. Огарева
Опубликован: 12.01.2008 | Доступ: свободный | Студентов: 8763 / 1455 | Оценка: 4.48 / 4.12 | Длительность: 18:38:00
Лекция 13:

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

< Лекция 12 || Лекция 13: 12 || Лекция 14 >
Аннотация: Разбираются примеры сценариев WMI, связанных с повседневной работой администратора операционной системы (управление процессами и службами, сбор и анализ системной информации, инвентаризация оборудования, перезагрузка и выключение рабочих станций)
Ключевые слова: WMI, Windows, инвентаризация

Типичные администраторские сценарии 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
'************************* Конец ***********************************
Листинг 13.1. Завершение сеанса пользователя
Перезагрузка компьютера

Для перезагрузки компьютера необходимо использовать метод 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
'************************* Конец ***********************************
Листинг 13.2. Перезагрузка компьютера
Выключение компьютера

В сценарии 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.3. Выключение компьютера

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

Листинги 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
'************************* Конец ***********************************
Листинг 13.4. Вывод информации о BIOS
< Лекция 12 || Лекция 13: 12 || Лекция 14 >
Валентина Тюрина
Валентина Тюрина

Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys.

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

Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре)

Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.