В части 16 этого цикла вы научились использовать базу данных MDT для настройки установки Windows 7 на основании UUID каждого целевого компьютера. В той же статье вы узнали, как использовать WMI для определения UUID в случае, если этот UUID не отображается в системном BIOS’е или в сопутствующей документации. Однако тот метод, который мы использовали, был несколько неряшлив, плюс на том компьютере, UUID которого вы собираетесь определять, уже должна быть установлена операционная система Windows.
Возникает вопрос: а можно ли использовать WMI для определения UUID компьютера, если на нем еще не установлена никакая операционная система? Ответ - да. Для этого нам сначала нужно удалить все те сценарии, которые мы насоздавали в двух предыдущих статьях. Затем нам нужно сделать образ Windows Preinstallation Environment (WinPE), добавить в этот образ сценарии и прожечь образ на CD. Потом этот CD можно использовать для загрузки чистого компьютера в WinPE и запуска сценария для определения UUID системы.
Именно этому посвящены эта и следующая статьи. Сначала, в данной статье, мы создадим небольшой сценарий, который просто отобразит UUID компьютера. А в следующей статье мы научимся создавать «инструменты»WinPE на CD, которые вы можете использовать для запуска сценария на пустой системе, на которой не установлена никакая операционная система, чтобы определить UUID системы. После использования WinPE-CD для запуска сценария на некотором количестве целевых компьютеров, вы можете внести эти UUID в базу данных MDT и установить образы Windows на каждый компьютер, что и требовалось.
Подсказка: Если вы новичок в написании сценариев для WMI, посмотрите мой 14-частный вводный цикл статей на WindowsNetworking.com под названием Управление сетями Windows с помощью сценариев.
Сценарий для определения UUID компьютера
В 16-й части нашего цикла мы видели, как можно определить UUID компьютера с помощью WMI:
- Мы начали со сценария DisplayClassProperties.vbs из 13-й части моего предыдущего цикла статей о сценариях, который отображает названия всех параметров класса WMI вместе со значениями этих параметров.
- Затем мы запустили WBEMTEST на компьютере, чтобы определить, что нам нужно внести в строку strWMIQuery = <string> нашего сценария, чтобы он мог работать на определенном компьютере. Вот необходимые для этого шаги: (a) запустить WBEMTEST (b) подключиться к пространству имен root\cimv2 (c) щелкнуть Enum Instances (d) ввести Win32_ComputerSystemProduct (e) нажать OK. Затем результат WBEMTEST используется в качестве значения <string> в вышеприведенной строке нашего сценария. Причем все это нужно делать вручную, так как копирование результата WBEMTEST в буфер обмена не поддерживается!
- После настройки сценария мы запускали его на компьютере, и в числе прочего в результате выводили UUID компьютера.
Все это выглядело, конечно, немного неряшливо: не слишком хорошо запускать WBEMTEST на компьютере или подстраивать сценарий каждый раз, когда его нужно запустить. И, кроме того, предпочтительнее было бы выводить только UUID компьютера, без кучи прочих вещей впридачу.
Вот как это сделать. Начнем с модифицированного сценария DisplayClassProperties.vbs, взятого из части 16 цикла статей:
' DisplayClassProperties.vbs
' Используется для нахождения UUID конкретного ПК
' Автор: Mitch Tulloch (www.mtit.com)
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem
strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery = ":Win32_ComputerSystemProduct.IdentifyingNumber='MXG5380254 NA540',Name='PY196AV-ABA a1130e',Version='0n31211CT101AMBEM00'"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count
For Each objItem in objWMIService.Properties_
Wscript.Echo "Property: " & objItem.name & vbTab & "Value: " & objItem.value
Next
Теперь для завершения того, что делает WBEMTEST, и возврата экземпляров класса Win32_ComputerSystemProduct, нам понадобится воспользоваться методом SWbemServices.InstancesOf объекта SWbemServices. Чтобы разобраться, как это нужно делать, я просто адаптировал следующий сценарий со страницы старого доброго Windows 2000 Scripting Guide (см. здесь):
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery _
("SEL ECT * FROM Win32_Service")
For Each objSWbemObject In colSWbemObjectSet
Wscript.Echo "Name: " & objSWbemObject.Name
Next
Моя собственная версия вышеприведенного сценария выглядит так:
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery _
("SEL ECT * FR OM Win32_ComputerSystemProduct")
For Each objSWbemObject In colSWbemObjectSet
strIdentifyingNumber = objSWbemObject.IdentifyingNumber
strName = objSWbemObject.Name
strVersion = objSWbemObject.Version
Next
Wscript.Echo "IdentifyingNumber: " & strIdentifyingNumber
Wscript.Echo "Name: " & strName
Wscript.Echo "Version: " & strVersion
Зачем мне понадобилось, чтобы этот сценарий определял значения трех параметров - IdentifyingNumber, Name и Version? Потому что у класса Win32_ComputerSystemProduct есть три ключевых параметра, а именно (вы правильно угадали): IdentifyingNumber, Name и Version. Чтобы увидеть все это собственными глазами, обратитесь к документации по этому классу в MSDN. Помните, что ключевым параметром является параметр, обеспечивающий уникальный идентификатор экземпляра класса, а чтобы подключиться к экземпляру класса, вам нужно будет указать на конкретный экземпляр с помощью ключевого параметра класса. Ключевые параметры отмечены квалификатором "Key" в документации в MSDN; обратитесь к 13-й части моего предыдущего цикла статей о сценариях за более подробной информацией, касающейся ключевых параметров.
Теперь мне нужно соединить настроенный выше сценарий с другим моим сценарием - DisplayClassProperties.vbs - чтобы создать следующий новый сценарий, который я назвал UUID.vbs (обратите внимание на то, что я упростил этот сценарий, опустив определения переменных и обработку ошибок):
'UUID.vbs
' Отображает UUID компьютера
' Автор: Mitch Tulloch (www.mtit.com)
strComputer = "."
strWMINamespace = "\root\CIMV2"
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FR OM Win32_ComputerSystemProduct")
For Each objSWbemObject In colSWbemObjectSet
strIdentifyingNumber = objSWbemObject.IdentifyingNumber
strName = objSWbemObject.Name
strVersion = objSWbemObject.Version
Next
strWMIQuery = ":Win32_ComputerSystemProduct.IdentifyingNumber='" & strIdentifyingNumber _
& "',Name='" & strName & "',Version='" & strVersion & chr(39)
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
For Each objItem in objWMIService.Properties_
If objItem.name = "UUID" Then
Wscript.Echo objItem.name & " = " & objItem.value
End If
Next
Смотрите: самое сложное здесь – убедиться в правильности строк в предложении strWMIQuery = <string>. К примеру, предложение заканчивается на & chr(39), то есть одинарную кавычку, необходимую для правильного синтаксиса завершения предложения. Понадобилось немного потанцевать вокруг этого места, чтобы заставить его работать; тут мне помог такой трюк: временно вставить предложение Wscript.echo strWmiQuery сразу после предложения strWMIQuery = <string>, чтобы я мог запустить сценарий и вывести содержимое строки, чтобы увидеть, правильный ли синтаксис у строки, после чего внес изменение и запускал сценарий снова, пока не получил правильный синтаксис.
Тестирование сценария
Давайте теперь посмотрим, работает ли наш сценарий, если запустить его из командной строки на компьютере, на котором установлена Windows XP (Рисунок 1):
Рисунок 1: Запуск UUID.vbs на компьютере с операционной системой
Давайте еще упростим запуск нашего сценария, создав дополнительный batch-файл под названием UUID.bat, который выглядит следующим образом:
@ECHO OFF
cscript.exe //nologo UUID.vbs
Запуск сценария становится еще проще, а выходные данные - чище (Рисунок 2):
Увеличить
Рисунок 2: Запуск UUID.bat на компьютере с операционной системой
Заключение
Вот наш сценарий и готов, теперь нам нужно создать образ WinPE и включить наш сценарий в этот образ, чтобы мы могли запускать наш сценарий на пустых системах. В следующей статье этого цикла вы узнаете, как это сделать.