Разработка сценария регистрации пользователей в сети. Часть2::Журнал СА 12.2004
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Электронный документооборот  

5 способов повысить безопасность электронной подписи

Область применения технологий электронной подписи с каждым годом расширяется. Все больше задач

 Читать далее...

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9956
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8163
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8264
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5232
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5919
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Разработка сценария регистрации пользователей в сети. Часть2

Архив номеров / 2004 / Выпуск №12 (25) / Разработка сценария регистрации пользователей в сети. Часть2

Рубрика: Карьера/Образование /  Образование   | Дополнительные материалы

ИВАН КОРОБКО

Разработка сценария регистрации пользователей в сети

Часть 2

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

Автоматическое подключение сетевых ресурсов

К сетевым ресурсам относятся сетевые принтеры и диски. Рассмотрим подробнее каждый из них.

Подключение сетевых принтеров. Теория

Соглашение об именах

Имя должно содержать как можно больше информации о принтере, при этом быть удобным для использования. На рабочих станциях под управлением операционной системы Windows пользователь имеет дело с двумя именами – непосредственное и сетевое имена принтера.

Чаще всего имя, назначаемое принтеру, представляет собой реальное имя принтера с порядковым номером, если есть несколько принтеров одинаковой модели, например, HP LaserJet 1200 (1), HP LaserJet 2300 (2). Такой способ именования рекомендуется использовать в небольших организациях. В крупных корпорациях принцип именования принтеров может быть другим.

Сетевое имя, как отмечено ранее, должно быть более коротким, но при этом не должно терять смысловой нагрузки. Оно чаще всего представляет собой общую характеристику принтера, например, HP1200_1, HP2300_2.

Предварительная настройка принтера и AD

Работа сценария строится на анализе и обработке данных, содержащихся в Active Directory и пользовательском реестре. На основе полученных данных осуществляется подключение и отключение принтера в зависимости от членства пользователя в соответствующих группах безопасности. Для обеспечения работоспособности сценария необходимо выполнение нескольких условий:

Первое условие – названия принтеров, групп безопасности должны удовлетворять соглашению об именах.

Второе – сетевые принтеры, подключением и отключением которых должен управлять скрипт, должны быть опубликованы в Active Directory.

Третье – названия групп безопасности должны строиться в соответствии со следующим шаблоном: название одной из групп, члены которой могут только выводить задания на печать, образуется добавлением к сетевому имени принтера через дефис слова Print, например, «HP2300_1 – Print». Название другой группы строится аналогично, с той разницей, что слово «Print» заменяют на словосочетание «Print Managers». Члены этой группы могут управлять очередью печати и принтером. Таким образом, принтеру с сетевым именем «HP1200_1», соответствуют следующие названия групп: имя первой группы «HP1200_1 – Print», второй «HP1200_1 – Print Managers».

Рисунок 1

Рисунок 1

Четвертое – должны быть определены параметры безопасности принтера. В свойствах принтера (см. рис. 2) на сервере печати во вкладке «Security» (безопасность) должна быть удалена группа «Everyone» (в противном случае скрипт будет подключать этот принтер всем пользователям сети) и добавлены две группы безопасности, соответствующие данному принтеру: «HP1200_1 – Print» и «HP1200_1 – Print Managers». Для группы «HP1200_1 – Print» должен быть установлен в разделе «Permissions» (разрешения) флажок напротив свойства «Print» (см. рис. 2), а для группы «HP1200_1 – Print Managers» – флажки напротив «Print» (печать) и «Manage Documents» (управление документами). Ставить флажок напротив «Manage Printers» не рекомендуется, поскольку управление принтерами подразумевает возможность изменять настройки принтера, удалять его. По мнению автора, такими привилегиями может обладать только системный администратор.

Рисунок 2

Рисунок 2

Подключение сетевых принтеров. Практика

Итак, работа сценария строится на анализе данных, содержащихся в Active Directory и пользовательском реестре. Его работу можно разбить на три этапа.

