Сценарий 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, сценарий отключает сетевой диск и выводит сообщение о завершении работы.
Наверх страницы
Содержание раздела