Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Автоматизация администрирования. Скрипты на KIX

Автор: AlexSSS
Дата сообщения: 26.04.2005 22:09
На форуме есть совершенно замечательная ветка "Автоматизация администрирования"
http://forum.ru-board.com/topic.cgi?forum=8&topic=1908#1

Эта ветка преследует те же цели, что и вышеназванная, но посвящена скриптам на одном конкретном скриптовом языке - KIX Script и всему, что с ним связано.

Почему я решил выделить этот язык в отдельную ветку? Очень просто. Если скрипт пишется на VBScript или JScript, или используются WHS, WMI или ADSI, то готовый код легко перевести c одного скриптового языка на другой. Если же скрипт написан на KIX, то часто этот код может быть совершенно бесполезен тем, кто пишет на других языках. Кроме того, на форуме достаточно часто возникают вопросы по использованию именно этого языка, но, со временем они просто теряются в отдельных ветках.

Итак, что такое KIX Script? Это скриптовой язык, который специально разработан для быстрого и удобного написания логонных скриптов.

quote:
KiXtart is a logon script processor and enhanced batch scripting language for computers running Windows Server 2003, Windows XP, Windows 2000, Windows NT or Windows 9x in a Windows Networking environment.


Это не говорит об том, что его нельзя использовать для других целей, кроме логон скриптов. Можно, однако именно в этом применении он максимально удобен по сравнению с другими языками. В чем именно состоит его удобство:
1. Скрипт не требует инсталляции на клиентских машинах. Достаточно разместить файлы на домен контроллере и, если есть Windows 9X клиенты, запустить на них один сервис. И это вариант будет работать для всех Windows, начиная с 95-го.
2. В самом языке в виде макросов или функций реализованы большинство вещей, которые требуются именно для логон скрипта. Взять имя пользователя или наименование компьютера, используемая ОС или проверка на членство юсера в группах - все это легко решается использованием с помощью одной команды.

Один из аргументов, которые мне приводили против использования этого языка - достаточно малоизвестен, большинство примеров написаны на VBS или JS. Да, это так. Однако большинство примеров, которые приведены на указанных языках, очень просто переводятся на KIX, более того, многие вещи на самом KIX решаются гораздо проще. Что касается использования WHS, WMI или ADSI или другие COM обьектов, то они вообще мало зависят от конкретного языка и их использование практически одинаково на любых языках.

Два основных сайта
http://www.scriptlogic.com/Kixtart/default.asp
http://www.kixtart.org/

На первом сайте на первой же странице можно скачать последний релиз KiXtart 4.23 released: 31-Dec-2004. Если собираетесь использовать KIX или уже используете скачайте оттуда же HTML Help File 4.22.

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

PS. Эта ветка предназначена для скриптов на конкретном языке, KIX-e. Вопросы по другим языкам или общие вопросы по скриптам - просьба в ветку "Автоматизация администрирования"
http://forum.ru-board.com/topic.cgi?forum=8&topic=1908#1
Автор: AlexSSS
Дата сообщения: 27.04.2005 22:00
Немного о логон скриптах.

Логон скрипты применяются для нескольких основных целей
1. Настройка окружения залогиневшегося пользователя. Сюда относится подключение дисков и принтеров, прописывание каких-то путей (напр. персональной папки или каталогов шаблонов MS Office) и т.д.
2. Сбор информации о залогиневшемся пользователе или компьютере, на котором был произведен логон.
3. Прочее. Напр, обновление каких-то файлов или борьба с вирусами и прочими вредоносными программами.

Сейчас я бы хотел поподробнее остановиться на втором пункте, возможности вести различные логи. Сразу оговорюсь, если у вас в домене все клиенты Windows XP, то многое из нижеописанного можно собирать с этих компов дистанционно, когда эти компьютеры включены, без всяких логонных скриптов. Тем не менее все равно надо использовать либо сторонний софт, либо писать его самому, хотя бы на тех же скриптах.
Какую же информацию можно писать в логи? Да любую, которая необходима и требуется для каких-то дальнейших анализов или действий. Приведу небольшой список того, что, на мой взгляд, стоит сделать в первую очередь.
1. Кто на какой компьютер и когда зашел.
2. Сбор информации об установленном софте и ветках автозапуска.
3. Сбор информации об железе компьтера
4. Запись информации об результате работы скриптов и об окружении пользователя на момент окончания загрузки - какие диски и принтеры подключены, какие пути прописаны, в какие группы входит пользователь и т.п. информацию, которую в первую очередь
смотрите, когда звонит пользователь и жалуется, что что-то не работает.

