FireStats error processing pending hits: Internal error : no id for referrer http://www.cyberforum.ru/yaproger/thread48473.html

Не легкая халява Java

Как сильно я заблуждался, думая, что не коснется меня чаша сия под названием Java. В одной из бородатых книг прошлого века, я вычитал, что название это появилось благодаря юмору разработчиков, пивших по-черному одноименный сорт кофе. Ничего юморнее в те времена в индустрии софта, наверное, не было. Однако до потомков отцам-основателям было ой как далеко! Уровень юмора современных разработчиков я полностью оценил, пытаясь внедрить бесплатный Java Runtime Environment на каждую клиентскую машину компании.

Что такое развертывание ПО в корпоративной среде? – Это максимальная автоматизация процесса плюс отшибание всего лишнего типа автообновления, назойливых окон с лицензионным соглашением и т.п. И не смотря на весь свист в свое время про огромную пользу технологии Java для организаций, у нынешних разработчиков отлично получается превратить внедрение Java в энтерпрайзе в захватывающее приключение. На протяжении какого-то десятка релизов до актуального на момент написания статьи JavaRE 1.6 update 21 я вдоволь наелся проблем с отключением автообновлений. Авторы, петляя как зайцы, запутывали дублированием и перепрятывали эти настройки и в конфигурационные файлы, и в реестр, то в машинную, то в пользовательскую ветку. Буквально с каждым релизом необходимо было держать ухо востро и воспринимать его как абсолютно новое ПО.

Я честно пытался понять, что происходит в системе и мониторил изменения с помощью regmon.exe, filemon.exe и procmon.exe. В результате меня стало преследовать ощущение, что я не пью столько одноименного кофе, чтобы разобраться в играх разума разработчиков. И не я один, если судить по количеству и качеству постов о внедрении JavaRE на сайте appdeploy.com -  http://www.appdeploy.com/packages/detail.asp?id=38.

Но обо всем по порядку. Начинается все с инсталляционного пакета. При входе на http://www.java.com для установки Java сразу же предлагается большая красная кнопка. Это не то, что надо! При нажатии на нее происходит загрузка и запуск веб-установщика. Дистрибутив автономной установки jre-6u21-windows-i586-s.exe скачивается со страницы http://www.java.com/ru/download/manual.jsp. При его запуске уже на самом первом экрана мастера

java-01 

утилита procexp.exe показывает, что дистрибутив является контейнером, из которого распаковывался MSI-пакет и стартовала его установка с помощью msiexec и команды астрономической длины:

“C:\WINDOWS\system32\msiexec.exe” /i “C:\Documents and Settings\admin\Application Data\Sun\Java\jre1.6.0_21\jre1.6.0_21.msi” TRANSFORMS=”C:\Documents and Settings\admin\Application Data\Sun\Java\jre1.6.0_21\sp1033.MST” PREFERENCEORDER=SP8;SP1;SP4 ED=0 SP2OFF=1 SP3OFF=1 SP5OFF=1 SP6OFF=1 SP7OFF=1 SP9OFF=1 SP10OFF=1 MSDIR=ms5 SPWEB=http://javadl-esd.sun.com/update/1.6.0/sp-1.6.0_21-b07 COUNTRY=RU  METHOD=joff-s 

java-02 

Перейдя в каталог с MSI-файлом, указанный в графе “Command Line”, нужно скопировать в отдельную папку все его содержимое.

java-03 

После чего нажать “Cancel” и прекратить инсталляцию.

Имея на руках MSI-дистрибутив, можно уже планировать развертывание ПО с помощью штатных методов групповой политики, а необходимую донастройку выполнить в Orca, создав отдельный трансформ-файл.

В таблице Property принимаем лицензионное соглашение, отключаем иконку в области системных часов и сбрасываем 3 параметра (чего еще недостаточно), отвечающие за автообновление:

java-04 

В таблице Registry отключаем иконку и продолжаем бороться с автообновлением в соответствии с опытом, изложенным в http://social.technet.microsoft.com/Forums/en-US/configmgrswdist/thread/e1cc1f8b-6513-4d1f-8463-a8d55f424861

java-05 

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

java-06 

Может быть, самый железный метод отключения автообновления описан в Deployment Configuration File and Properties - http://download.oracle.com/javase/6/docs/technotes/guides/deployment/deployment-guide/properties.html. В соответствии с ним создаем пару текстовых конфигурационных файлов загадочного синтаксиса:

deployment.config:

deployment.system.config=file\:C\:/WINDOWS/Sun/Java/Deployment/deployment.properties

deployment.properties:

deployment.javaws.autodownload=NEVER

deployment.javaws.autodownload.locked

Утилитой cabarc.exe из CabSDK пакуем оба файла в CAB-архив Data2.cab:

cabarc.exe N Data2.cab deployment.config deployment.properties

Теперь нужно задать их установку в папку C:\WINDOWS\Sun\Java\Deployment. Для этого в таблице Directory описывается структура каталогов:

java-07 

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

java-08 

Самостоятельно выдумывать ComponentId не требуется, достаточно добавить строку без него, а затем через контекстное меню попросить Orc-у сгенерировать GUID в этом поле:

component-02 

Через таблицу FeatureComponents созданную нами компоненту необходимо связать с устанавливаемыми “фичами”. В великом и могучем этот термин звучит не менее забавно - “возможность”. А по сути он описывает древовидную структуру в интерфейсе инсталлятора, где пользователь для каждого элемента может выбрать “Устанавливать”, “Не устанавливать”, “Установить при первом запуске” и т.п.

java-09 

Сами файлы описываем в таблице File:

java-10 

И в таблицу Media добавляем дополнительный источник, содержащий эти 2 файла:

java-11 

Остался дембельский аккорд – отключение паразитной службы-ускорителя JQS (Java Quick Starter). Связанный с ней исполняемый модуль в числе прочих поддерживает ключ –unregister.

java-12 

Добавляем запуск приложения в таблицу CustomAction:

java-13 

Задаем краткое описание процедуры:

java-14 

Согласно хронометражу установки действие InstallFinalize выполняется в момент времени 6600, сразу после него планируем удаление JQS:

java-15 

Сохраняем трансформ под именем config.mst

Копируем в сетевую папку все файлы дистрибутива (jre1.6.0_21.msi, Data1.cab, gtapi.dll, lzma.dll, sp1033.mst) и добавляем туда же созданные нами Data2.cab и config.mst

В машинной ветке групповой политики назначаем установку MSI-пакета и указываем 2 трансформа: sp1033.mst и config.mst

При апгрейде версии метод развертывания – “Особый”, обновление – “Заменить”.

Готовый трансформ в архиве – config.zip и Data2.zip.

Ссылки:

Домашняя страница Java - http://www.java.com/ru

Deployment Configuration File and Properties - http://download.oracle.com/javase/6/docs/technotes/guides/deployment/deployment-guide/properties.html

Описание службы Java Quick Starter – http://www.java.com/ru/download/help/quickstarter.xml

Java Runtime Environment 1.x на Appdeploy - http://www.appdeploy.com/packages/detail.asp?id=38

Microsoft Cabinet Software Development Kit - http://support.microsoft.com/kb/310618

ISP Redundancy без TMG

Сколько раз на форумах по технологиям Microsoft я видел вопросы о горячем переключении на резервного провайдера при отказе основного интернет-канала. До недавнего времени большинство ответов отсылало к Kerio Winroute или во вселенную Linux. С появлением TMG вопрос легко решается с помощью ISP Redundancy. Дело за малым – вложениями в Windows 2008 R2, собственно сам TMG и такое железо, на котором не будет тоскливо ни операционке, ни файрволу. Но даже при отсутствии бюджета кое-что сделать можно. ISP Load Balancing не обещаю, но получить ISP Failover вполне реально за почти бесплатно. Аппаратная платформа и операционка, в т.ч. клиентская, все же стоят денег, но куда меньших, чем в случае с TMG.

