УЧЕБНИК ПО АВТОУСТАНОВКЕ WINDOWS

       

Сценарий FinalSetup.vbs


Если Вы предпочитаете работать с командными файлами, то останетесь довольны и технологией сервера сценариев Windows (WSH). WSH – это обработчик сценариев (интерпретатор), являющийся составной частью операционных систем Windows 2000 и Windows 98. При необходимости, можно установить его на ОС Windows NT 4.0 и Windows 95. Интерпретатор WSH поддерживает команды WSH, а также языки сценариев VBScript и JScript (версию языка JavaScript компании Майкрософт).

Сценарии WSH используются для работы с файловой системой, автоматизации настольных приложений, управления системой Microsoft SQL Server и для многих других целей. Изучение этой технологии не составит большого труда, ведь всё, что Вам потребуется, это текстовый редактор и установленный интерпретатор WSH. Кроме этого, посетите веб-узел компании Майкрософт, посвященный технологиям сценариев в среде Windows http://msdn.microsoft.com/scripting (EN), где Вы найдете массу полезной информации, доступной для загрузки. Также ознакомьтесь со статьями, предложенными в разделе «Связанные ресурсы» этой статьи.

Листинг 1 демонстрирует сценарий FinalSetup.vbs, для написания которого я использовал технологии WSH и VBScript. Вы наверняка заметите, что мне нравится «украшать» код многочисленными пробелами и добавлять достаточно комментариев. К слову сказать, комментарии упрощают чтение сценария и помогут вспомнить назначение той или иной строки, если открыть сценарий спустя месяцы после его написания. Во многих случаях я оставляю закомментированным даже отладочный код, который добавляю в процессе написания и проверки сценария.

Листинг 1 – Сценарий FinalSetup.vbs

'**********************************************************************

' НАЗВАНИЕ: FinalSetup.VBS Ver 2.0

' НАЗНАЧЕНИЕ: для добавления глобальных групп домена к локальным группам

' после подключения компьютера к домену (образ WIN 2000).

'**********************************************************************

OPTION EXPLICIT 'Убедимся, что все переменные объявлены.

ON ERROR RESUME NEXT 'Сценарий продолжит работу в случае внутренней ошибки.



'***************************************************

'Объявляем переменные.

'***************************************************

Dim oGroup 'Объект ADSI созданный с помощью функции GetObject()



Dim oWshShell ' Объект Shell для запуска исполняемого файла (smsman.exe)

Dim sInDomain 'Используется для проверки членства в домене

Dim sCompName 'Имя локального компьютера

Dim oWshNet 'Объект WshNetwork

Dim sUser 'Имя пользователя для проверки на ошибки

Dim sMember 'Для проверки членства в группе (0 или 1)

'********************************************************

'Объявляем константы.

'********************************************************

Const GLOBAL_GROUP = "WEBDEV" 'Глобальная группа, добавляемая к локальной группе

Const LOCAL_GROUP = "Administrators" 'Имя локальной группы

Const DOMAIN = "GONDOR" 'Имя домена

'********************************************************

'Создаем объекты.

'********************************************************

'Создаем объект network.

Set oWshNet = Wscript.CreateObject("Wscript.Network")

'Создаем объект shell.

Set oWshShell = Wscript.CreateObject("Wscript.Shell")

'***************************************************

'Получаем локальную информацию.

'***************************************************

sUser = oWshNet.Username 'Получаем имя входа текущего пользователя.

SCompName = oWshNet.Computername 'Получаем имя компьютера.

'***************************************************

'Убедимся, что вошедший пользователь является Администратором, если это не так, завершаем работу сценария.

'***************************************************

IF UCASE(sUser) <> "ADMINISTRATOR" THEN

 Wscript.Echo "You must be logged in as ""ADMINISTRATOR"" to run this " & _

"script! " & vbCRLF & vbCRLF & "Log off and login as " & _