Куда записывать логи? Самый простой и надежный путь- в текстовые файлы. Кроме того, такие логи легко просмотреть без использования какого-либо специального софта. Если требуется дальнейшая машинная обработка и анализ логов, то их легко перевести в другие форматы, например в базы данных (Access, MS SQL и т.п.).
Можно писать непосредственно в базы, однако это тут надо быть стопроцентно уверенным, что на клиентских компьютерах стоят требуемые драйвера или программы и что лог будет вестись, даже если комп заражен или глючит.

Остановлюсь на записи логов в текстовые файлы, точнее на вопросе, как сделать так, чтобы обычный пользователь (точнее, скрипты под его учетной записью) мог писать логи, но при этом сам не имел информации к записанной им или другими информации. Описываю вариант, который использую сам.
1. На файл сервере на NTFS разделе создается папка Logs.
2. Папка зашаривается (закладка Share) с правами (Permission) полного доступа для всех доменных пользователей.
3. На уровне NTFS (закладка Secure) права назначаются следующим образом:
3.1. Даем полный доступ домен админу, службе ИТ.
3.2. Заходим в Advanced на закладке Security и добавляем права домен юсеров для "This folder and subfolders". Делаем полный доступ, после чего удаляем галки с "Delete Subfolders and Files" и "Delete".
3.3. Заходим в Advanced на закладке Security и добавляем права домен юсеров для "Files only". Делаем полный доступ, после чего удаляем галки с "Traverse Folder/Execute File", "List Folder/Read Data", "Delete Subfolders and Files" и "Delete".
Расстановка прав таким образом позволяет логонным скриптам создавать папки, файлы и записывать в них информацию, но не позволит пользователям что-то удалить или просмотреть результаты работы логов внутри файлов. На всех подпапках эти права будут наследоваться. При необходимости в подпапках можно расширять права, например, позволять скриптам удалять собственные логи. На уровне NTFS можно назначить и более сложные права, при которых скрипты будут работать, но сам пользователь не сможет увидеть даже списка файлов, но IMHO это уже излишне.

Продолжение следует...
Автор: psj
Дата сообщения: 28.04.2005 14:50
А можно с самого начала?
Каким образом запускается KIX Script?
Автор: AlexSSS
Дата сообщения: 28.04.2005 15:08
psj, так я как раз с самого начала и пишу, запуск KIX будет в ближайшем номере ;o)
Автор: vworld
Дата сообщения: 28.04.2005 20:51
AlexSSS
А есть ли готовые скрипты?
Автор: AlexSSS
Дата сообщения: 28.04.2005 21:12
В поставке KIX есть примеры, некоторые из них демонстрируют очень заманчивые возможности. Много готовых скриптов или ссылки на них есть на официальных сайтах, приведенных в первом сообщении.

Я планирую в ближайшиее время опубликовать что-то из своих работающих скриптов, причем постараюсь донести не просто скрипты, а систему, как их использовать. Думаю, что опубликую все скрипты по сбору логов, которые считаю первоочередными (что они делают, написано во втором сообщении).
Автор: AlexSSS
Дата сообщения: 29.04.2005 07:45
Прежде чем размещать скрипты в домене, их обязательно надо проверять и оттестировать минимум на своем компьютере.

Как установить KIX себе на компьютер.
Скачайте с http://www.scriptlogic.com/Kixtart/default.asp последний релиз KIX-а и HTML Help к нему. В поставке есть и другая документация, но работать с этим хелпом гораздо удобнее. Скачанные архивы распакуйте в отдельный каталог. Если вы работаете на Windows XP, то больше ничего не требуется. Если у Вас на компе Windows 9X, то на домен контроллерах требуется запустить дополнительный сервис. Но, пока дело не дошло до установки первых скриптов на сервер, без этого можно обойтись.