Пусть у нас имеется машина, выполняющая функции роутера для офиса, подключенного к нескольким провайдерам. Абсолютно не важно подключена машина прямо к интернет или через буферную сеть, в которой также находится оборудование, сидящее на каналах ISP, главное что эта машина является шлюзом для остальных хостов офиса. Для проверки живости каналов каждые 10 сек она использует “heartbeat” пинги по особым образом сконфигурированным маршрутам, сразу идущим через соответствующих ISP. В качестве пингуемых “маяков” целесообразно использовать провайдерские шлюзы или DNS-сервера. При отсутствии ответов от “маяков” основного ISP 3 раза подряд маршрутная таблица машины пополняется маршрутом в 0.0.0.0/0, нацеленным на резервный канал с меньшей метрикой, чем у шлюза по умолчанию. При появлении ответов от “маяков” основного ISP этот маршрут удаляется и машина возвращается к передаче трафика через основной канал.

Все описанное реализуется  с помощью дежурящего в системе скрипта monISP.vbs

ip1=”1.1.1.1″

gw1=”172.16.0.1″

 

ip2=”2.2.2.2″

gw2=”172.16.0.254″

 

WScript.echo Date & ” ” & Time & ” ISP monitoring started”

 

set shell=createObject(”WScript.Shell”)

 

cmd=”route.exe add ” & ip1 & ” mask 255.255.255.255 ” & gw1

Ret=shell.run(cmd,0,true)

cmd=”route.exe add ” & ip2 & ” mask 255.255.255.255 ” & gw2

Ret=shell.run(cmd,0,true)

 

Flag=true

cnt=0

 

while true

  if Flag then

     if ping(ip1) then

        cnt=0

     else

        cnt=cnt+1

     end if

 

     if cnt=3 then

        WScript.echo Date & ” ” & Time & ” Primary ISP failed”

     end if

 

     if cnt>=3 then

        if ping(ip2) then

           cmd=”route.exe add 0.0.0.0 mask 0.0.0.0 ” & gw2 & ” metric 10″

           Ret=shell.run(cmd,0,true)

           Flag=false

           WScript.echo Date & ” ” & Time & ” Switch to backup ISP”

        end if

     end if

  else

     if ping(ip1) then

        cmd=”route.exe delete 0.0.0.0 mask 0.0.0.0 ” & gw2

        Ret=shell.run(cmd,0,true)

        Flag=true

        cnt=0

        WScript.echo Date & ” ” & Time & ” Failback to primary ISP”

     end if

  end if

  WScript.sleep 10000

wend

 

function ping(Host)

  Ret=false

  set col=getObject(”winmgmts:{impersonationLevel=impersonate}”).ExecQuery(”select * from Win32_PingStatus where address = ‘” & Host & “‘”)

  for each obj in col

    Ret=(not IsNull(obj.StatusCode) and (obj.StatusCode=0))

    exit for

  next

  ping=Ret

end function

где ip1 и ip2 – те самые пингуемые “маяки” основного и резервного провайдеров, а gw1 и gw2 – шлюзы, через которые наша машина должна пинговать соответствующие “маяки”.

Скрипт можно зашедулить в планировщике задач по расписанию onStart (не забудьте убрать галку о снятии задачи через 72 часа). Однако я предпочитаю более противоударную схему с запуском через планировщик батника, который в свою очередь в бесконечном цикле вызывает менее устойчивый к Runtime взрывам VBS-скрипт, и при аварийном завершении последнего, батник его просто перезапустит. monISP.bat:

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

 

:0

cscript.exe //NoLogo “%DIR0%\monISP.vbs” >> “%DIR0%\monISP.log”

goto :0

Боевые учения с отключением провайдерского оборудования подтвердили жизнеспособность решения. Роутер на Windows успешно переключился при падении оптики основного ISP на Ёту, и вернулся обратно после устранения “аварии”:

isp-1 

Факт возврата на основной канал определяется скачком TTL. В лог при этом заносится информация о произошедшем сбое и его устранении:

08.09.2010 10:41:59 ISP monitoring started

08.09.2010 20:10:56 Primary ISP failed

08.09.2010 20:10:57 Switch to backup ISP

08.09.2010 20:11:07 Failback to primary ISP

Ссылки:

Проверка функции ISP Redundancy в TMG 2010 - http://www.oszone.net/10776/ISP-Redundancy-TMG

PS. Не стоит зацикливаться на Windows, описанный принцип справедлив для любой операционки, “умеющей” TCP/IP.

 

Автоматизация развертывания профилей CMAK

Для облегчения участи и пользователей, и админов в деле настройки VPN-подключений удаленного доступа придуман CMAK. С его помощью ИТ-персонал подготавливает пакеты с правильно настроенными профилями диспетчера подключений, и в дальнейшем занимается рутиной:

  • Распространение пакетов по пользователям
  • Консультирование по установке и выполнению подключения к VPN-серверу

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

  1. Получение сертификата для L2TP/IPSec
  2. Развертывание профиля CMAK и его последующие обновления
  3. Подключение к VPN-серверу при входе в систему

производится автоматически. И если 1-й пункт сводится к штатному конфигурированию AutoEnrollment-а в корпоративном PKI и групповых политиках, то автоматизация 2-го и 3-го пунктов шла более тернистой дорогой.

В статье из базы знаний Microsoft How to Accomplish a Quiet CMAK Profile Installation” - http://support.microsoft.com/kb/265264 говорится о тихой инсталляции пакета CMAK командой profile_name.exe /q:a /c:”cmstp.exe profile_name.inf /i

Однако еще требуется решить вопросы с автоматическим подключением к VPN при входе пользователя в систему и возможностью обновления версии профиля.

Создав пакет vpn2corp.exe, добавляющий в систему подключение с таким же именем,

cmak-1 

я поинтересовался обо всех поддерживаемых им ключах, выполнив vpn2corp.exe /?

cmak-2 

После чего распаковал пакет в папку C:\vpn2corp vpn2corp.exe /C /T:C:\vpn2corp

cmak-3 

и добрался до непосредственно выполняющего установку и настройку сетевого подключения cmstp.exe, который поддерживает массу ключей:

cmak-4 

Это позволило реализовать функционал по установке, удалению уже существующего профиля с таким же именем и созданию в папке автозапуска ярлыка, ссылающегося на dial.bat, с помощью файла Install.bat:

@echo off

 

set PROFILE=corp2vpn

 

%~d0

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

cd “%DIR0%”

 

if exist “%APPDATA%\Microsoft\Network\Connections\Cm\%PROFILE%\%PROFILE%.inf” (

   “%DIR0%\cmstp.exe” /u /s “%APPDATA%\Microsoft\Network\Connections\Cm\%PROFILE%\%PROFILE%.inf”

)

 

“%DIR0%\cmstp.exe” /ni /ns /nf /su /s “%DIR0%\%PROFILE%.inf”

 

wscript.exe //NoLogo “%DIR0%\lnk.vbs” /add “sf:Startup\VPN-подключение к работе” wscript.exe ” //NoLogo ^%%APPDATA%%\Microsoft\Network\Connections\Cm\%PROFILE%\xrun.vbs^ cmd.exe h ! /C ^%%APPDATA%%\Microsoft\Network\Connections\Cm\%PROFILE%\dial.bat^” “%windir%\system32″ “%windir%\system32\netshell.dll,12″

ярлык создается с помощью утилиты lnk.vbs, подробнее описанной в статье - http://icoo.cyberblogger.ru/2010/07/10/upravlenie-yarlykami-iz-skripta.html. Для предотвращения ненужных визуальных эффектов при срабатывании ярлыка в автозагрузке используется не прямой запуск батника, а через дополнительную утилиту-прослойку xrun.vbs, подробнее описанную в статье - http://icoo.cyberblogger.ru/2010/09/11/zapuskalka-prilozhenij-cherez-wmi.html

