Использование WSH и WMI для создания
Logon-скриптов
Как вы знаете, такие скрипты подразумевают запуск в
момент старта. В Листинге 2 приведен загрузочный
скрипт, который определяет тип входящего в систему пользователя и
выполняет задачи, основываясь на этой информации.
Листинг 2
<job> <script language="vbscript"> on error resume next
set wshNetwork = WScript.CreateObject( "WScript.Network") Set wshShell = WScript.CreateObject("WScript.Shell")
do while wshNetwork.username = ""
WScript.Sleep 250
loop
user = wshNetwork.username
domain = wshNetwork.userdomain
Wscript.echo "Logging on " & ucase(domain) & "\" & user & "..."
adspath = "WinNT://" & domain & "/" & user set adsobj = GetObject(adspath)
for each prop in adsobj.groups select case prop.name case "Administrators"
call Adminslogon case "YourNewGroup"
call YourNewGrouplogon end select next
</script>
</job>
Первое, скрипт создает некоторые общие объекты которые
вам придется использовать, например, объекты WScript.Network и
WScript.Shell. Дальше он использует эти объекты для определения имени
пользователя и доменной информации. Наконец, используя ADSI скрипт
возвращает информацию содержащую группу пользователя. Эта информация
используется для определения подходящей подпрограммы, вызываемой для
каждой из пользовательских групп. Это выполняет оператор Select Case.
Загрузочный скрипт для пользователей создаваемой нами
группы Windows NT (под именем YourNewGroup) использует сетевые
возможности WSH. Он проверяет, используется ли буква Z. Если она
свободна, диском Z назначается \\yourserver\NETLOGON используя формат
\\server\share.
Чтобы объяснить, как работает загрузочный скрипт,
некоторые подпрограммы и функции вынесены в текст статьи. Можете просто
вернуть их на место в блок <script> в Листинге 2.
sub Domainlogon if CheckNetworkMapping("z:", "\\yourserver\NETLOGON") = false then MapNetwork "z:", "\\yourserver\NETLOGON "
end if
end sub
Функция CheckNetworkMapping перечисляет различные буквы
дисков чтобы определить, используется ли данная буква (см. Листинг
3). Она возвращает true или false на основании доступности
данной буквы. В случае true вызывается подпрограмма MapNetwork для
выполнения отображения. Эта подпрограмма использует метод
MapNetworkDrive объекта wshNetwork для присвоения сетевому ресурсу
соответствующей буквы. Более полную информацию о объекте wshNetwork
можно получить из таблицы 3.
Листинг 3
Function CheckNetworkMapping(DriveLetter) Dim Drive WScript.Echo "Проверяем наличие подключенного сетевого диска " & DriveLetter CheckNetworkMapping = False
For Each Drive In wshNetwork.EnumNetworkDrives If LCase(Drive) = LCase(DriveLetter) Then CheckNetworkMapping = True
Exit For
End If
Next
If CheckNetworkMapping Then WScript.Echo "Сетевой диск найден"
Else
WScript.Echo " Сетевой диск не найден"
End If
End Function
sub MapNetwork(driveletter, netshare) on error resume next
err.clear
WScript.Echo "Подключаем сетевой диск."
wshNetwork.MapNetworkDrive driveletter, netshare, true
if err <> 0 then
WScript.Echo "не могу ассоциировать " & driveletter & " с " & netshare else
WScript.Echo "ОК..."
end if
end sub
Администраторы могут захотеть получить более детальную
информацию, чем описание сетевых ресурсов и пользовательской среды. Им
может потребоваться информация о компьютере, например, переменные
среды, конфигурация компьютера, аппаратные устройства и так далее.
Используя только объектную модель WSH следующий код покажет вам как
вывести некую информацию о среде и реестре вашего компьютера.
sub Adminslogon Wscript.Echo _ "Эта процедура возвращает значения основных переменных среды данного компьютера."
ReturnENV
Wscript.Echo
regProxy
Wscript.Echo
Wscript.Echo "IP-адреса этого компьютера: " & GetIPAddress _ ("yourserver ", "administrator", "p-word") Wscript.Echo "Общее количество RAM на этой машине: " & GetRAM _ ("yourserver ", "administrator", "p-word") end sub
Этот скрипт приведен чисто для примера - легкомысленно
было бы хранить пароль администратора в открытом виде.
Что же еще можно сделать с помощью объектов,
поставляемых вместе с WSH? Например, вы можете получить некую
информацию о вашем компьютере. Это можно сделать с помощью метод
ReturnENV. Сперва в этом методе потребуется подключить wshProcEnv к
рабочей среде. Перед этим нужно создать объект wshShell (см. скрипт
ниже). Как только вы подключились к окружению процесса, вы можете
вернуть данные наподобие NUMBER_OF_PROCESSORS или PATH конфигурации
данного компьютера. Здесь несколько примеров того, что вы можете
извлечь из окружения процесса.
sub ReturnENV() set wshShell = Wscript.CreateObject("WScript.Shell") set wshProcEnv = wshShell.environment("process") WScript.Echo ("NUMBER_OF_PROCESSORS: " & wshProcEnv _ ("NUMBER_OF_PROCESSORS")) WScript.Echo WScript.Echo ("PROCESSOR_IDENTIFIER: " & wshProcEnv _ ("PROCESSOR_IDENTIFIER")) WScript.Echo WScript.Echo ("OS: " & wshProcEnv ("OS")) WScript.Echo WScript.Echo ("PATH: " & wshProcEnv ("PATH")) WScript.Echo WScript.Echo ("WINDIR: " & wshProcEnv ("WINDIR")) WScript.Echo end sub
Заметьте, что этот скрипт полностью работоспособен
только в среде NT (или W2K). В WindowsК9x будут доступны только PATH и
WINDIR.
Вы, несомненно, знаете, что неумелыми, а тем более
умелыми действиями в реестре можно быстро и бесповоротно угробить любую
ОС от Microsoft. Для автоматизации этого процесса WSH предоставляет
простой способ управления реестром. Методами RegRead, RegWrite и
RegDelete вы можете сделать все, что заблагорассудится. Все, что
требуется - указать верный ключ для чтения, записи или удаления.
Попробуем для примера настроить proxy-сервер. Получить
текущую информацию, хранящуюся в реестре по адресу
HKCU\Software\Microsoft\ Windows\CurrentVersion\Internet
Settings\ProxyServer можно с помощью метода RegRead. Затем, используя
RegWrite, перепишем это значение собственным, именем какого-то вашего
proxy-сервера, MYPROXY:80. Наконец, убедимся, что записали верную
информацию, для чего снова считаем значение с помощью RegRead.
sub regProxy prefix = "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\"
WScript.Echo "Старые установки Proxy-сервера: " & wshShell.RegRead(prefix & _ "ProxyServer") wshShell.regWrite prefix & "ProxyServer", "MYPROXY:80"
WScript.Echo " Новые установки Proxy-сервера: " & wshShell.RegRead(prefix & _ "ProxyServer") end sub
С помощью WMI вы можете собрать массу интересных
сведений. Функция GetIPAddress использует WMI для определения IP-адреса
машины. Здесь я не буду вдаваться в детали WMI, но, в основном, команда
GetObject берет объект управления WMI. Этот объект содержит метод
ExecQuery, который берет текстовый аргумент, описывающий IP-адрес и
возвращает набор всех IP-адресов машины.
GetRAM очень похож на GetIPAddress за исключением того,
что запрашиваемые строки различны. Как и в предыдущем случае, в
связанном сервисном объекте WMI работает ExecQuery. Листинг 4
показывает реализацию GetIPAddress и GetRAM.
Листинг 4
function GetIPAddress (server, username, password) set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") set objService = objLocator.ConnectServer (server, "", username, password) strQuery = _ "Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE"
set objEnumerator = objService.ExecQuery(strQuery)
for each obj in objEnumerator if Not IsNull(obj.IPAddress) then for i=LBound(obj.IPAddress) to UBound(obj.IPAddress) GetIPaddress = obj.IPAddress(i) next
end if
next
end function
function GetRAM (server, username, password) set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") set objService = objLocator.ConnectServer (server, username, password) strQuery = "Select TotalPhysicalMemory From Win32_LogicalMemoryConfiguration"
set objEnumerator = objService.ExecQuery(strQuery)
for each obj in objEnumerator GetRam = obj.totalPhysicalMemory next
end function
Чтобы завершить скрипт, сохраните код в файл logon.wsf
(или другой, как хотите). Его следует поместить в \\server\NETLOGON.
Это каталог, который Windows NT будет использовать в поисках файлов
типа загрузочных скриптов. Заметьте, что не-W2K-серверы могут не
исполнять иных файлов, кроме командных и ВАТ-файлов. В этом случае вам
придется написать простой logon.bat, который вызывает cscript.exe.
Возможно, будет мудро заменить две функции WMI из Листинга
4 на Windows Script Components.
|