"""ADMINISTRATOR"" to the local machine " & "(" & sCompName & ")." & _



vbCRLF & vbCRLF & " After logging in as ADMINISTRATOR, run the " & _

"C:\WINNT\SYSTEM32\FinalSetup.vbs script again" & _

" to finish the installation."

 Wscript.Quit

END IF

'***************************************************

'Убедимся, что машина была добавлена к домену;

'в противном случае завершаем работу и выводим сообщение.

'***************************************************

'Получаем значение ключа из реестра.

sInDomain = oWshShell.RegRead("HKLM\SOFTWARE\" & _

"Microsoft\Windows NT\CurrentVersion\Winlogon\DomainCache\GONDOR")

IF sInDomain = "" THEN

Wscript.Echo "The Computer does not belong to " & DOMAIN & " domain!"

Wscript.quit

END IF

IF ERR.NUMBER = -2147024894 THEN

Wscript.Echo "The Computer does not belong to " & DOMAIN & " domain!"

Wscript.quit

END IF

'********************************************************

'Обновляем членство в группе.

'********************************************************

Set oGroup = GetObject("WinNT://" & sCompName & "/" & LOCAL_GROUP & ",group")

sMember = oGroup.IsMember("WinNT://" & DOMAIN & "/" & GLOBAL_GROUP)

'если является членом, то sMember будет -1, иначе 0.

IF sMember = 0 THEN

oGroup.add("WinNT://" & DOMAIN & "/" & GLOBAL_GROUP)

sMember = oGroup.IsMember("WinNT://" & DOMAIN & "/" & GLOBAL_GROUP)

'Если является членом, то sMember будет -1, иначе 0.

IF sMember = -1 THEN

oWshShell.Popup "The " & GLOBAL_GROUP & " global group has been " & _

"successfully added to the " & LOCAL_GROUP & " local group.", _

5, "Local Group Modified", 064

End IF

ELSE

oWshShell.Popup "The " & GLOBAL_GROUP & " global group is already" & _



" a member of the " & LOCAL_GROUP & " local group.", 5, _

"Global Group Exists" ,064

End IF

'********************************************************

'Запускаем smsman.exe для установки SMS 2.0.

'********************************************************

oWshShell.Popup "SMS 2. 0 will now be installed. Please wait while" & _

" program is loading..." & vbCRLF & vbCRLF & "The SMS Client" & _

" Installation will take approximately 5 minutes to complete" _

, 10, "SMS 2.0 Installation", 064

oWshNet.MapNetworkDrive "N:", "\\SMSCPS1\SMSLOGON", , "guest", ""

oWshShell.Run "N:\x86.bin\00000409\SMSMAN.EXE", ,TRUE

oWshNet.RemoveNetworkDrive "N:"

'********************************************************

'Выводим сообщение об окончании сценария и завершаем работу.

'********************************************************

MsgBox "This portion of the setup has been completed. " & _

"Logoff and login as the user and setup the printers."

Сценарий FinalSetup.vbs выполняет заключительные шаги процесса установки до того, как системный администратор позволит конечному пользователю работать с компьютером. Код сценария проверяет, что его запустил пользователь с правами администратора (Administrator), и что компьютер подключен к домену. Затем сценарий добавляет глобальную группу WEBDEV в локальную группу Администраторы (Administrators) компьютера, чтобы позволить веб-разработчикам устанавливать программное обеспечение и конфигурировать свои компьютеры.

Первые два оператора сценария крайне важны и должны содержаться в каждом Вашем сценарии. Оператор OPTION EXPLICIT проверяет, все ли переменные объявлены, прежде чем позволить их использование, предупреждая этим возможные ошибки в коде. Хотя VBScript позволяет не объявлять переменные, но если не использовать OPTION EXPLICIT, то любая опечатка в написании переменной создаст новую переменную.


Такую ошибку можно легко найти в простом сценарии, но проблематично, если код состоит из сотен строк. Оператор ON ERROR RESUME NEXT запрещает остановку выполнения сценария в случае обнаружения ошибки. Цель данного оператора не в игнорировании ошибки, а в том, чтобы ошибка не стала фатальной для сценария и позволила ему доработать до конца.

Следующий раздел сценария FinalSetup.vbs включает объявление переменных. Вы можете перечислить все переменные через запятую в одной строке, или поместить каждую переменную на отдельной строке, как сделано мной. Имя переменной должно начинаться с буквы латинского алфавита и его длина не может быть больше 255 символов, среди которых допустимы латинские буквы, цифры и символ подчеркивания (_). Использование однобуквенного префикса в нижнем регистре необязательно, но поможет при чтении определить тип данных (например, объект (object), строка (string), целое число (integer)), содержащихся в переменной.

Следующий раздел – это объявление констант. Константы похожи на переменные, за исключением того, что Вы не сможете изменить значение констант после их объявления. В сценарии используются три константы: GLOBAL_GROUP, LOCAL_GROUP, и DOMAIN.

Чтобы осуществить решение задачи, в сценарии необходимо использовать объекты. Объекты содержат в себе методы (функции, выполняемые объектом) и свойства (характеристики). Вы должны создать объект перед его использованием в сценарии. Создание объекта подразумевает его размещение в памяти и регистрацию. В сценариях WSH для создания объекта используется функция Wscript.CreateObject(). В сценарии FinalSetup.vbs задействованы несколько объектов, встроенных в интерпретатор WSH.

В следующем разделе FinalSetup.vbs создается два объекта: объект Network (Wscript.Network) и объект Shell (Wscript.Shell). Объект Network позволяет подключаться к сетевым ресурсам. Объект Shell служит для запуска исполняемых файлов, работы с реестром, чтения переменных среды, создания ярлыков, а также выполнения некоторых других функций.


В каждом случае сценарий сохраняет созданные объекты в переменных (соответственно в oWshNet и oWshShell) и использует эти переменные для доступа к методам и свойствам объекта.

Чтобы сценарий успешно завершил свою работу, он должен выполняться под учетной записью локального администратора (Administrator). Для проверки этого факта, сценарий получает значение свойства Username объекта Network, созданного ранее, и сохраняет это значение в переменной sUser. В переменной sCompName сохраняется имя компьютера, полученное из свойства Computername. Функция UCASE() задействована для преобразования значения переменной sUser к верхнему регистру для последующего сравнения со строкой «ADMINISTRATOR». Если результат этого сравнения будет отрицательным, сценарий выведет сообщение об ошибке и завершит работу.

В противном случае, сценарий продолжит работу, и следующим шагом будет проверка факта подключения компьютера к домену. Сначала, метод oWshShell.RegRead производит чтение ключа реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\DomainCache\GONDOR и его значение сохраняет в переменной sInDomain. После этого сценарий делает две проверки. Первая: если значением переменной sInDomain является null (ключ реестра пуст), сценарий выводит сообщение об ошибке и завершает работу. Вторая: если произошла фатальная ошибка с кодом 2147024894 (ключа реестра не существует), сценарий также завершается сообщением об ошибке. Если ключа реестра не окажется, и сценарий не будет содержать оператор ON ERROR RESUME NEXT, упомянутый мной ранее, пользователь увидит сообщение об ошибке, показанное на Рисунке 1.



Рисунок 1 – Сообщение об ошибке интерпретатора WSH

Следующим шагом сценария будет добавление глобальной группы домена Windows NT 4.0 в локальную группу Администраторы (Administrators) компьютера. Для этого сценарий осуществляет подключение к базе данных SAM локального компьютера, используя Интерфейсы службы каталогов Active Directory (Active Directory Service Interfaces, ADSI).


С помощью функции ADSI GetObject() создается объект oGroup для связи с поставщиком интерфейсов службы каталогов Active Directory WinNT. После установки соединения, сценарий использует метод IsMember объекта oGroup, чтобы проверить, является ли глобальная группа домена (GLOBAL_GROUP) членом локальной группы Администраторы (Administrators). Если результат проверки окажется отрицательным, то значением переменной sMember будет FALSE (0) и сценарий задействует метод oGroup.Add для добавления глобальной группы в локальную группу. Затем снова проверяется значение переменной sMember, которое должно быть TRUE (-1). После этого метод oWshShell.Popup выведет сообщение о статусе выполнения, и после паузы в 5 секунд продолжится выполнение сценария.

Поскольку мы используем SMS, последним этапом работы сценария будет установка клиента SMS на компьютер. После вывода информационного сообщения, метод oWshNet.MapNetworkDrive производит подключение диска N компьютера к серверу SMS, и метод oWshShell.Run запускает файл smsman.exe. По окончании работы установочного файла smsman.exe, сценарий отключает сетевой диск и выводит сообщение о завершении работы.

Наверх страницы


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