Сам батник, инициирующий подключение, dial.bat:

@echo off

 

set PROFILE=corp2vpn

set VPNSERVER=vpn.corp.ru

 

%~d0

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

cd “%DIR0%”

 

ping.exe -n 2 %VPNSERVER%

 

if not %ERRORLEVEL%==0 exit

 

rasdial.exe %PROFILE%

 

if not %ERRORLEVEL%==0 (

   start “” rasphone.exe -d %PROFILE% -f “%APPDATA%\Microsoft\Network\Connections\PBK\rasphone.pbk”

   cscript.exe //NoLogo “%DIR0%\ok.vbs”

)

В нем результат (%ERRORLEVEL%) утилиты ping используется для предотвращения попыток подключения к непингуемому из внутренней сети VPN-серверу.

В своих экспериментах я иногда приходил к неработоспособности одного какого-либо из двух методов подключения – через rasdial.exe или rasphone.exe, поэтому батник для надежности использует оба.

Дополнительно выяснилось, что подключение с помощью rasphone.exe не любит автоматического режима и без подтверждающего действия пользователя через 30 секунд разрывает соединение. Для обхода этой неприятности используется скрипт ok.vbs эмулирующий нажатие клавиши ввода, что является подтверждением соединения:

on Error resume next

set shell = CreateObject(”WScript.Shell”)

WScript.sleep(1000)

shell.SendKeys “{ENTER}”, true

Чтобы не мучаться с эскортом к пакету CMAK из 5 вышеперечисленных дополнительных файлов, их можно сразу добавить внутрь профиля CMAK, прогнав мастер по уже существующему vpn2corp

cmak-5 

на соответствующем экране мастера

cmak-6 

А дальше все по накатанной колее создания MSI-пакета обертки в задачу которого входит только распаковка и запуск спрятанного в него содержимого. Обертка создается с помощью MakeMSI (с ним весьма схож Microsoft WIX), о котором подробнее рассказано в статье - http://icoo.cyberblogger.ru/2010/05/23/directx-po-must-have.html

Файл общего описания проекта vpn2corp.ver:

;—————————————————————————-

;

;    MODULE NAME:   VPN2CORP.VER

;

;        $Author:   USER “Alex Polyakov”  $

;      $Revision:   1.0.0  $

;          $Date:   19 Apr 2010

;

;    DESCRIPTION:   Simple sample/test MSI.

;

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; ProductName = vpn2corp

; DESCRIPTION = CMAK Profile for VPN Connection to Corporation Headquarter

; Licence     = license.rtf

; Installed   = WINDOWS_ALL

; MsiName     = vpn2corp

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

 

;############################################################################

VERSION :1.0.0

DATE    : 19 Apr 2010

CHANGES : vpn2corp 1.0.0

Для проекта в MakeMSI обязательно требуется лицензия, которую я по-быстрому сделал, написав в новом документе Freeware и сохранив его как license.rtf

Основной файл vpn2corp.mm:

#include “dept.mmh”

 

;— Invoke the install executable ——————————————

#(

    <$ExeCa

       EXE=”[SystemFolder]cmd.exe”

       Args=^/C mkdir C:\tmp\vpn2corp.tmp^

       SEQ=”InstallFinalize-”

       Type=”immediate Sync AnyRc”

       Condition=”<$CONDITION_INSTALL_ONLY>”

    >

#)

 

#(

    <$ExeCa

       Binary=”CMAKProfile”

       EXE=”vpn2corp.exe”

       Args=^/C /T:C:\tmp\vpn2corp.tmp^

       SEQ=”InstallFinalize-”

       Type=”immediate Sync AnyRc”

       Condition=”<$CONDITION_INSTALL_ONLY>”

    >

#)

 

#(

    <$ExeCa

       EXE=”[SystemFolder]cmd.exe”

       Args=^/C C:\tmp\vpn2corp.tmp\install.bat^

       SEQ=”InstallFinalize-”

       Type=”immediate Sync AnyRc”

       Condition=”<$CONDITION_INSTALL_ONLY>”

    >

#)

 

#(

    <$ExeCa

       EXE=”[SystemFolder]cmd.exe”

       Args=^/C rd /Q /S C:\tmp\vpn2corp.tmp^

       SEQ=”InstallFinalize-”

       Type=”immediate Sync AnyRc”

       Condition=”<$CONDITION_INSTALL_ONLY>”

    >

#)

 

 