На первом этапе формируется список принтеров, которые должны быть подключены к пользователю. На втором этапе – список сетевых принтеров, уже установленных на рабочей станции пользователя. Наконец, на третьем – осуществляется приведение этих списков в соответствие.

Формирование списка принтеров, которые необходимо подключить пользователю

Определение имени текущего домена

С помощью функции GetObject() осуществляется чтение корня пространства имен, в данном случае определяется имя текущего домена.

Пример определения текущего домена:

$rootDSE_ = GetObject("LDAP://RootDSE")

$domain_ = "LDAP://" + $rootDSE_.Get("defaultNamingContext")

Переменная domain_имеет вид «dc=microsoft,dc=com», если домен «microsoft.com».

Имя текущего домена, полученного провайдером WinNT, нельзя использовать, поскольку с его помощью можно получить только сокращенное имя домена (в данном случае «microsoft»). Если все же указано сокращенное имя домена в строке с SQL-запросом, то при выполнении скрипта произойдет ошибка. В сообщении о ней будет сказано, что по указанному пути база не обнаружена, поэтому установить соединение невозможно.

Построение запроса SQL

Запрос SQL используется для осуществления процедуры поиска объектов, при заданном типе объекта. В общем случае он выглядит следующим образом:

SELECT поле_1, поле_2, …, поле_n FROM “LDAP://dc=домен_1,dc=домен_2…,domen_n” WHERE objectClass=’тип_объекта’

В SELECT указываются поля, по которым идет выборка. Поля перечисляются через запятую, «пробелы» после запятой обязательны. Полный список полей объектов AD можно получить с помощью утилиты ADSI Edit, которая размещается в дистрибутиве Microsoft Windows 2000 в директории /Support/Tools (см. статью «Программное управление ADSI: LDAP», журнал «Системный администратор», №3, март 2004г.).

В FROM указывается путь к объекту. В данном случае известен только домен. При описании данного раздела пробелы не допускаются.

В WHERE указывается тип объекта, к которому адресован запрос. Данное поле является фильтром. Провайдер LDAP поддерживает несколько типов объектов, которые в запросе SQL определяются переменной objectClass: Print Queue – массив принтеров, опубликованных в AD; Group – группы, созданные в AD; User – пользователи, созданные в AD; Computer – массив компьютеров, зарегистрированных в AD. Пример использования запроса SQL см. в следующем разделе.

Поиск опубликованных принтеров в AD

Поиск объектов в Active Directory с помощью провайдера LDAP реализуется через ADODB-соединение. После создания соединения формируется SQL-запрос и осуществляется поиск по заданным критериям. Результатом поиска будет массив, элементами которого являются значения полей, которые указаны в параметре SELECT SQL-запроса. Затем происходит вывод данных на экран. В приведенном примере осуществляется поиск всех опубликованных принтеров в текущем домене и вывод на экран названия принтера, его сетевого имени (ShareName):

$strADSQuery = "SELECT shortservername, portname, servername, printername, printsharename, location, description FROM '" +$domain_+"' WHERE objectClass='printQueue'"

$objConnection = CreateObject("ADODB.Connection")

$objCommand = CreateObject("ADODB.Command")

$objConnection.CommandTimeout = 120

$objConnection.Provider = "ADsDSOObject"

$objConnection.Open ("Active Directory Provider")

$objCommand.ActiveConnection = $objConnection

$objCommand.CommandText = $strADSQuery

$st = $objCommand.Execute

$st.Movefirst

$i=0

Do

$server_enum=""

$name_enum=""

$shares_enum=""

$description_enum=""

    $server_enum = $St.Fields("shortservername").Value

    $name_enum = $St.Fields("printername").Value

    $shares=$St.Fields("printsharename").Value

           for each $share in $shares

           $shares_enum = $shares_enum + $share

           next

    $descrs=$St.Fields("description").Value

           for each $desc in $descrs

           $description_enum = $description_enum + $desc

           Next

$st.MoveNext