В каталоге, куда распаковали KIX, создайте файл _test.bat и в него поместите только одну строку
kix32 samples\kick.kix
Это будет запускать один из примеров, который идет в поставке. Можете посмотреть и другие примеры, предварительно прочитав их описание в самом файле скрипта (файлы *.kix каталога samples)

Продолжение следует...
Автор: Smitis
Дата сообщения: 29.04.2005 11:02
Вот сдесь можно посмотреть примеры от МС:
http://www.microsoft.com/technet/scriptcenter/scripts/kixtart/default.mspx
http://www.microsoft.com/technet/scriptcenter/scripts/kixtart/kixindex.mspx
Автор: AlexSSS
Дата сообщения: 02.05.2005 20:15
Итак, первый скрипт. Это основной скрипт, из которого будут запускаться все остальные.
Скрипт очень простой, защищает себя от выключения пользователем, синхронизирует время с локальным сервером времени и ведет журнал входа в систему. В тексте могут быть какие-то неиспользованные константы - это на будущее

Init.kix
CLS
Small
Break OFF
SetTime "\\LocalTimeServer"

; определение некоторых констант
; Path for log files ("\\server\Logs\")
$PathLog = "c:\temp\"
$PathAddFirm = ""
$CR = Chr(13) + Chr(10)
$TAB = Chr(9)
$PrimaryGroup = @PrimaryGroup
$PathAddFirm = $PrimaryGroup+"\"

; ***********************************************************************
; Print header line
; ***********************************************************************
If @INWIN=1
$HKLM_LanManParm= "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters"
$SrvComment = READVALUE($HKLM_LanManParm, "srvcomment")
else
$HKLM_LanManParm= "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP"
$SrvComment = READVALUE($HKLM_LanManParm, "comment")
endif

$LogHeader = @DATE+" "+@Time
$LogHeader = $LogHeader+$TAB+left(@UserID+" ",13)
$LogHeader = $LogHeader+$TAB+left(@FullName+" ",20)
$LogHeader = $LogHeader+$TAB+left(@PrimaryGroup+" ",13)
$LogHeader = $LogHeader+$TAB+left(@WKSTA+" ",13)
$LogHeader = $LogHeader+$Tab+left(@Address+" ",13)
$LogHeader = $LogHeader+$Tab+left(ENUMIPINFO()+" ",13)
$LogHeader = $LogHeader+$TAB+$SrvComment

? Color W+/B+ $LogHeader $TAB
? Color Y+/N "Init Section ..."

; ***********************************************************************
; Section LOG Logon.log
; ***********************************************************************

$LogFile = $PathLog+"logon.log"
If Exist($LogFile)=0
$LogErr = Open(1,$LogFile,1)
$LogErr = Close(1)
EndIf
$LogErr = Open(1, $LogFile,4)
$LogErr = WriteLine(1, $LogHeader+$CR)
$LogErr = Close(1)

Exit


---------------------------------------------------------------
Скрипт 2
Сбор информации об железе компьютера
Предварительно скачивается программа mvSysInfo с http://idb.newmail.ru/programs.html
программа работает под любой Win операционкой, начиная с Win95. Скрипт легко переделать под использование любой другой программы, собирающей информацию об железе.
mvSysInfo записывается в подкаталог _Admin пути, который вы задали в $PathLog
Вызов этого скрипта записывается в конец предыдущего скрипта перед EXIT
Call "k_hardware.kix"

k_hardware.kix
$SysInfo= $PathLog+"_admin\mvsysinfo.exe"
IF EXIST($SysInfo)=1
$F2=$PathLog+"Hardware\"
IF EXIST($F2)=0 MD $F2 ENDIF

$F2=$PathLog+"Hardware\"+$PathAddFirm
IF EXIST($F2)=0 MD $F2 ENDIF
$F2=$F2+LCASE(@WKSTA)+".log"

IF EXIST($F2)=0
?
? COLOR Y+/N "* Getting computer's information ..."
? " Please wait"
?
COLOR G+/N
$CMD=$SysInfo+" -s"+'"$F2"'
SHELL $CMD
ENDIF
ENDIF

Скрипт проверяет, есть ли каталог Hardware в каталоге $PathLog, если нет, то создает его.
Далее проверяется наличие подкаталога с именем фирмы (группа по умолчанию в AD), если нет, создает его. Ну и в конце, если там отсутствует файл с именем компа, то записывает его с инфой об железе.
Автор: Kokoc
Дата сообщения: 03.05.2005 16:06
Статья, где описывается применение KiX для создания скриптов входа для терминальных серверов. В т.ч. маппинг принтеров, работа с реестром.
Автор: Smitis
Дата сообщения: 03.06.2005 19:12
Что-то подзаглохла тема

Маленький ликбез по кикстарту. Сейчас раскажу, как запихнуть кикстарт-скрипты в... батники (bat, cmd-файлы). Это удобно - легко можно запустить скрипт на машине, где нет ассоциаций с kix-файлами. А с cmd-файлами асоциация есть всегда! Но подходит это только для систем из линейки NT (NT, XP, 2000, 2003 и т.д.) (Вроде в 2000 bat-файлы ассоциированы по умолчанию с command.com, используйте cmd)
Маленькая прелюдия, для более полного понимания. Помещая кикстарт-скрипты в батники, необходимо решить две проблемы:
1. Совместимость двух разных языков - коммандный процессор не должен натыкаться на команды кикстарта и наоборот.
2. Передать имя скрипта кикстарту со всеми параметрами - кикстарт использует другие расширения по умолчанию и не использует для поиска скриптов PATH

Всё это решается путём добавления в начало пакетного файла следующих строчек:

Код:
;@kix32 "%~f0" %*
;@goto :eof
Автор: Klisha
Дата сообщения: 04.06.2005 17:35
Smitis
Можно проще.
В конмандном файле (bat) пишется следующее:

@echo off

%0\..\kix32.exe kik.kix

Это приводит к выполнению скрипта kik.kix. Единстенное условие - kix32.exe должен лежать там же откуда вызывается батник.
Автор: AlexSSS
Дата сообщения: 05.06.2005 11:20
в Win9X и WinXP строки запуска немного отличаются. подробности
http://support.microsoft.com/default.aspx?scid=kb;en-us;318689

переработанный батник для запуска KIX
@ECHO OFF
if (%OS%) == (Windows_NT) kix32.exe script.kix
if NOT (%OS%) == (Windows_NT) %0\..\kix32.exe script.kix
EXIT

Данный вариант гарантировано стабильно работает под любыми версиями Windows. Пока батники запуска не были специально дописаны для XP и батник содержал %0\..\kix32.exe script.kix, такой вариант очень нестабильно работал под XP. На некоторых XP он запускался стабильно, на некоторых стабильно не запускался, где-то запускался время от времени или в зависимости от логиневшегося пользователя.
Автор: Smitis
Дата сообщения: 05.06.2005 13:44
Klisha

Цитата:
Можно проще

Проще, но не лучше, imho. Из-за

Цитата:
kix32.exe должен лежать там же откуда вызывается батник


AlexSSS
Лучше уж на русском http://support.microsoft.com/default.aspx?scid=kb;ru;318689


Цитата:
переработанный батник для запуска KIX

А как воспринимает 9х точку с запятой в начале строки? (нет возможности проверить). Кроме того, EXIT завершит сценарий, поэтому невозможно будет вызывать батник через CALL
Чего уж там говорить - у 9х довольно убогий командный процессор. Повод заменить его на 4DOS, благо он теперь бесплатный.

Добавлено:
Klisha
AlexSSS
Да, и ещё - обратите внимание, что в моём способе НЕ УКАЗЫВАЕТСЯ имя скрипта для kix32 в явном виде. Скрипт кикстарта размещается в том же самом CMD-файле!
Автор: Smitis
Дата сообщения: 06.06.2005 00:21
Продолжим.
Сейчас я раскажу, как из пакетного файла прочитать значение из реестра. И делать это буду через kixtart.
(На самом деле, прочитать значение из реестра можно по разному. Например, экспортировать ветку в файл, используя regedit, а затем обработать файл через find/findstr и команду for. Или обработать вывод команды reg query через for)

Синтаксис вызова:
call $RegQuery var key [val]
где:
$RegQuery - имя пакетного файла (выбирайте любое)
var - переменная среды, которой будет присвоенно значение
key - ключ в реестре, допускаются сокращения типа HKLM, HKU и т.п.
val - читаемое значение, если val не указано, читается дефолтное значение ключа
Если key или val содержат пробелы, не забывайте заключать их в кавычки.
Если значения в ключе нет, или ключа нет, или какая-либо ошибка - возвращается пустая строка
Работает, есесно, только под NT-like системами. Для 9х тоже может быть вариант, менее изящный, если заинтересует, раскажу как делать. Но у меня под рукой 9х нет, так что проверить не смогу.

Примеры:

Код:
@echo off
call $RegQuery _p_ "HKLM\SOFTWARE\FRISK Software International\F-Prot for Windows" "Program root"
echo ^<%_p_%^>
call $RegQuery _p_ "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion" ProgramFilesDir
echo ^<%_p_%^>
call $RegQuery _p_ "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "My Pictures"
echo ^<%_p_%^>
call $RegQuery _p_ "HKCR\.zip"
echo ^<%_p_%^>
Автор: Klisha
Дата сообщения: 06.06.2005 09:36
Smitis
Просто у меня скрипт используется для logon-скрипта и все лежит в папочке netlogon. Не считаю что наличие exe-шника в этой папке на что - то серьезно влияет.


Цитата:
Да, и ещё - обратите внимание, что в моём способе НЕ УКАЗЫВАЕТСЯ имя скрипта для kix32 в явном виде

А зачем скрывать имя скрипта, если он в принципе доступен весь в этом же bat файле?
Автор: Smitis
Дата сообщения: 06.06.2005 15:24
Klisha

Цитата:
А зачем скрывать имя скрипта, если он в принципе доступен весь в этом же bat файле?

Поясняю - ты запускаешь какой-то CMD, а он перезапускает сам себя как скрипт KIX. Ничего не скрывается, можно подставить имя в явном виде, но удобно поместить несколько универсальных строчек для cmd.exe, которые всё сделают сами. Скрипт можно переименовать, переместить на другое место, но никаких изменений в него вносить не потребуется.

Лирическое отступление. Есть такой скриптовый язык REXX. Наверное, самый первый скриптовый язык программирования. Использовался IBM на своих мейнфреймах. И сейчас используется. IBM выпускала для PC комерческую версию Object REXX, который сейчас стал бесплатным Open Object REXX.
В OS/2, PC-DOS есть у командного прцессора такая фича - встретив в начале пакетника символы /* он передаёт управление языку REXX, который там является по сути расширением командного языка. Подобная фича есть в 4DOS/4NT.
Добавляя же всего две предложенные мною строчки в CMD-файл, мы подобным образом превращаем KIXTART в расширение командного языка NT систем. И, заметьте, без каких либо дополнительных изменений в настройках самой системы. По сути нужен лишь один файл KIX32.EXE в какой-нибудь папке, доступной через переменную PATH.
Автор: Smitis
Дата сообщения: 14.07.2005 01:12
Продолжу тему объединения CMD+KIX в один файл.

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

А сейчас рассмотрим вопрос установки errorlevel из командного файла. Иногда такое бывает необходимо, вызвали командный файл через CALL, он чего-то обработал и в зависимости от результата установил код ошибки.
[more]
Как всегда, решить задачу можно разными способами. Например, используя FIND.EXE можно установить значение 0:

Код:
@echo off
echo bbbbbb | find "bbbbbb" > nul
echo [%errorlevel%]
Автор: VLkin
Дата сообщения: 14.07.2005 07:57
А у меня проблема в том, что пользователи жалуются на более медленное выполнение скриптов KIX по сравнению со старыми на vbscripts. Хотя мне значительно удобнее - не нужно держать разные скрипты для win9x и win2k+. Можно ли заставить их выполняться быстрее?
Автор: Smitis
Дата сообщения: 14.07.2005 20:28
VLkin
В новой версии 4.50rc1 (пока не релиз, но глюков не замечал) можно сохранить скрипт в промежуточном коде (с расширением .kx). Хотя страно, на современных компьютерах и медлено выполняются?
Автор: AlexSSS
Дата сообщения: 14.07.2005 21:07
VLkin
протрассируй скрипт на время выполнения разных частей кода.
Как вариант, поставь вывод времени на экран
; начало скрипта
$Time = @MSecs
; procedure 1
? @MSecs-$Time
$Time = @MSecs
; procedure 2
? @MSecs-$Time
$Time = @MSecs
; procedure 3
? @MSecs-$Time
$Time = @MSecs

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

достаточно большие тормоза дает мапление диска
USE X: \\server\share
а если данный ресурс недоступен, то зависание весьма приличное.

PS. Само собой, эксперименты по засеканию времени надо ставить на себе, а не на всех пользователях ;o)
Автор: kawasaki
Дата сообщения: 28.07.2005 13:51
народ, помогите со скриптом. надо добавить в логон скрипт блок, отвечающий за проверку текущего home page юзера и дальнейшей записью во внешний txt.
10x
Автор: Smitis
Дата сообщения: 29.07.2005 00:10
kawasaki
$hp = ReadValue("HKCU\Software\Microsoft\Internet Explorer\Main","Start Page")
Далеее проверка
open
WriteLine
Автор: kawasaki
Дата сообщения: 29.07.2005 11:52
Smitis
thnx
переменную хп мы ранее объявляем или нет?
Автор: Smitis
Дата сообщения: 29.07.2005 12:31
kawasaki

Цитата:
переменную хп мы ранее объявляем или нет

Заранее переменные можно не объявлять

Код:
break on
$homepage = ReadValue("HKCU\Software\Microsoft\Internet Explorer\Main","Start Page")
$h = FreeFileHandle()
$nul = Open($h, "homepages_list.txt", 5)
$nul = WriteLine($h, $homepage+@CRLF)
Автор: kawasaki
Дата сообщения: 29.07.2005 12:44
Smitis
спасибо огромное

Добавлено:
странная штука. для выполнения скрипта нужен kixtart.kix и сам exe-шник. только при запуске exe-шника вручную или через cmd он пишет данные в файл. а при обычном логоне - нет, хотя скрипт выполняется...
Автор: AlexSSS
Дата сообщения: 29.07.2005 13:48
kawasaki
> а при обычном логоне - нет, хотя скрипт выполняется...
а у пользователя есть права на запись туда, куда тебе надо?
Автор: kawasaki
Дата сообщения: 29.07.2005 15:21
AlexSSS
шара в домене. разрешения read для авторизованных пользователей. там же и скрипт с файлом txt. на него разрешения write. ситуация не изменилась... ((
Автор: AlexSSS
Дата сообщения: 29.07.2005 21:13
kawasaki
> там же и скрипт с файлом txt. на него разрешения write
это на уровне разрешений NTFS
на уровне Share полный доступ пользователем есть?
Автор: Smitis
Дата сообщения: 30.07.2005 21:49
kawasaki

Цитата:
странная штука. для выполнения скрипта нужен kixtart.kix и сам exe-шник

kixtart.kix быдет выполнен, если kix32.exe запущен без параметров (точнее, без указания скрипта), если находится в той же директории, где и kix32. Какое отношение он имеет к твоему выполняемому скрипту?
И ещё, функции open и writeline возвращают код ошибки. У меня в примере он записывается в переменную $nul (за ненадобностью). Посмотри, что эти функции возвращают.

Страницы: 12345

Предыдущая тема: включение DHCP на клиентах через GPO


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.