#(

    ;— Run on uninstall, ignore return code and wait for completion —

    <$ExeCa

       EXE=”[SystemFolder]cmd.exe”

       Args=^/C for /F “tokens=*” %L in (’cscript.exe //NoLogo “%APPDATA%\Microsoft\Network\Connections\Cm\vpn2corp\lnk.vbs” /find sf:Startup “rx:.*[cw]script.exe” “rx:.+\\vpn2corp\\dial.bat”‘) do del “%~L”^

       SEQ=”RemoveRegistryValues-”

       Type=”immediate Sync AnyRc”

       Condition=”<$CONDITION_UNINSTALL_ONLY>”

    >

#)

 

#(

    ;— Run on uninstall, ignore return code and wait for completion —

    <$ExeCa

       EXE=”[SystemFolder]cmd.exe”

       Args=^/C cmstp.exe /u /s “%APPDATA%\Microsoft\Network\Connections\Cm\vpn2corp\vpn2corp.inf”^

       SEQ=”RemoveRegistryValues-”

       Type=”immediate Sync AnyRc”

       Condition=”<$CONDITION_UNINSTALL_ONLY>”

    >

#)

После компиляции проекта

cmak-7 

Выполняется административная установка получившегося vpn2corp.msi на сетевую папку, а затем его назначение в пользовательской ветке групповой политики с фильтрацией по специальной группе безопасности VPN-пользователей. При обновлении ПО выбирается “Особый” режим и “Заменить”.

SMS для бедных

SMS для бедных” – именно таким термином был обозван корпоративный антивирусный сервер Kaspersky Administration Kit за некоторые нетривиальные возможности. Случилось это в одной из тем официального форума Лаборатории Касперского, в которой топикстартер излагал проблемы установки стороннего ПО с помощью антивирусного сервера - http://forum.kaspersky.com/index.php?showtopic=116258

kavsms-01 

Абсолютно согласен, что Administration Kit создавался не для этих целей, но пренебрегать этим бонусом просто преступно! О чем собственно речь? – Речь о том, что связка Administration Kit-а с установленными на клиентах Агентах Администрирования образуют неплохо управляемую зомби-сеть, не зависящую от членства подконтрольных машин в домене и знания админских учеток и паролей. Это просто клад для распределенных организаций, и за примерами далеко ходить не нужно, взять хотя бы “перепись” машин.

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

Во-первых нужно скачать утилиту checkcfg с официального сайта http://checkcfg.narod.ru/soft/checkcfg.zip, и взять из архива только один файл – checkcfg.exe

kavsms-21 

Скопировать его в папку “C:\Program Files\Checkcfg” и запустить для инициализации настроечного ini-файла, в котором поправляется пара строчек для создания отчета в одной папке с исполняемым файлом и запрета использования MAC-адреса в качестве имени файла (параметры OutputDir и MACaddrToFileName):

[Program]

Program=C:\Program Files\Checkcfg\Checkcfg.exe  v.1.64

Autor=Татуков А.Г. checkcfg@narod.ru [http://checkcfg.narod.ru]

OutputDir=C:\Program Files\Checkcfg\

MapNetDisk=

ClearThisFile=0

DOSFileName=0

MACaddrToFileName=0

NoBadMACaddr=0

MaxNameLength=12

CPUspeedAlarm=0

WindowsCountersAlarms=1

MaxConfigChanges=12

RemoveSharedDirs=0

RunMode=0

Write2EventLog=0

NoKBinSoft=0

DecodeMSKey=1

MaxDisabledUSB=0

[HardDisk]

min_drv=1

max_drv=12

FreeAlarmPercent=10

MaxChangeOfFreeSpace_Mb=100

[Modules]

Windows_Devices=1

Windows_Updates=1

Windows_Soft=1

Current_Config=1

Remote_Access=1

Windows_StartUp=1

Additional=1

Sharing=1

Checkcfg_Log=0

History=0

S.M.A.R.T.=1

Post_Accounts=1

Internet=1

Hardware=1

Но получить отчет это только полдела, его нужно еще передать в штаб-квартиру. Пользоваться можно электронной почтой, но при этом несколько неудобно разгребать ворох приходящей корреспонденции, поэтому я предпочитаю отправку результатов на FTP-сервер компании. К сожалению, входящий в базовую комплектацию консольный клиент ftp.exe не поддерживает пассивного режима передачи, что привлекает внимание встроенного брэндмауэра. Чтобы не смущать пользователя его предупреждениями, для пересылки по FTP используется бесплатная утилита ncftpput.exe из пакета NcFTP Client, работающая в пассивном режиме.

В заключение для автоматизации процедуры тестирования и отправки отчета создается дополнительный файл test.bat

@echo off

 

set USER=user

set PASSWORD=12345

set SERVER=ftp.domain.ru

set FOLDER=checkcfg

 

%~d0

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

cd “%DIR0%”

 

del “%DIR0%\%COMPUTERNAME%”

 

call “%DIR0%\checkcfg.exe” %COMPUTERNAME%

 

call “%DIR0%\ncftpput.exe” -u %USER% -p %PASSWORD% -F %SERVER% %FOLDER% “%DIR0%\%COMPUTERNAME%”

 

del “%DIR0%\%COMPUTERNAME%”

Получившийся набор из 4-х файлов нужно заархивировать вместе с папкой.

kavsms-22 

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

kavsms-23 

Итак, сам набор для тестирования конфигурации машины и ее отправки на сервер готов, но для инсталляции (распаковки архива в C:\Program Files) и закрепления в системе (создание заданий в планировщике для регулярного выполнения процедуры) нужен скрипт Install.bat:

@echo off

 

%~d0

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

cd “%DIR0%”

 

“%DIR0%\CheckCfg-SFX-Arc.exe” x -o”C:\Program Files” -y

 

schtasks.exe /delete /tn CheckCfg-start /f

schtasks.exe /create /tn CheckCfg-start /tr “%%ProgramFiles%%\CheckCfg\TEST.bat” /sc ONSTART /ru System

schtasks.exe /delete /tn CheckCfg-10 /f

schtasks.exe /create /tn CheckCfg-10 /tr “%%ProgramFiles%%\CheckCfg\TEST.bat” /sc DAILY /st 10:00:00 /ru System

 

call “C:\Program Files\CheckCfg\TEST.bat”

Файлы Install.bat и Checkcfg-SFX-Arc.exe помещаются в отдельную папку

kavsms-24 

Теперь пора переходить собственно к “SMS для бедных”.

Сначала в консоли управления Kaspersky Administration Kit добавляем новый инсталляционный пакет

kavsms-31 

Который называем “Checkcfg

kavsms-32 

Затем уведомляем мастер, о том, что создаем пакет для программы, указанной пользователем и жмем кнопку “Выбрать”:

kavsms-33 

Переходим в папку с Checkcfg-SFX-Arc.exe и Install.bat и выбираем батник

kavsms-34 

Ставим галку, обязывающую включить в пакет все файлы из выбранной папки

kavsms-35 

В конце мастер выводит информационное сообщение об успешном создании пакета:

kavsms-36 

Полученный пакет теперь можно средствами Admin Kit-а установить как на конкретные машины, так и на все компьютеры, находящиеся в какой-либо группе антивирусного сервера. В примере показана его установка на машины из группы Wks и вложенной в нее дочерней группы Trial.

Сначала создаем новую групповую задачу

kavsms-41 

Задаем ей имя

kavsms-42 

Указываем тип задачи “Удаленная установка программы”

kavsms-43 

Выбираем созданный чуть ранее инсталляционный пакет Checkcfg

kavsms-44 

Снимаем 2 галки:

  • предотвращающую повторную установку (в данном случае она не повредит)
  • и побуждающую использовать в качестве дистрибутивной точки сетевую папку Windows (в самом начале предполагалось, что речь идет об абы как  распределенной сети, где единой общей шары быть просто не бывает).

kavsms-45 

Никаких учетных записей, от имени которых будет производиться установка, указывать не нужно

kavsms-46 

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

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

kavsms-47 

Раз в 15 минут клиенты подключаются к Admin Kit-у и в т.ч. синхронизируют список задач. Обнаружив созданную нами задачу, они запланируют ее запуск в соответствии с заданным расписанием. Иногда выполнить задачу в указанное время у клиента не получается, т.к. он запросто может:

  • Быть выключеным или не иметь в назначенное по расписанию время связи с Administration Kit-ом, а значит не иметь возможности скачать с него инсталляционный пакет
  • Вообще не знать об этой задаче в связи с длительным периодом работы без подключения к сети.

Однако установленная в расписании галка “Запускать пропущенные задачи” заставит клиента проинсталлировать пакет при первой же возможности.

В итоге в папку C:\Program Files\Checkcfg будет развернут набор программ и в планировщике будут созданы 2 задания для запуска checkcfg при загрузке машины и ежедневно в 10:00 - специально для той техники, которая не перегружается месяцами.

Используя этот механизм, компьютеры можно заставить втихую скачивать с антивирусного сервера все, что угодно, и делать все, что можно заскриптовать в bat/cmd-файлы, лишь бы на них был установлен Агент Администрирования Ксперского, и была бы связь с Kaspersky Administration Kit-ом.

Для написания статьи использованы версии Admin Kit-а и агента - 8.0.2090

PS.

К сожалению, не обошлось без капли дегтя. При старте задачи на клиентской машине на несколько секунд (это время зависит от нагруженности функционалом файла Install.bat) на экране появляется консольное окно, где пораженный пользователь может наблюдать за ходом установки, а не впавший в ступор может резко закрыть окно и сорвать все мероприятие.

kavsms-51 

Выход есть - разделить Install.bat на два файла так, чтобы первый, мгновенно промелькнув на экране, запускал в скрытом окне второй сценарий, производящий все необходимые длительные операции. В качестве дополнительной запускалки очень пригодился описанный подробнее в http://icoo.cyberblogger.ru/2010/09/11/zapuskalka-prilozhenij-cherez-wmi.html  xrun.vbs, умеющий создавать новые процессы в невидимых окнах. Дополнительно его самого можно запустить с помощью GUI-интерпретатора wscript.exe, не страдающего по умолчанию никакими визуальными эффектами.

С учетом этого инсталляционный пакет “по стелс-технологии” создается на Administration Kit-е из 4-х файлов:

  • Install.bat
  • Install-2.bat
  • Checkcfg-SFX-Arc.exe
  • xrun.vbs

Install.bat:

@echo off

 

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

 

wscript.exe //NoLogo “%DIR0%\xrun.vbs” Install-2.bat ch “%DIR0%\!”

Install-2.bat:

@echo off

 

%~d0

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

cd “%DIR0%”

 

wscript.exe //NoLogo “%DIR0%\xrun.vbs” x ahw “%DIR0%\CheckCfg-SFX-Arc.exe” ! -o”C:\Program Files” -y

 

schtasks.exe /delete /tn CheckCfg-start /f

schtasks.exe /create /tn CheckCfg-start /tr “%%ProgramFiles%%\CheckCfg\TEST.bat” /sc ONSTART /ru System

schtasks.exe /delete /tn CheckCfg-10 /f

schtasks.exe /create /tn CheckCfg-10 /tr “%%ProgramFiles%%\CheckCfg\TEST.bat” /sc DAILY /st 10:00:00 /ru System

 

call “C:\Program Files\CheckCfg\TEST.bat”

Ссылки:

Сайт проекта Checkcfg - http://checkcfg.narod.ru

NcFTP Client - http://www.ncftp.com/ncftp

Запускалка приложений через WMI

Много есть стандартных и почти таковых механизмов для удаленного запуска команд:

  • Планировщик задач и связанные с ним schtasks.exe и at.exe
  • Банальный Telnet
  • Гениальный psexec.exe
  • Доведенный до практически полной бесполезности Remote Scripting в WSH
  • PowerShell Remoting
  • WMI и его класс win32_Process

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

Краткая встроенная справка:

xrun-1 

Логика утилиты сводится к перебору параметров, заданных в списке <list>, их подстановке в команду <command_line>, и ее выполнение в соответствии с директивами, указанными без пробелов в UNIX-подобном стиле в <keys>. Подстановка текущего параметра из <list> производится в позицию <command_line> с символом “!”. При необходимости выполнения команды, в которой встречается восклицательный знак, его нужно экранировать, указав его 2 раза подряд - вместо “avast! Antivirus” нужно писать “avast!! Antivirus“.

Ключ “a” запрещает утилите использовать для запуска команды cmd.exe (что делается по умолчанию). Будет предпринята попытка запуска самого приложения, указанного в <command_line>. При этом ключ “c” игнорируется, и возможна некорректная обработка ключа “h” (ntbackup.exe, например, плевать хотел, что его запускают в скрытом окне), а также не все приложения напрямую понимают переменные среды (%COMPUTERNAME%). Обычо при вызове других программ командный процессор cmd.exe выполняет функции “переводчика”, заменяя в передаваемых им параметрах переменные на конкретные значения, и о существовании такой проблемы обычно никто не подозревает. Если “переводчик” cmd.exe не используется, приложение может надеяться только на себя.

Ключ “r” используется для удаленного запуска приложений через WMI и его класс win32_Process. Список <list> при этом обязан являться списком машин. Наличие или отсутствие ключа “h” при этом оказывает эффект только на локальной машине, на удаленной процесс всегда стартует в скрытом окне – это фича реализации данного механизма в WMI. Без ключа “r” утилита для запуска процессов использует метод Run объекта WScript.Shell.

Ключи “b” и “B” применяются для вывода получившихся в результате команд в BAT-файл, имя которого указывается через двоеточие после <keys>. Ключ “B” отличается от “b” тем, что он запускает итоговый батник.

Ключ “c” работает только без “a” и закрывает по окончанию работы программы консольное окно, куда она осуществляла вывод.

Ключ “h” предписывает утилите запускать приложения в невидимом окне. Если, запущенный в скрытом окне процесс сам в свою очередь вызывает дополнительную программу, то соблюдение режима “светомаскировки” целиком на ее совести. (например, вас могут выдать распаковывающиеся SFX-архивы 7-zip)

По умолчанию утлита без каких-либо пауз запускает одну команду за другой пока не исчерпает список <list>. Ключ “w” заставляет утилиту ожидать завершения каждой команды, прежде чем перейти к составлению и запуску следующей.

Несколько примеров использования:

1. То, ради чего все задумывалось - выполнение команды на нескольких удаленных машинах для обновления групповой политики:

cscript xrun.vbs Comp1,Comp2,Comp3 ahr gpupdate.exe

2. Применять утилиту только для удаленного запуска процессов совсем необязательно. Она запросто может работать и локально, являясь неким аналогом команды for из BAT-файлов. Небольшой тест работы сетевого стека:

cscript xrun.vbs 127.0.0.1,%COMPUTERNAME%,yandex.ru aw ping !

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

Рассылка сообщения на компьютеры, перечисленные в файле 1C_Computers.txt:

xrun-2 

cscript xrun.vbs @1C_Computers.txt ah net send ! “Выйдите, пожалуйста, из 1С”

Работающие за этими машинами пользователи получат уведомление:

xrun-3 

4. В списке можно указывать не только компьютеры и параметры команды, но и сами команды. Также в этом примере результирующие команды запускаются не сразу, сначала они записываются в батник test.bat, после чего он выполняется:

cscript xrun.vbs nslookup,ping,tracert B:test.bat ! yandex.ru

xrun-4 

Созданный утилитой BAT-файл:

xrun-5 

Скрипт в архиве - xrun.zip

 

ISA Server Up/Downgrade

При наведении порядка в лицензиях на ПО Microsoft пришлось крепко задуматься о переходе с Enterprise на Standard версию корпоративного брэндмауэра ISA Server, т.е. своего рода Downgrade. Дополнительно хотелось уйти с раритетной 2004-й линейки на что-то более современное. Для TMG не нашлось подходящего железа, поэтому предполагалось мигрировать с ISA Server 2004 Enterprise на ISA Server 2006 Standard – своего рода Upgrade. Про переход с 2004-й версии на 2006-ю Microsoft издал 2 руководства:

Где честно предупредил, что сценарии миграции с Enterprise на Standard и наоборот не поддерживаются:

isamig-1 

isamig-2 

Причем не поддерживаются до такой степени, что между ними нельзя экспортировать-импортировать даже один единственный распоследний вшивый хост (объект Computer из Network Objects):

isamig-3 

Попытка подправить XML-файл экспорта и привести его к виду, пригодному для импорта в ISA 2006 Standard, разбилась об обилие встречающихся в нем малопонятных GUID-ов и шестнадцатеричных блобов. Перспектива вбивания руками всех наработанных за солидный срок эксплуатации настроек просто содрогала. Тогда я подумал о том, что вместе с установкой ISA Server в системе регистрируется большой и страшный COM-объект “FPC.Root”, с помощью которого можно из командной строки рулить файрволом. Значит можно получить конфигурацию рабочего ISA Server 2004 Enterprise, сохранить ее в форме VBS-скриптов, которые затем проиграть на машине со свежеустановленным ISA Server 2006 Standard, а мелочи “доработать напильником” вручную. В процессе тщательного изучения мануала isasdk.chm из ISA 2004 SDK, я чуть не стал инвалидом умственного труда, но на свет появилось несколько инструментов для переноса настроек.

Элементарные “кипичики”, из которых строятся все правила, сохраняются скриптами:

  • getProtocols.vbs
  • getUsers.vbs
  • getContentTypes.vbs
  • getSchedules.vbs
  • getNetworkObjects.vbs

каждый из них относится к соответствующему блоку в Toolbox:

isamig-4 

Имеется пара спецефических моментов:

  • В дополнение к описаниям протоколов getProtocols.vbs скриптует не имеющую никакого графического интерфейса конфигурацию туннелируемых SSL портов, для настройки которых обычно применяется легендарный isa_tpr.js.
  • Информация о Web Listeners не сохраняется в связи с их значительной привязкой к конкретной машине (сертификаты)

Сценарий getNetworkRules.vbs заскриптовывает сетевые правила:

isamig-5 

И последний скрипт getPolicyRules.vbs сохраняет файрвольные правила доступа и публикации сервисов.

Все остальное, включая:

  • Предопределенные присутствующие по умолчанию элементы
  • Enterprise-фишки, которых нет в ISA Standard
  • Системную политику
  • VPN
  • Верифаеры, оповещения и настройки отчетов
  • Все из ветки Configuration за исключением NetworkRules

НЕ СОХРАНЯЕТСЯ в связи с сильной привязкой к конкретной машине либо значительной трудоемкостью написания сценариев, скриптующих еденичные настройки, которые куда быстрее перенести, за несколько тычков мышкой в консоли управления ISA.

На исходной машине с ISA Server 2004 Enterprise нужно выполнить:

cscript.exe //NoLogo getProtocols.vbs > Protocols.vbs

cscript.exe //NoLogo getUsers.vbs > Users.vbs

cscript.exe //NoLogo getContentTypes.vbs > ContentTypes.vbs

cscript.exe //NoLogo getSchedules.vbs > Schedules.vbs

cscript.exe //NoLogo getNetworkObjects.vbs > NetworkObjects.vbs

cscript.exe //NoLogo getNetworkRules.vbs > NetworkRules.vbs

cscript.exe //NoLogo getPolicyRules.vbs > PolicyRules.vbs

Полученные сценарии доставляются на машину со свежеустановленным ISA Server 2006 Standard. Если конфигурация уже “загажена” настройкой, ее надо почистить, удалив определенные вручную элементы и оставив единственное правило файрвола Default Rule. Затем за несколько этапов проводится восстановление конфигурации:

1. Проигрываются скрипты, добавляющие в ISA “кирпичики”, из которых затем будут строиться правила:

cscript.exe //NoLogo Protocols.vbs

cscript.exe //NoLogo Users.vbs

cscript.exe //NoLogo ContentTypes.vbs

cscript.exe //NoLogo Schedules.vbs

cscript.exe //NoLogo NetworkObjects.vbs

При выполнении Protocols.vbs возможно появление сообщений:

isamig-6 

Это связано с тем, что иногда предустановленные протоколы попадают в разряд определенных пользователем на старой машине, но уже присутствуют на новой (они же предустановленные). Основная причина – тюнинг фильтров приложений, ассоциированных с данными протоколами. Скрипт от греха подальше пропускает их настройку, информируя о коллизии и предлагая администратору переконфигурировать их самостоятельно.

2. Запускается сценарий, конфигурирующий сетевые правила.

cscript.exe //NoLogo NetworkRules.vbs

3. Устанавливаются необходимые сертификаты и вручную добавляются Web Listeners.

4. Восстанавливаются файрвольные правила

cscript.exe //NoLogo PolicyRules.vbs

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

Скрипты в архиве - isamig_2004ent_to_2006std.zip

Ссылки:

Microsoft ISA Server 2004 SDK - http://www.microsoft.com/downloads/details.aspx?familyid=5c8121cd-3aff-43d3-bc09-bf3fddd2b9e3&displaylang=en

Скрипт isa_tpr.js - http://www.isatools.org/tools/isa_tpr.js

Kaspersky, коммерческие ключи и пиратская бухта

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

Именно такой вопрос основательно, т.к. ПО требовалось на каждой без исключения рабочей станции, встал при внедрении корпоративного антивируса Касперского. Админы скорбно взирали на полученные объемные ключевые файлы (на сотни инсталляций) и готовились к турне от финской до японской границы. Интеграторы чего-то более разумного не предлагали. Но, как говорится, захочешь жить, сумеешь вертеться, и решение из разряда “овцы целы, а волки сыты” было найдено. Причем для его реализации не требовалось никаких дополнительных средств, все базируется на возможностях антивируса.

Перед изложением решения кратко опишу архитектуру:

В штаб-квартире развернут антивирусный сервер – Kaspersky Admininstration Kit. Это центральный компонент, с которого управляется весь парк инсталляций антивируса, и на который стекаются статистические данные. Общение клиентов с ним осуществляется по шифрованному каналу через tcp-порт 13000, который дополнительно опубликован наружу для связи с мобильными клиентами и офисами, не имеющими VPN-подключений к штаб-квартире.

На каждую рабочую станцию должны быть устанавлены 2 программы: непосредственно сам Антивирус и Агент Адмимнистрирования (Network Agent) – коммуникационный компонент, обеспечивающий взаимодействие антивируса на клиентской машине и антивирусного сервера.

Для написания статьи использованы версии антивируса – 6.0.4.1424, агента - 8.0.2090

Начинается все с подготовки на антивирусном сервере (Kaspersky Administration Kit) специальных дистрибутивов, а именно с добавления нового инсталляционного пакета:

kav-11 

При этом запускается мастер, в котором на этапе ввода имени для нового пакета я указал “KAV for Workstation 6.0.4.1424 MP4 rusTrial” и перешел к выбору приложения:

kav-12 

Здесь выбираем дистрибутив антивируса для рабочих станций, который находится в папке распакованного (например, 7-zip-ом) Administration Kit-а в каталоге “\russian\Packages\KavWks 6.0.4.1424″

kav-13

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

kav-14 

Жмем “Finish” и через контекстное меню вызываем “Свойства” пакета

kav-15 

Где можно произвести некоторое начальное конфигурирование, выбрав нужные модули и задав настройки антивируса через файл Install.cfg. Подробнее об этом написано в статье “Как установить Антивирус с заранее заданными настройками?” - http://support.kaspersky.ru/wks6/install?qid=203917906

kav-16 

Никакого, кстати, лицензионного ключа в пакете пока не содежится:

kav-17 

Затем нужно добавить пакет агента администрирования, воспользовавшись той же ссылкой в консоли управления Admin Kit-а “Добавить инсталляционный пакет”. Новому пакету я дал имя “KAV Agent 8.0.2090”, его дистрибутив на соответствующем этапе мастера выбирается также в папке распакованного Administration Kit-а в каталоге “\russian\Packages\NetAgent 8.0.2090″

kav-21 

После завершения мастера через контекстное меню вызываем “Свойства” пакета агента:

kav-22 

Где указываем адреса и технические параметры подключения к антивирусному серверу:

kav-23 

Теперь пришло время создания дистрибутива для автономной установки через контекстное меню пакета антивируса:

kav-31 

Запускается мастер, на этапе выбора лицензии видно, что к дистрибутиву автоматически цепляется зарегистрированная на Administration Kit-е коммерческая лицензия. Интерфейсных элементов для ее удаления не наблюдается:

kav-32 

Главный фокус всего представления – с этой лицензии нужно снять выделение, щелкнув мышкой чуть ниже ее:

kav-33 

При нажатии “Next” мастер сообщает о нашей несознательности, а мы упорствуем, отвечая “Yes”:

kav-34 

Совместно с антивирусом будем ставить агент администрирования и выбираем созданный чуть ранее пакет агента “KAV Agent 8.0.2090”:

kav-35 

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

kav-36 

В итоге получается один-единственный файл:

kav-37 

Он не содержит коммерческих ключей, а потому его можно безбоязненно предоставить нашим удаленным сотрудникам, например, запаковав в архив и выложив на FTP-сервер вместе с краткой инструкцией и BAT-файлом для полной автоматизации установки install.bat:

@echo off

 

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

 

netsh.exe firewall add portopening tcp 13000 KAV-Update-Agent enable

 

start “” /wait “%DIR0%\setup.exe” /s

Батник открывает в брэндмауэре порт для функционирования агента обновления и использует специальный unattended ключ инсталлятора - /s

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

kav-41 

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

kav-42 

При вызове информации об используемой антивирусом лицензии предупреждается об ее отсутствии:

kav-51 

Для полнофункциональной работы антивируса на первое время нужно, нажав на кнопку “Активировать программу”, выбрать пробную версию:

kav-52 

Процедура завершается удачно при наличии подключения к интернету и связи с серверами Лаборатории Касперского:

kav-53 

Антивирус в течение месяца будет работать без ограничений:

kav-54 

Практически сразу в консоли управления Kaspersky Administration Kit появляется новый компьютер. Убедившись в его принадлежности к парку машин организации, администратор открывает свойства объекта:

kav-61 

И добавляет новую задачу:

kav-62 

Для установки коммерческой лицензии:

kav-63 

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

kav-64 

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

kav-65 

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

kav-71 

В итоге проблема решена – коммерческое ПО установлено руками потенциальных пиратов без компрометации коммерческого ключа.

PS.

Замечен багофич при инсталляции комплексного дистрибутива (антивирус+агент). Первым в систему устанавливается агент, после чего он сразу пытается связаться с Administration Kit-ом. Если в этот момент времени у компьютера имеются проблемы с подключением к интернет, возникает ошибка, препятствующая переходу к этапу установки антивируса. В результате в системе установлен только агент администрирования.

Возможно более “противоударным” решением будет создание 2-х раздельных пакетов автономной установки для агента и антивируса соответственно и их последовательный запуск через батник install.bat

 

Игрушки патриотов

Затеяли патриоты, стоящие на страже корпоративной благонадежности, очередные патриотические игры с основательным пользованием прямого доступа к ИТ-инфраструктуре. Как обычно это делалось:

  • Для повышения качества обслуживания
  • В целях обеспечения вашей же безопасности
  • И по вашим многочисленным просьбам

У них имелось все, что нужно: 

  • Специальная учетная запись администратора домена
  • Дырки в брэндмауэрах
  • Исключения в корпоративном антивирусе для приложения, скажем, win32.exe

Комфорта не прибавляло обычное в такой ситуации положение вещей - за порядок в песочнице отвечаю я, а играть и хулиганить в ней будут ребята не с нашего двора. Естественно я захотел хотя бы выяснить, на что способны их совочки и ведерки, и раскинул сети мониторинга на базе уведомляющих запросов WMI. Поклевка в виде запусков программы win32.exe не заставила себя долго ждать, однако подсечь и вытянуть добычу оказалось не так-то просто. Приложение в лучших традициях вирусного ПО не давало скопировать свой файл, размещенный на диске, и активно защищало загруженный в память исполняемый код. Тогда я подумал: “А не поможет ли служба теневого копирования, с которой тесно сотрудничает ntbackup.exe?” Не ожидал, но помогло! Осталось только поставить на постоянное боевое дежурство наш ассиметричный ответ:

1.       В системе регистрируется WMI-подписчик на события, отслеживающий через класс win32_Process запуск приложения win32.exe.

2.       При возникновении этого события для ntbackup создается временный файл выделения (Selection Script, расширение bks) в Unicode-кодировке (применяется cscript.exe с ключом //U), содержащий полный путь и имя запущенного win32.exe.

3.       Затем запускается ntbackup.exe для резервирования данных по списку, указанному в созданном ранее BKS-файле.

4.       В заключении временные файлы удаляются.

А чтобы патриотам не мозолил глаза подозрительный непонятно зачем болтающийся в системе скрипт, весь функционал засовывается прямо в WMI-репозиторий с помощью команды mofcomp.exe toy.mof

Файл toy.mof:

#pragma namespace (”\\\\.\\root\\subscription”)

 

instance of ActiveScriptEventConsumer as $CONSUMER

{

    Name=”ToyConsumer”;

    KillTimeout=300;

    ScriptingEngine=”vbScript”;

    ScriptText=

      “on error resume next\n”

      “\n”

      “const tmpDir=\”C:\\tmp\”\n”

      “const bakDir=\”\\\\SERVER\\toys$\”\n”

      “\n”

      “set shell = CreateObject(\”WScript.Shell\”)\n”

      “set fso = CreateObject(\”Scripting.FileSystemObject\”)\n”

      “\n”

      “set folder = fso.CreateFolder(tmpDir)\n”

      “\n”

      “set file = fso.CreateTextFile(tmpDir & \”\\echo.vbs\”, true)\n”

      “file.WriteLine(\”WScript.echo \” & chr(34) & TargetEvent.TargetInstance.ExecutablePath & chr(34))\n”

      “file.close\n”

      “\n”

      “cmd=\”cmd.exe /C cscript.exe //NoLogo //U \” & chr(34) & tmpDir & \”\\echo.vbs\” & chr(34) & \” > \” & chr(34) & tmpDir & \”\\ntbackup.bks\” & chr(34)\n”

      “Ret=shell.run(cmd, 0, true)\n”

      “fso.DeleteFile tmpDir & \”\\echo.vbs\”, true\n”

      “\n”

      “cmd=\”ntbackup.exe backup \” & chr(34) & \”@\” & tmpDir & \”\\ntbackup.bks\” & chr(34) & \” /J bak /F \” & chr(34) & bakDir & \”\\bak_%COMPUTERNAME%.bkf\” & chr(34) & \” /M copy /R:yes /RS:no /L:n /V:no /SNAP:on\”\n”

      “Ret=shell.run(cmd, 0, true)\n”

      “fso.DeleteFile tmpDir & \”\\ntbackup.bks\”, true\n”;

};

 

 

instance of __EventFilter as $FILTER

{

    Name=”ToyFilter”;

    Query=”select * from __InstanceCreationEvent within 5 where TargetInstance isa ‘Win32_Process’ and TargetInstance.Name=’win32.exe’”;

    QueryLanguage=”WQL”;

    EventNamespace=”root\\CIMv2″;

};

 

instance of __FilterToConsumerBinding

{

    Consumer = $CONSUMER;

    Filter = $FILTER;

};

Теперь у меня полно игрушек патриотов, которые складываются в папку \\SERVER\toys$, и теперь я сам могу придумывать с ними игры – проверять антивирусами, привлечь к анализу антивирусные компании, мониторить их действия, сниффить сетевой трафик и т.п., но это уже совсем другое приключение…

PS.

Удалить постоянный подписчик на события можно с помощью сценария:

on error resume next

 

set WIM=getObject(”winmgmts:\\.\root\subscription”)

 

set col=WIM.ExecQuery(”references of {__EventFilter.Name=’ToyFilter’}”)

for each obj in col

    obj.Delete_

next

 

set col=WIM.ExecQuery(”references of {NTEventLogEventConsumer.Name=’ToyConsumer’}”)

for each obj in col

    obj.Delete_

next

 

set obj=getObject(”winmgmts:\\.\root\subscription:ActiveScriptEventConsumer=’ToyConsumer’”)

obj.Delete_

 

set obj=getObject(”winmgmts:\\.\root\subscription:__EventFilter=’ToyFilter’”)

obj.Delete_

Установка принтера скриптом

Организовать печать на принтеры можно по нескольким схемам, в т.ч. и их сочетаниями:

  • Много печаталок, подключенных к рабочим станциям
  • С помощью серверов печати (возможно в кластере)
  • Много печаталок, имеющих Ethernet-интерфейс

Специфика моей компании заключается в ее значительной географической распределенности, что в итоге дает несколько десятков офисов, отдельные из которых не входят в корпоративную доменную среду (рабочая группа или SBS-домен). Усугубляется положение слабым присутствием ИТ-персонала на переферии.

В таких условиях меньшим злом оказался 3-й вариант, лишенный недостатков других:

  • использование серверов печати с удовлетворительной доступностью потребовало бы ощутимых вложений в сервера и/или интернет-каналы и VPN-образующее оборудование.
  • подключение печаталок напрямую к рабочим станциям могло вылиться либо в снижение безопасности при включении «Гостя», либо в кошмар по синхронизации учетных записей и паролей для обеспечения управляемого доступа к сетевым принтерам в рабочих группах.

Правда, выбранная модель на этапе инсталляции принтера осложнена по сравнению с альтернативами такими понятиями как «сетевые настройки» и «IP-порты». Для снятия части проблем с конечного пользователя и повышения эффективности работы админов установка принтера на компьютер была автоматизирована с помощью шаблонного BAT-файла, подходящего после соответствующей правки для установки широкого ряда принтеров, оснащенных Ethernet-интерфейсом. Скрипт базируется на возможностях:

В качестве примера приведен скрипт prn_inst_hp-lj-5200.bat, устанавливающий принтер HP LaserJet 5200n, для которого в корпоративном DNS создана A-запись hp-lj-5200.domain.ru:

:: %1 - Host
:: %2 - Driver Type (optional) = PCL | PS (default - PCL)

set CMD=

set SRV=

set SRV2=

if not “%1″==”%COMPUTERNAME%” (

   set CMD=psexec.exe \\%1

   set SRV=/c \\%1

   set SRV2=-s \\%1

)

 

set DNS_NAME=hp-lj-5200.domain.ru

 

set COMMENT=Laser, Black and White, A4/A3

set LOCATION=Saint-Petersburg, Lenina 18, Floor 7, Office 703

 

 

%~d0

set DIR0=%~p0

set DIR0=%~d0%DIR0:~0,-1%

cd “%DIR0%”

 

set HOST=%1

 

set DRV_TYPE=PCL

if “%2″==”PS” set DRV_TYPE=PS

 

 

:: PCL Driver

if “%DRV_TYPE%”==”PCL” (

   set INF_FILE=%DIR0%\DRV\hp-lj-5200\PCL6\hpc520xc.inf

   set DRV_NAME=HP LaserJet 5200 PCL 6

   set PRN_NAME=HP LaserJet 5200 PCL 6 - Lenina 18

)

 

:: PS Driver

if “%DRV_TYPE%”==”PS” (

   set INF_FILE=%DIR0%\DRV\hp-lj-5200\PS\hpc520xd.inf

   set DRV_NAME=HP LaserJet 5200 PS

   set PRN_NAME=HP LaserJet 5200 PS - Lenina 18

)

 

set PRINTER=\\%HOST%\%PRN_NAME%

 

 

%CMD% netsh.exe firewall set opmode mode=DISABLE profile=ALL

 

cscript.exe //NoLogo “%DIR0%\prn_ipport.vbs” %HOST% /add %DNS_NAME% snmp:public:1

rundll32.exe printui.dll,PrintUIEntry /ia %SRV% /m “%DRV_NAME%” /f “%INF_FILE%” /h Intel

cscript.exe //NoLogo “%windir%\system32\prnmngr.vbs” -a -s %HOST% -p “%PRN_NAME%” -m “%DRV_NAME%” -r “IP_%DNS_NAME%”

cscript.exe //NoLogo “%windir%\system32\prncnfg.vbs” %SRV2% -p “%PRN_NAME%” -t -l “%LOCATION%” -m “%COMMENT%”

 

%CMD% netsh.exe firewall set opmode mode=ENABLE profile=ALL

При работе BAT-файл производит следующие элементарные действия:

  1. Отключает брэндмауэр, что иногда требуется для корректной установки драйвера (netsh.exe)
  2. Создает принтерный IP-порт (prn_ipport.vbs)
  3. Устанавливает в ОС принтерный драйвер (printui.dll)
  4. Добавляет в систему принтер, используя только что установленный драйвер и подключая его к созданному IP-порту (prnmngr.vbs)
  5. Заносит в свойства принтера дополнительную информацию о его местонахождении и возможностях (prncnfg.vbs)
  6. Включает брэндмауэр (netsh.exe)

Для адаптации скрипта под другие модели и адреса следует переопределить выделенные жирным шрифтом куски BAT-файла.

В одной папке со скриптом должны располагаться prn_ipport.vbs, psexec.exe для «обработки» удаленной машины и каталог DRV, в котором находятся принтерные драйвера,

Имя драйвера (переменная DRIVER_NAME) нужно высматривать в соответствующем inf-файле в папке с драйвером.

Примеры запуска:

  • Установка на локальной машине - prn_inst_hp-lj-5200.bat %COMPUTERNAME%
  • Установка принтера с PS-драйвером на удаленной машине IVANOV - prn_inst_hp-lj-5200.bat IVANOV PS

При выполнении скрипта на рабочей станции админа пробегает «градусник», информирующий о ходе установки драйвера (этап printui.dll):

prn_inst-01 

 

И после некоторой паузы принтер появляется в целевой системе, местоположение и комментарий также определены:

 

prn_inst-02 

 

PS.

Хочу предостеречь от излишней оптимизации. По идее установку в ОС драйвера и добавление принтера (шаги 3 и 4) можно объединить, отказавшись от использования prnmngr.vbs и обойдясь вызовом только printui.dll с ключом /if. Метод отлично работает, например, с устройствами Konica Minolta, Kyocera Mita, и просто повально завершается ошибкой на продукции HP.

 

 

Развертывание Autodesk Design Review 2011

 

Для технических служб моей компании Autodesk Design Review является одним из просмотрщиков, необходимых для работы с инженерной графикой. Соответственно ИТ-подразделение обязано поддерживать это ПО в актуальном состоянии, что на практике означает автоматизацию развертывания каждой новой выходящей версии. Предлагаемый производителем на момент написания статьи дистрибутив Design Review 2011 скачивается из http://usa.autodesk.com/adsk/servlet/pc/item?siteID=123112&id=10336080, где сразу можно выбрать упакованный в MSI инсталляционный пакет. На данный момент уже есть одно исправление, доступное по адресу - http://usa.autodesk.com/adsk/servlet/ps/dl/index?siteID=123112&id=2334435&linkID=9338138#section1, замечательно, что внутри zip-архива находится MSP-файл.

 

Важную информацию об автоматизации и некоторых настройках можно почерпнуть из официального руководства по установке просмотрщика - http://download.autodesk.com/esd/designreview/2011/adr_install_guide.htm

И как обычно начать с административной установки на сетевую папку. Она, кстати, работает только с использованием особого ключа:

msiexec.exe /a SetupDesignReview2011.msi TARGETDIR=”\\<SERVER>\<Path>”

Затем распаковываем архив (исправление №1) и применяем патч к административной установке:

msiexec.exe /p ADR_2011_Hotfix.msp /a \\<SERVER>\<Path>\SetupDesignReview2011.msi

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

Для отключения проверки обновлений необходимо переопределить следующие свойства:

  • ADR_DONOTSHOWAGAIN=1
  • ADR_NEXT_INITIAL_CHECK=1
  • PREFERENCELOCKED=1

И дополнительно обнулить связанное с обновлением свойство популярное в MSI-пакетах InstallShield:

  • ISCHECKFORPRODUCTUPDATES=0

Далее соглашаемся с лицензией:

  • AgreeToLicense=1

Удаляем ярлык с рабочего стола

  • ADSK_DESKTOPSHORTCUT_1=0

В статье http://blog.jtbworld.com/2007/02/autodesk-new-customer-involvement.html даются советы по отключению назойливого экрана, связанного с программой вовлечения клиентов. И это тоже можно сделать через таблицу Property:

  • MC3_ENABLED=#0

Значение нужно указывать именно с символом решетки, т.к. по какой-то причине прочим переопределенным выше парамтрам повезет впоследствии попасть в реестр (через таблицу Registry) с явным указанием типа (REG_DWORD):

adr2011-1 

а для MC3_ENABLED тип не задан, хотя и должен быть числовым.

adr2011-2

На этом этапе сохраняем трансформ как adr2011.mst и копируем его в сетевую папку с административной установкой.

Дополнительно нужен WMI-фильтр, который обеспечит инсталляцию ПО только на машинах, соответствующих необходимым программным требованиям и имеющих установленные платформы:

  • .NET Framework 3.5 SP1
  • Microsoft Visual C++ 2005 SP1
  • Microsoft Visual C++ 2008 SP1

WMI-фильтр, содержащий несколько WQL-запросов, результаты которых объединяются в итоге по логическому «И» можно определить в Group Policy Management Console

adr2011-3 

Осталось только добавить пакет в машинную ветку GPO

Развертывание: Особый

Трансформ: adr2011.mst

Обновление (при апгрейде ПО на новые версии): Заменить

И в заключении прикрепить к объекту групповой политики WMI-фильтр.

Трансформ в архиве - adr2011.zip