$temp="Название принтера: " & $name_enum & chr(13) & "Путь к принтеру: " & "\\" & $server_enum & "\" & $shares_enum & chr(13) &  "Описание: " & $description_enum.

MessageBox($temp,"Характеристики принтера",0,0)

$temp=""

Until $st.EOF

В Active Directory объектом класса printQueue является принтер. Этот объект имеет свойства, значение которых может быть двух типов: строкой и массивом. В приведенном примере поле, содержащее название принтера, является строковой переменной, а сетевое имя принтера – массивом.

Ниже приведена таблица, содержащая названия и описания часто используемых полей, соответствующий им тип и формат данных:

Таблица 1

Поле

Описание

Тип

Пример

 

Описание принтера

Array

Принтер формата А4

Location

Физическое место размещения принтера

String

2 этаж, 10 комната

PrinterName

То же, что и Name

String

PrinterName

PrintShareName

Имя принтера для подключения

Array

Printer

ServerName

Полное имя сервера, к которому подключен принтер

String

Server.Domain.Ru

ShortServerName

Краткое имя сервера

String

Server

Формирование массива

Идея, лежащая в основе механизма подключения принтеров, следующая: осуществляется попытка подключить принтер, затем сценарий загрузки «смотрит», что из этого получилось, и в зависимости от результата предпринимает действия. При объяснении работы этого механизма (для облегчения восприятия материала) я намеренно поменял местами причину и следствие.

После того как в Active Directory найден очередной опубликованный принтер и прочитаны его свойства, для него формируется UNC-путь (serversharename). Затем осуществляется попытка подключить пользователю принтер и считывать код функции, производящей подключение.

Если функция подключения возвращает код ошибки 0 (подключение к принтеру прошло успешно), то пользователь является членом одной из двух групп безопасности, перечисленных в свойствах принтера на сервере печати.

Для тех принтеров, на которые пользователь имеет право печатать (как минимум), формируется массив, например, $access_array[$i]. Формат элементов массива следующий: «,,server,printername», где server – короткое имя сервера, printername – локальное имя принтера.

    $path_enum_connect = "" + $server_enum + "" + $shares_enum

    $connect_flag = addprinterconnection( $path_enum_connect )

           if $connect_flag=0

           $path_full =",," + $server_enum + "," + $name_enum

 

                 $access_array[$i] = lcase($path_full)

                 $i=$i+1

                 Endif

Формирование списка сетевых принтеров, подключенных пользователю

Процесс определения подключенных пользователю сетевых принтеров основан на анализе ветви HKCU локального реестра.

Рисунок 3

Рисунок 3

С помощью функции ENUM осуществляется чтение названий папок, содержащих в себе короткое имя сервера и полное имя принтера. На основе полученной информации формируется массив, элементами которого являются строки, имеющие следующий формат: «,,server,printername», где server – короткое имя сервера, printername – локальное имя принтера.

Для удобства сравнения обоих массивов (подключенных принтеров и принтеров, на которые пользователь имеет права) необходимо, чтобы форматы элементов массивов совпадали. Формат элементов продиктован особенностью построения реестра Windows 2000.

$Index=0

DO

$connected_array[$index]= lcase(ENUMKEY("HKEY_CURRENT_USERPrintersConnections", $Index))

$Index = $Index + 1

UNTIL Len($Group) =0

Необходимо отметить, что после формирования второго массива между ними соблюдаются следующее неравенство: М2іМ1, где М2 – массив, элементами которого являются названия подключенных принтеров, M1 – принтеров, на которые пользователь имеет права. На третьем, заключительном этапе добиваются выполнения следующего условия: М1=М2.

Приведение созданных списков принтеров в соответствие

Сопоставление массивов М1 и М2 осуществляется с помощью функции ASCAN. В том случае, если функция возвращает значение -1, то элемент, найденный в одном массиве, не является элементом другого. Поэтому принтер, соответствующий этому элементу, должен быть отключен.

    for $i=0 to ubound($connected_array)

    $flag_p=0

    $flag_p=Ascan($access_array,$connected_array[$i])

           if $flag_p=-1

           ………

           endif

    next

Удаление принтера осуществляется с помощью соответствующей функции, параметром которой является UNC-путь принтера. Для того чтобы сформировать этот путь, осуществляется анализ ветви HKLM:

           if $flag_p=-1

$group=$connected_array[$i]

$name_=right($group, len($group)-instrrev($group,","))

$server_=right(left($group,len($group)-len($name_)-1), ї

    len(left($group,len($group)-len($name_)-1))-2)

$share_=readvalue("HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionPrintProvidersLanMan Print ServicesServers"+$server_+"Printers"+$name_,"Share Name")

$disconnect_ =""+$server_+""+$share_

$r=DelPrinterConnection( $disconnect_ )

           endif

 Рисунок 4

Рисунок 4

Подключение сетевых дисков. Теория

Сценарий загрузки осуществляет подключение сетевых дисков пользователям в зависимости от их членства в группах, аналогично подключению сетевых принтеров. Главная особенность данного сценария заключается в том, что в нем реализован механизм подключения различных ресурсов на одну и ту же букву. Реализовано для пользователей, входящих в непересекающиеся группы безопасности. Необходимо строго следить, чтобы членства пользователей в группах, подключающихся на одну букву, не пересекались.

Рассмотрим содержимое конфигурационного файла, который представляет собой текстовый файл с произвольным расширением, например INI.

[L1]

SERVER=Main

SHARE=Consultant

ACCESSGROUP1=everyone

ACCESSGROUP2=Все

DESCRIPTION="Консультант+"

[W1]

SERVER=Second

SHARE=work\department1

ACCESSGROUP1=department1

ACCESSGROUP2=department3

DESCRIPTION="Ресурсы отдела 1"

[W2]

SERVER=Second

SHARE=work\department2

ACCESSGROUP1=department2

ACCESSGROUP2=

DESCRIPTION="Ресурсы отдела 2"

Таким образом, на основе данных, прочитанных сценарием из примера, всем пользователям будет подключен «Консультант+» на букву «L», находящийся по пути mainconsultant. Пользователям, являющимся членами групп departament1, departament2, departament3, будет подключен диск W. Для членов групп departament1, departament3 подключается ресурс по адресу secondworkdepartament1, для departament2 – secondworkdepartament2.

Сценарий, обеспечивающий автоматическое управление подключением сетевых дисков, работает по схеме:

  • Чистка локального кэша на рабочей станции, содержащего список групп, в которые входит пользователь. Удаление ветви реестра HKEY_CURRENT_USERSoftwareKiXtart.
  • Чтение параметрического файла. Данные рекомендуется помещать в соответствующие массивы.
  • Отключение всех доступных сетевых дисков.
  • Подключение сетевых дисков, на которые данный поль-зователь имеет права.
  • Вывод на экран статистики о подключенных сетевых дисках.

 

Рисунок 5

Рисунок 5

Подключение сетевых дисков. Практика

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

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

Процедура удаления осуществляется с помощью функции DelTree():

DelTree("HKEY_CURRENT_USERSoftwareKiXtart")

Затем рекомендуется создать и наполнить данными динамический массив. Элементами этого массива являются названия групп, в которые входит пользователь. В синтаксисе языка KIXTart существует специально созданная функция – EnumGroup():

DO

    $Group = ENUMGROUP($i)    

? $Group

    $i = $i + 1

UNTIL Len($Group) = 0

Переменная $Group содержит полное название группы. Формат названия группы следующий: domaingroup_name. Для подключения различных ресурсов необходимо вычленить имя группы без префикса в виде имени домена или рабочей станции. Попутно необходимо исключить группы, в названиях которых присутствует слово «- print», поскольку группы, содержащие это сочетание символов, предназначены для управления принтерами и не принимают участия в процессе подключения сетевых дисков.

dim $usergroup_name[]

$k=0

DO

    $Group = ENUMGROUP($i)    

    if instr("$Group","- Print")=0

           $ug1_len=len($group)-instrrev($group,"")

ReDim Preserve $usergroup_name[$k]

           $usergroup_name[$k]=right($group,"$ug1_len")

           $u_val=$usergroup_name[$k]

           $k=$k+1            

    endif

$i=$i+1

UNTIL Len($Group) = 0

На следующем этапе осуществляется чтение конфигурационного файла с расширением INI. Чтение параметрического файла осуществляется в соответствии с алгоритмом, приведенным на рис. 5. Итак, поскольку названия подразделов (значения, заключенные в INI-файлах в «квадратные» скобки) неизвестны, то сначала файл рассматривается как обычный текстовый файл, который читается построчно. Каждая строка анализируется, и если она включает в себе символ «[», то содержимое, находящееся между квадратными скобками, помещается в динамический массив $gr[]:

$i=1

dim $gr[]

open(2,"@LDRIVE/shared.ini",2) ; файл shared.ini располагается в одном каталоге со скриптом –ServerNetlogon

WHILE @ERROR = 0

$x=ReadLine(2)

$skoba=instrrev("$x","[")

    if $skoba<>0

ReDim Preserve $gr[$i]

           $gr[$i]=right(left($x,len("$x")-1), len(left($x,len("$x")-1))-1)

           $i = $i + 1 

endif

LOOP

После того как сформирован массив, осуществляется повторное чтение INI-файла. На этот раз он рассматривается как параметрический файл. Осуществляется чтение параметров. По ходу чтения параметрического диска сначала осуществляется попытка отключить сетевой диск, затем подключить его, если пользователь входит в соответствующую группу безопасности. Таким образом, соблюдается актуальность подключенных сетевых дисков.

$k=ubound($gr)

for $i=1 to $k

    $letter=$gr[$i]

$serv=readprofilestring("$ini_file1", "$letter","server")

$share=readprofilestring("$ini_file1", "$letter","share")

$accessgroup1=readprofilestring("$ini_file1", "$letter","accessgroup1")

$accessgroup2=readprofilestring("$ini_file1", "$letter","accessgroup2")

$share_name=""+$serv+""+$share+""

$let=$letter+":"

$letter_S=left($letter,1)

use $letter_S /delete

if ingroup("$accessgroup1","$accessgroup2")

use $letter_S+":" $share_name

endif

next

Замечание. Данные, содержащие в себе имя монтируемого диска в конфигурационном файле, имеют структуру – название диска + номер. Нумерация сквозная. При подключении ресурса нумерация отбрасывается. Таким способом на одну и ту же букву монтируются различные ресурсы для разных пользователей. Соответственно необходимо помнить, что членства в группах не должны пересекаться.

Автоматическое конфигурирование рабочей станции

Поскольку скрипт выполняется от имени пользователя, который не обладает правами системного администратора, то изменения могут быть внесены только в ветвь HKCU. В этом разделе хранятся сведения о текущем зарегистрированном пользователе, и он имеет название, соответствующее значению идентификатора безопасности (SID) текущего пользователя. Каждый раз при перезагрузке компьютера раздел создается заново на основе данных, считанных из HKU. Автоматическое конфигурирование ветви HKU выполняется с помощью групповых политик (будет рассмотрено позже), а ветви HKCU – с помощью скрипта.

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

Таблица 2

Ключи реестра

Описание

[HKEY_CURRENT_USERKeyboard LayoutPreload]

"1"="00000409"

"2"="00000419"

[HKEY_CURRENT_USERKeyboard LayoutToggle]

"Hotkey"="2"

Установка языковых настроек рабочего стола пользователя: английского языка по умолчанию

и переключение раскладок <Ctrl+Shift>

[HKEY_CURRENT_USERControl PanelInternational]

sTimeFormat=”HH:mm:ss tt”

s1159=”Am”

s2359=”Pm”

Рядом с часами на панели задач отображается AM/PM в зависимости от времени суток

[HKEY_CURRENT_USERControl PanelDesktop]

"PaintDesktopVersion"=dword:00000001

В нижнем правом углу экрана демонстрируется версия операционной системы

[HKEY_CURRENT_USERControl PanelDesktop]

"Wallpaper"="desktop.bmp"

"WallpaperStyle"="2"

Подменяет картинку на Desktop пользователя, растягивает ее на весь экран

Блочность скрипта

Согласитесь, что скрипт – это программа, которая должна отличаться стабильностью в своей работе. А разве это не обязательно для всех без исключения программ? С другой стороны, используя его на практике, могу сказать, что в нем постоянно что-то изменяется и никто не застрахован от ошибки. Тестирование на локальной машине и в сети, как говорят, две большие разницы. В данной статье рассмотрены только основные задачи, реально их гораздо больше, например, в крупных организациях может быть актуально автоматизированное подключение баз 1с в бухгалтерии и т. д. Поэтому правильным шагом будет создать конфигурационный файл для этого скрипта, который бы позволил оперативно управлять включением и выключением различных блоков. В случае внештатной ситуации вы сможете сохранить работоспособность скрипта на 70-90%, выключив сбойный блок. Согласитесь, это гораздо лучше, чем иметь только 2 варианта, характеризующих работоспособность – 0% и 100%.

Реализация идеи следующая: из конфигурационного файла (см. пример файла kix.ini) считываются параметры, которые имеют значение 0 (выключено) и 1 (включено):

Пример файла kix.ini:

[part]

print=1

share=1

sysinfo=1

В таком случае структура скрипта будет выглядеть следующим образом:

$config_ini ="@LDRIVE/kix.ini"; файл kix.ini располагается в одном каталоге со скриптом - ServerNetlogon

open(1, $config_ini, 2)

………………………………; описываются различные глобальные переменные, осуществляется соединение с AD и др.

if readprofilestring("$config_ini","part","sysinfo")=1

………………………………

Endif

if readprofilestring("$config_ini","part"," share ")=1

………………………………

Endif

 

if readprofilestring("$config_ini","part"," print ")=1

………………………………

Endif

Таким образом, если необходимо протестировать какую-либо новую функцию сценария, можно создать еще один раздел, например, «test», и размещать в нем тестируемый код.

Обеспечение интерактивности работы скрипта

Сценарии на языке KIXTart можно визуализировать, по крайней мере, тремя способами:

  • с помощью стандартных диалоговых окон;
  • с помощью сторонней надстройки KIXTart в виде DLL-библиотеки;
  • c помощью сторонней утилиты, передающей параметры из KIXTart в HTML-файл.

Выбор варианта

Рассмотрим все три способа:

Визуализация работы скрипта с помощью стандартных диалоговых окон

В начале работы скрипта пользователю выводится информация о том, что он начал функционировать. Основным недостатком этого метода визуализации является полное отсутствие интерактивности работы сценария.

Визуализация скрипта с помощью сторонней надстройки KIXTart в виде DLL-библиотеки

Визуализация и интерактивность работы скрипта реализуется с помощью специально созданной для этих целей надстройки – KIXForms 3.2 или KIXGui 1.1. Обе программы можно загрузить с сайта http://www.kixtart.org.

У этих программ есть только один недостаток: для корректной работы визуализационной части необходимо на рабочей станции зарегистрировать соответствующую DLL-библиотеку. Для регистрации этой библиотеки необходимо обладать правами администратора. Конечно, можно создать MSI-архив, который будет централизованно распространяться по сети с помощью групповых политик, но это неудобно. Использовать надстройки такого рода выгодно только в небольших сетях с маленьким количеством рабочих станций.

Визуализация работы скрипта c помощью сторонней утилиты, передающей параметры из KIXTart в HTML-файл

Этот способ мне кажется наиболее оптимальным для реализации визуализации и интерактивности работы скрипта в крупных сетях, поскольку утилита самодостаточна и представляет собой файл с расширением EXE, который рекомендуется располагать в каталоге Netlogon, вместе со скриптом. KixWin 1.1 (http://www.kixtart.org) вызывается из скрипта с набором параметров. Затем она передает эти параметры в DHTML-файл. Для корректной работы визуализационной части необходимо дать ему право на запись в папке, в которой находится DHTML-файл.

Синтаксис KIXWin

Приведем синтаксис утилиты и фрагмент DHTML-файла:

kixwin "dialog" ["arguments"] ["options"]

Описание параметров:

  • «dialog» – строка, содержащая строку в формате URL к HTML-документу.
  • «arguments» – строка, содержащая параметры, передаваемые из KIX в HTML. Для разделения параметров в HTML-файле используют строку window.dialogArguments. split(«;»). В данном примере разделителем параметров является «;».
  • «style» – строка, которая определяет оформление диалогового окна. Используются один или несколько из следующих параметров стиля:

dialogHeight:sHeight

dialogLeft:sXPos

dialogTop:sYPos

dialogWidth:sWidth

center:{ yes | no | 1 | 0 | on | off }

dialogHide:{ yes | no | 1 | 0 | on | off }

edge:{ sunken | raised }

help:{ yes | no | 1 | 0 | on | off }

resizable:{ yes | no | 1 | 0 | on | off }

scroll:{ yes | no | 1 | 0 | on | off }

status:{ yes | no | 1 | 0 | on | off }

unadorned:{ yes | no | 1 | 0 | on | off }

Логическое разделение передаваемых параметров осуществляется с помощью заранее оговоренного символа. DHTML возвращает в KIX код ошибки в виде целого числа, макросу @ERROR. В случае успешного завершения операции @ERROR=0.

Передача данных с помощью утилиты KIXWIN осуществляется сценарием загрузки следующим образом:

shell "%0/../kixwin.exe $html "$system_info ^ $hardware_info ^ Установленные программы: $en $prog ^ Подключенные сетевые диски:$en $n1 ^ Подключенные сетевые принтеры:$en $n2" "scroll:off;resizable:on""

DHTML-файл

Основы формирования файла

Как отмечалось ранее, параметры передаются DHTML-странице, содержащей вставки на VBScript. При загрузке страницы в теге body указывается функция, например, onload=”startrun()”, с помощью которой запускается таймер. В том случае, если таймер не прерван, то по окончанию отсчета автоматическое закрывание окна и продолжения процесса загрузки компьютера:

<BODY onload="startrun()" TEXT="BLACK" …>

………………………………………………………

<Script Language="JavaScript">

function startrun()

{

window.form1.textarea1.value="Процесс настройки компьютера завершен. Для продолжения нажмите кнопку ПРОДОЛЖИТЬ или подождите 7сек. – окно закроется само."

timer1=setTimeout("exit()", 20000);

}

</Script>

</BODY>

Как видно из примера, в текстовой области выводится сообщение о том, что настройка рабочей станции завершена и запускается таймер. Если ни одна кнопка на клавиатуре не нажималась в течение 20 000 мсек, то осуществляется вызов функции exit(), которая закрывает окно браузера (листинг DHTML-файла на www.samag.ru/source).

Кнопки, при нажатии на которые отображается информация различного рода, представляют собой картинку с надписями на ней, которая разделена на различные области. При нажатии на описанные области осуществляется запуск соответствующей функции, которая, в свою очередь, отображает информацию, переданную из скрипта в текстовую область window.form1.textarea1:

……

<img src="bar2.jpg" name="imgAdvert" usemap="#Prosv" border=0>

<map name="Prosv">

<area onclick=system() alt="Сведения об операционной системе" shape=circle coords="69,40,50">

<area onclick=hardware() alt="Сведения о компьютере" shape=circle coords="166,40,50">

……

</map>

<Script Language="JavaScript">

……

function system()

{

clearTimeout(timer1);

var argv;

argv = window.dialogArguments.split("^");

document.all.parametr0  = argv[0];

window.form1.textarea1.value=""

window.form1.textarea1.value=document.all.parametr0

}

function hardware()

{

clearTimeout(timer1);

var argv;

argv = window.dialogArguments.split("^");

document.all.parametr1  = argv[1];

window.form1.textarea1.value=""

window.form1.textarea1.value=document.all.parametr1

}

Обратите внимание, что при вызове любой функции осуществляется прерывание таймера функцией clearTime out(timer1), затем чтение соответствующего аргумента.

Обеспечение удобства

Для обеспечения удобства работы со сценарием необходимо изменить представление окна браузера: сделать его неизменяемым, убрать различные панели инструментов и т. д. (см. рис. 6). Для того чтобы информация выводилась корректно, необходимо в теге META указать кодировку, в которой должны быть отражены символы, а именно Windows-1251:

<META  http-equiv=Content-Type content="text/html; charset=windows-1251">

Рисунок 6

Рисунок 6

Внедрение скрипта в эксплуатацию

Скрипт выполняется каждый раз при регистрации пользователя в сети, если он указан в разделе Profile свойствах пользователя (см. рис. 7) службы Active Directory: Users and Computers.

Для автоматизации установки KIXtart на рабочих станциях домена предлагается следующее: в папку Netlogon поместить файлы:

  • KIX32.EXE
  • SCRIPT.KIX
  • START.BAT
  • подкаталог Win9x, содержит файлы KX16.DLL и KX32.DLL
  • KIXWIN.EXE
  • KIX.INI
  • SHARED.INI

В скрытую сетевую папку скопировать DHTML-файл и все сопутствующие ему файлы.

В ходе выполнения файла START.BAT определяется тип операционной системы, установленной на рабочей станции, и в зависимости от результатов происходит копирование набора файлов, необходимых KIX для работы на данной платформе. А затем запускает скрипт.

@ECHO OFF

if c:\%os%==c: goto win9x

if not c:\%os%==c: goto winnt

:winnt

goto kix

:win9x

copy %0..win9x*.dll c:windowssystem /y

goto kix

:kix

@echo End Of Batch File

Пояснения к синтаксису файла START.BAT:

  • Принцип определения операционной системы основан на том, что в Win9x отсутствует переменная окружения %os%. В Windows 2k переменная %os%=WindowsNT.
  • С помощью строки «start /wait Kix32.exe Script.kix» добиваются последовательной загрузки – сначала скрипт, затем рабочий стол и т. д., а не одновременной. То есть на время выполнения скрипта многозадачность «отключается». Это делается для того, чтобы до окончания действия скрипта дальнейшая загрузка операционной системы не производилась.
  • Для корректной работы win9x, в качестве пути к файлу необходимо указывать «%0..filename.ext». Windows XP не воспринимает относительного пути «%0/./», поэтому для Windows семейства 2k необходимо указать только имя файла, который находится в папке Netlogon.

 Рисунок 7

Рисунок 7

На время выполнения скрипта необходимо скрыть CMD-панель, в которой выполняется скрипт, и приостановить загрузку рабочего стола до окончания всего скрипта. Этого результата добиваются с помощью групповой политики, распространяющейся на домен («Default Domain Controllers Policy»).

В разделе групповой политики «User Configuration» необходимо соответственно включить «Run legacy logon script synhronously» (запускать сценарий загрузки синхронно) и «Run legasy script hidden» (запускать сценарий скрыто). Для этого необходимо проделать следующее:

  • Зарегистрироваться на сервере с помощью учетной записи, имеющей административные права.
  • Загрузить в Active Directory Users and Computers («Start –> Programs –> Administrative Tools») и войти в свойства контроллера домена.

 Рисунок 8

Рисунок 8

  • Перейти во вкладку вкладку «Group Policy» и загрузить «Default Dоmain Policy».

Рисунок 9

Рисунок 9

  • В загруженной групповой политике (Default Domain Policy) необходимо в «User Configuration» (настройках пользователя) войти в «Administrative Templates» (административные шаблоны). Там выбрать раздел «System» (система), вкладку «logon/logoff» (войти/выйти) и включить раннее оговоренные политики.

Рисунок 10

Рисунок 10

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

Листинг скрипта и всех вспомогательных подпрограмм приведен на сайте журнала http://www.samag.ru/source.

Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru