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

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

 

WMI-фильтрация и win32_Product

При автоматизации развертывания ПО групповыми политиками часто встает вопрос соответствия системы требованиям устанавливаемого продукта. Решается он с помощью механизма WMI-фильтрации, учитывающей конкретные особенности каждой машины и появившейся с выходом Windows Server 2003. Нередко устанавливаемое ПО требует наличия в системе других программных платформ: .Net FX, DirectX, Java Runtime Environment и т.п. Для этой задачи существует простое и логичное решение с привлечением WMI-фильтра, опрашивающего класс win32_Product. Но то, что это еще и наихудшее решение, было прочувствовано на собственной шкуре.

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

Для жонглирования конкретными цифрами в качестве примера приведу эксперимент с 3-мя практически холостыми (без настройки) GPO с WMI-фильтрацией, определяющей соответствие компьютеров требованиям для установки OpenProj, Autodesk Design Review 2011 и Autodesk DWG TrueView 2009.

OpenProj – это Java-приложение, и ему нужна Java Runtime Environment. Имя GPO “New Group Policy Object – Java” и соответствующий WQL-запрос для WMI-фильтра:

select * from win32_Product where Name like ‘Java(TM) 6%’

Design Review 2011 требует .Net FX 3.5 sp1, Visual C++ 2005 Redistributable и Visual C++ 2008 Redistributable. Имя GPO “New Group Policy Object – DR” и WQL-запросы:

select * from win32_Product where Name=’Microsoft .NET Framework 3.5 SP1′

select * from win32_Product where Name=’Microsoft Visual C++ 2005 Redistributable’

select * from win32_Product where Name like ‘Microsoft Visual C++ 2008 Redistributable%’

Для DWG TrueView 2009 нужны DirectX не старше сборки от августа 2007 года, .Net FX 3, Visual C++ 2005 Redistributable и msxml6. Имя GPO “New Group Policy Object – TV” и WQL-запросы:

select * from win32_Product where Name like ‘DirectX End-User Runtimes%’ and Version>=’9.24.1400′

select * from win32_Product where Name like ‘Microsoft .NET Framework 3.0%’

select * from win32_Product where Name=’Microsoft Visual C++ 2005 Redistributable’

select * from win32_Product where Name=’MSXML 6.0 Parser’

Про то, как в win32_Product попал DirectX подробно написано в статье - http://icoo.cyberblogger.ru/2010/05/23/directx-po-must-have.html

Включение отладочного логирования на клиентской станции делается через ключ реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon параметром UserEnvDebugLevel = REG_DWORD 0×30002

После перезагрузки станции и впечатляющей паузы на этапе “Применение параметров компьютера” можно переходить к анализу отладочного журнала - %windir%\debug\usermode\UserEnv.log, выдержки из которого я дополнительно несколько подрезал для минимизации вывода:

USERENV(218.540) 13:53:27:508 ProcessGPO: ==============================

USERENV(218.540) 13:53:27:508 ProcessGPO: Searching <cn=…>

USERENV(218.540) 13:53:27:508 ProcessGPO: Machine has access to this GPO.

USERENV(218.540) 13:53:27:508 FilterCheck: Found WMI Filter id of: <…>

USERENV(4a4.580) 13:53:27:649 LibMain: Process Name: C:\WINDOWS\system32\wbem\wmiprvse.exe

USERENV(174.784) 13:53:28:019 LibMain: Process Name: C:\WINDOWS\system32\msiexec.exe

USERENV(218.540) 13:53:45:204 ProcessGPO: GPO passes the filter check.

USERENV(218.540) 13:53:45:204 ProcessGPO: Found functionality version of: 2

USERENV(218.540) 13:53:45:204 ProcessGPO: Found file system path of: <…>

USERENV(218.540) 13:53:45:204 ProcessGPO: Found common name of: <…>

USERENV(218.540) 13:53:45:204 ProcessGPO: Found display name of:<New Group Policy Object - Java>

USERENV(218.540) 13:53:45:204 ProcessGPO: Found machine version of: GPC is 0, GPT is 0

USERENV(218.540) 13:53:45:204 ProcessGPO: Found flags of: 1

USERENV(218.540) 13:53:45:204 ProcessGPO: No client-side extensions for this object.

USERENV(218.540) 13:53:45:204 ProcessGPO: GPO New Group Policy Object - Java doesn’t contain any data since the version number is 0. It will be skipped.

USERENV(218.540) 13:53:45:204 ProcessGPO: ==============================

На выполнение WQL-запроса потрачено 17 сек.

USERENV(218.540) 13:53:45:204 ProcessGPO: ==============================

USERENV(218.540) 13:53:45:204 ProcessGPO: Searching <cn=…>

USERENV(218.540) 13:53:45:204 ProcessGPO: Machine has access to this GPO.

USERENV(218.540) 13:53:45:204 FilterCheck: Found WMI Filter id of: <…>

USERENV(218.540) 13:54:44:229 ProcessGPO: GPO passes the filter check.

USERENV(218.540) 13:54:44:229 ProcessGPO: Found functionality version of: 2

USERENV(218.540) 13:54:44:229 ProcessGPO: Found file system path of: <…>

USERENV(218.540) 13:54:44:229 ProcessGPO: Found common name of: <…>

USERENV(218.540) 13:54:44:229 ProcessGPO: Found display name of: <New Group Policy Object - DR>

USERENV(218.540) 13:54:44:229 ProcessGPO: Found machine version of: GPC is 1, GPT is 1

USERENV(218.540) 13:54:44:229 ProcessGPO: Found flags of: 1

USERENV(218.540) 13:54:44:229 ProcessGPO: Found extensions: […]

USERENV(218.540) 13:54:44:229 ProcessGPO: ==============================

Потрачена 1 мин, что составляет 20 сек на выполнение WQL-запроса.

USERENV(218.540) 13:54:44:229 ProcessGPO: ==============================

USERENV(218.540) 13:54:44:229 ProcessGPO: Searching <cn=…>

USERENV(218.540) 13:54:44:229 ProcessGPO: Machine has access to this GPO.

USERENV(218.540) 13:54:44:229 FilterCheck: Found WMI Filter id of: <…>

USERENV(218.540) 13:55:52:717 ProcessGPO: GPO passes the filter check.

USERENV(218.540) 13:55:52:717 ProcessGPO: Found functionality version of: 2

USERENV(218.540) 13:55:52:717 ProcessGPO: Found file system path of: <…>

USERENV(218.540) 13:55:52:757 ProcessGPO: Found common name of: <…>

USERENV(218.540) 13:55:52:757 ProcessGPO: Found display name of: <New Group Policy Object - TV>

USERENV(218.540) 13:55:52:757 ProcessGPO: Found machine version of: GPC is 1, GPT is 1

USERENV(218.540) 13:55:52:767 ProcessGPO: Found flags of: 1

USERENV(218.540) 13:55:52:767 ProcessGPO: Found extensions: […]

USERENV(218.540) 13:55:52:767 ProcessGPO: ==============================

Потрачено 1 мин 10 сек, что составляет примерно 17 сек на выполнение WQL-запроса.

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

Для “New Group Policy Object – Java”:

select * from CIM_DataFile where Name=’C:\\Program Files\\Java\\jre6\\bin\\java.exe’

Для “New Group Policy Object – DR”:

select * from CIM_Directory where Name=’C:\\windows\\Microsoft.NET\\Framework\\v3.5\\Microsoft .NET Framework 3.5 SP1′

select * from CIM_DataFile where Name=’C:\\Program Files\\Common Files\\Microsoft Shared\\VC\\msdia80.dll’ and (FileSize=625152 or FileSize=641536)

select * from CIM_DataFile where Name=’C:\\Program Files\\Common Files\\Microsoft Shared\\VC\\msdia90.dll’ and (FileSize=669184 or FileSize=670016)

Вилка с размерами файлов в 2-х последних запросах связана с тем, что нужные для Design Review 2011 платформы – “Visual C++ 2005 sp1 Redistributable” и “Visual C++ 2008 sp1 Redistributable” выходили в двух сборках – без и с обновлением безопасности (ATL Security Update)

Для “New Group Policy Object – TV”:

select * from CIM_DataFile where Name=’C:\\Windows\\system32\\d3dx9_39.dll’

select * from CIM_Directory where Name=’C:\\windows\\Microsoft.NET\\Framework\\v3.0′

select * from CIM_DataFile where Name=’C:\\Program Files\\Common Files\\Microsoft Shared\\VC\\msdia80.dll’

select * from CIM_DataFile where Name=’C:\\windows\\system32\\msxml6.dll’

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

USERENV(21c.5c8) 14:42:35:912 ProcessGPO: ==============================

USERENV(21c.5c8) 14:42:35:922 ProcessGPO: Searching <cn=…>

USERENV(21c.5c8) 14:42:35:932 ProcessGPO: Machine has access to this GPO.

USERENV(21c.5c8) 14:42:35:932 FilterCheck: Found WMI Filter id of: <…>

USERENV(21c.5c8) 14:42:36:493 ProcessGPO: GPO passes the filter check.

USERENV(21c.5c8) 14:42:36:493 ProcessGPO: Found functionality version of: 2

USERENV(21c.5c8) 14:42:36:493 ProcessGPO: Found file system path of: <…>

USERENV(21c.5c8) 14:42:36:523 ProcessGPO: Found common name of: <…>

USERENV(21c.5c8) 14:42:36:543 ProcessGPO: Found display name of:<New Group Policy Object - Java>

USERENV(21c.5c8) 14:42:36:553 ProcessGPO: Found machine version of: GPC is 0, GPT is 0

USERENV(21c.5c8) 14:42:36:553 ProcessGPO: Found flags of: 1

USERENV(21c.5c8) 14:42:36:563 ProcessGPO: No client-side extensions for this object.

USERENV(21c.5c8) 14:42:36:563 ProcessGPO: GPO New Group Policy Object - Java doesn’t contain any data since the version number is 0. It will be skipped.

USERENV(21c.5c8) 14:42:36:573 ProcessGPO: ==============================

Проверка выполнена за 0.5 сек.

USERENV(21c.5c8) 14:42:36:573 ProcessGPO: ==============================

USERENV(21c.5c8) 14:42:36:573 ProcessGPO: Searching <cn=…>

USERENV(21c.5c8) 14:42:36:573 ProcessGPO: Machine has access to this GPO.

USERENV(21c.5c8) 14:42:36:573 FilterCheck: Found WMI Filter id of: <…>

USERENV(21c.5c8) 14:42:38:155 ProcessGPO: GPO passes the filter check.

USERENV(21c.5c8) 14:42:38:165 ProcessGPO: Found functionality version of: 2

USERENV(21c.5c8) 14:42:38:165 ProcessGPO: Found file system path of: <…>

USERENV(21c.5c8) 14:42:38:175 ProcessGPO: Found common name of: <…>

USERENV(21c.5c8) 14:42:38:205 ProcessGPO: Found display name of: <New Group Policy Object - DR>

USERENV(21c.5c8) 14:42:38:205 ProcessGPO: Found machine version of: GPC is 1, GPT is 1

USERENV(21c.5c8) 14:42:38:205 ProcessGPO: Found flags of: 1

USERENV(21c.5c8) 14:42:38:215 ProcessGPO: Found extensions: […]

USERENV(21c.5c8) 14:42:38:215 ProcessGPO: ==============================

Проверка выполнена за 1.6 сек.

USERENV(21c.5c8) 14:42:38:215 ProcessGPO: ==============================

USERENV(21c.5c8) 14:42:38:215 ProcessGPO: Searching <cn=…>

USERENV(21c.5c8) 14:42:38:215 ProcessGPO: Machine has access to this GPO.

USERENV(21c.5c8) 14:42:38:225 FilterCheck: Found WMI Filter id of: <…>

USERENV(21c.5c8) 14:42:39:848 ProcessGPO: GPO passes the filter check.

USERENV(21c.5c8) 14:42:39:848 ProcessGPO: Found functionality version of: 2

USERENV(21c.5c8) 14:42:39:848 ProcessGPO: Found file system path of: <…>

USERENV(21c.5c8) 14:42:39:858 ProcessGPO: Found common name of: <…>

USERENV(21c.5c8) 14:42:39:858 ProcessGPO: Found display name of: <New Group Policy Object - TV>

USERENV(21c.5c8) 14:42:39:868 ProcessGPO: Found machine version of: GPC is 1, GPT is 1

USERENV(21c.5c8) 14:42:39:868 ProcessGPO: Found flags of: 1

USERENV(21c.5c8) 14:42:39:868 ProcessGPO: Found extensions: […]

USERENV(21c.5c8) 14:42:39:868 ProcessGPO: ==============================

Проверка выполнена за 1.6 сек.

В результате то, что ранее выполнялось за 2 мин 40 сек, ускорилось 40-кратно и выполняется за 4 сек.

В заключении приведу еще несколько примеров WQL для проверки наличия ПО:

  • 1C:Предприятие 7.7 для SQL - select * from CIM_DataFile where Name=’C:\\Program Files\\1Cv77\\BIN\\1cv7s.exe’
  • Avast! Antivirus - select * from win32_Service where caption=’avast! Antivirus’
  • .Net FX 2.0 - select * from CIM_Directory where Name=’C:\\windows\\Microsoft.NET\\Framework\\v2.0.50727′
  • DameWare - select * from win32_Service where Caption=’DameWare Mini Remote Control’
  • Microsoft Office - select * from CIM_Directory where Name=’C:\\Program Files\\Microsoft Office’
  • Microsoft Office 2003 - select * from CIM_DataFile where Name=’C:\\Program Files\\Microsoft Office\\Office11\\excel.exe’
  • Microsoft Office 2007 – select * from CIM_DataFile where Name=’C:\\Program Files\\Microsoft Office\\Office12\\excel.exe’
  • UltraVNC - select * from win32_Service where Name=’winvnc’ or Name=’uvnc_service’

К сожалению подход не лишен недостатка в связи с тем, что при проверке наличия файлов и папок предполагается, что ОС устанавливалась в папку C:\WINDOWS, а программы в C:\Program Files, а на отдельных машинах это может быть и не так.

Ссылки:

Fixing Group Policy problems by using log files - http://technet.microsoft.com/ru-ru/library/cc775423(WS.10).aspx

How to enable user environment debug logging in retail builds of Windows - http://support.microsoft.com/kb/221833

Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update - http://www.microsoft.com/downloads/details.aspx?familyid=766a6af7-ec73-40ff-b072-9112bab119c2&displaylang=en

Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package ATL Security Update - http://www.microsoft.com/downloads/details.aspx?familyid=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&displaylang=en

    DFS в малых сайтах

    Distributed File System, появившаяся в Windows 2000 и существенно улучшенная в Windows 2003 R2, является весьма впечатляющей технологией, позволяющей убить сразу нескольких зайцев:

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

    Технология базируется на 2 китах:

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

    Оба компонента являются серверными, что несколько ограничивает применения DFS в малых сайтах. Ведь серверное оборудование и операционная система в офисе на десяток машин – недешевое удовольствие, поэтому иногда приходится изобретать велосипед. Например, подача единой дистрибутивной точки корпорации, откуда ПО инсталлируется групповыми политиками, в удаленный сайт позволила бы существенно сократить нагрузку на интернет канал. В среде Windows Server 2008 R2 и Windows 7 этот вопрос решен с помощью технологии Branch Cache, но к сожалению тотальный апгрейд инфраструктуры дорогой и длительный процесс, поэтому для «устаревших» клиентов Windows XP/Vista пришлось выдумывать гибридное дешевое и быстрое решение с применением DFS:

    • В удаленном сайте выбирается для надежности пара машин с клиентской ОС, которые будут выступать в роли серверов, и на них открываются шары.
    • В консоли “DFS Management” эти шары добавляются Target-ами в соответствующие DFS-папки в пространстве имен DFS. dfsrepl-02 
    • В свойствах DFS-папки устанавливается ограничение, запрещающее клиентам подключаться к Target-ам за пределами своего сайта.dfsrepl-11 
    • И, наконец, коли уж нельзя использовать для репликации данных штатный механизм DFSR, нужно решить эту задачу сторонними средствами, например, с помощью утилиты robocopy.exe из Resource Kit, запускаемой по расписанию и реплицирующей данные в одностороннем порядке с сервера в штаб-квартире на рабочую станцию удаленного офиса.

    При развертывании папки в новом сайте для большей экономии трафика/денег сам контент можно на носителе переправить в удаленный офис и скопировать его в соответствующую расщаренную папку, а затем произвести инициирующую репликацию, синхронизирующую штампы времени и дескрипторы безопасности, при этом пересылки самого содержимого файлов не происходит. Реализуется с помощью батника и утилиты robocopy. В приведенном примере секьюрити и штампы времени  сетевых папок inst$ и msi$ синхронизируются с сервера SERVER01 на рабочую станцию STEPANOV:

    set SRC_SRV=SERVER01

    set DST_SERVER=STEPANOV

     

    for %%S in (inst$ msi$) do (

      robocopy.exe \\%SRC_SRV%\%%S \\%DST_SERVER%\%%S /MIR /COPY:ST /ZB /XD DfsrPrivate

    )

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

    @echo off

     

    set SRC_SRV=SERVER01

    set DST_MASTER=STEPANOV

    set DST_SLAVE=VOLODINA

     

    set DIR0=%~p0

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

     

    set LOG=%DIR0%\dfsrepl.log

    set LOG_ALL=%DIR0%\dfsrepl_all.log

     

    setlocal enabledelayedexpansion

     

    echo ——————————————— > “%LOG%”

    echo Syncronization Started %DATE% %TIME% >> “%LOG%”

    echo ——————————————— >> “%LOG%”

     

    call :1 msi

    call :1 inst

     

    type “%LOG%” >> “%LOG_ALL%”

     

    goto :EOF

     

    :1

     

    “%DIR0%\robocopy.exe” \\%SRC_SRV%\%1$ \\%DST_MASTER%\%1$ /MIR /COPYALL /ZB /XD DfsrPrivate /R:2 /LOG+:”%LOG%”

     

    “%DIR0%\robocopy.exe” \\%DST_MASTER%\%1$ \\%DST_SLAVE%\%1$ /MIR /COPYALL /ZB /XD DfsrPrivate /R:2 /LOG+:”%LOG%”

     

    goto :EOF

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

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

    Небольшое дополнение.

    Начиная с Windows XP SP2, Microsoft в целях безопасности дискриминировал клиентские ОС, запретив им подключатться к шаре, находящейся на локальном хосте, через DFS. При попытке это сделать выдается ошибка, но все заработает как нужно, если поправить параметр EnableDfsLoopbackTargets через реестр или групповую политику при использовании специального административного шаблона:

    ; Administrative Template for DFS Configuration

    ; Alex Polyakov

    ; Version 1.2

    ; 2010-05-04

     

    CLASS MACHINE

     

    CATEGORY !!cat_DFS

     

      POLICY !!pol_DfsDnsConfig

      KEYNAME “SYSTEM\CurrentControlSet\Services\Dfs”

          EXPLAIN !!help_DfsDnsConfig

              VALUENAME “DfsDnsConfig”

                  VALUEON NUMERIC 1

                  VALUEOFF NUMERIC 0

      END POLICY

     

      POLICY !!pol_EnableDfsLoopbackTargets

      KEYNAME “SYSTEM\CurrentControlSet\Services\Mup\Parameters”

          EXPLAIN !!help_EnableDfsLoopbackTargets

              VALUENAME “”

                  VALUEON NUMERIC 1

                  VALUEOFF NUMERIC 0

      END POLICY

     

    END CATEGORY

     

    [strings]

    cat_DFS=”DFS Parameters”

    pol_DfsDnsConfig=”Enable fully qualified domain names in DFS”

    help_DfsDnsConfig=”The default behavior of DFS is to use NetBIOS names for all network shares that are configured in the DFS namespace. This makes it possible for clients that support NetBIOS-only name resolution to locate and connect to targets in the DFS namespace. However, clients that do not use NetBIOS do not work in this environment. DFS can operate in a DNS-only environment, where all the computers understand fully qualified names. The DFSDnsConfig registry key must be added to each server that will participate in the DFS namespace for all computers to understand fully qualified names. This registry key should be added to the servers before the DFS namespace is built. This makes it possible for the clients to see fully qualified names when they are referred to other servers as part of the DFS referral process.”

    pol_EnableDfsLoopbackTargets=”Enable access to DFS targets on the local system”

    help_EnableDfsLoopbackTargets=”You might encounter a problem with Windows XP-based PCs trying to connect to a local share via DFS. It’s not a bug but said to be a security feature. In SP2, Microsoft changed the way Windows XP handles loopback connections; this might cause a user to receive a [network path not found] error when trying to access a local share hosted on DFS. Enable this policy to fix problem. After the first reboot, the local user should be able to access the local share via DFS without error message.”

    Политику, отвечающую за подключение к локальной шаре через DFS Enable access to DFS targets on the local system”, нужно включить. Рассмотрение второй политики, описанной в шаблоне, выходит за рамки статьи. Она имеет отношение только к серверам, заставляя их возвращать клиентам ссылки DFS в FQDN-форме, что является необходимым условием при использовании DFS в многодоменной среде.

    dfsrepl-01

    Трудная мишень

    С некоторого времени спаморезку нашей компании стали редко, но регулярно пробивать срамные депеши. Отдельным счастливчикам приходилось получать по 2-3 письма в неделю подобного содержания:

     

    hardspam-01

     

    —————————————————————————–

     

    hardspam-02

     

    ——————————————————————————

     

    hardspam-03

     

    ——————————————————————————-

     

    hardspam-04

     

    ——————————————————————————–

     

    hardspam-05

     

    ——————————————————————————–

     

    hardspam-06

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

    Дополнительное обучение фильтра было похоже на каплю дегтя в бочку с дегтем (где уже около 20 тыс. спам-сообщений) и не сделало никакой погоды. Снижать пороговое значение баллов являлось неприемлемым вариантом из-за возрастания количества положительных ложных срабатываний. Однако и мириться с посланиями, оскорбляющими своим присутствием мониторы офисных десктопов, тоже было нельзя, поэтому решение проблемы было переведено в другую плоскость. – Не может спаморезка, попробуем на самом почтовике!

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

    НАЧАЛО

    [много или 0 строк]

    [символы]![много или 0 символов]!!![много или 0 пробелов][перевод строки]

    [много или 0 строк, состоящих из нескольких или 0 пробелов]

    [URL]

    [много или 0 строк, состоящих из нескольких или 0 пробелов]

    КОНЕЦ

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

    ^(.*\r*\n*)*.*!.*!!!\s*\r*\n*[A-Za-z0-9\./:\-]*.html?[\s\r\n]*$

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

    Для поимки сообщений было создано правило с именем «Catch RegExp Spam». Условие срабатывания – соответствие указанному выше регулярному выражению:

    hardspam-11 

    Далее настраиваются действия, применяемые к сообщению. Во-первых, добавляется дополнительный заголовок «x-hMailServer-Spam» (зачем он нужен, скажу чуть позже)

    hardspam-12 

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

    hardspam-13 

    И, в-третьих, оригинал сообщения удаляется.

    hardspam-14 

    При отработке правила есть один нюанс – второе действие (Forward) создает копию письма и пересылает в ящик, находящийся на этом же почтовом сервере, и копия опять попадает на обработку вызвавшему пересылку правилу, опять пересылается, и цикл, что называется, реккурсивно за-loop-ился. Для предотвращения этой неприятности создается дополнительное правило «STOP Processing x-hMailServer-Spam», критерием срабатывания которого является проверка того самого дополнительно добавленного заголовка «x-hMailServer-Spam»:

    hardspam-21 

    Единственное действие заставляет прервать обработку письма правилами почтового сервера.

    hardspam-22 

    И, естественно, правило, прерывающее обработку сообщения, должно применяться первым:

    hardspam-31 

    Теперь нежелательная почта не проходит, но это всего лишь до следующей удачной мутации спама.

    PS.

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

     

    Переезд почтового сервера и проблемы клиентов

    В число мероприятий по реорганизации почтовой системы в моей компании входили перевод клиентов на другой SMTP/POP3/IMAP-сервер и ограничение небезопасных пользовательских соединений с почтовиком по незащищенным каналам связи. С первой задачей не было бы хлопот при продуманном изначальном дизайне старой инфраструктуры – почтовый сервер на клиентах необходимо было указывать DNS-именем и завести соответствующую запись-алиас (CNAME) в DNS, при переезде почтовика на другой хост достаточно только поправить эту запись на DNS-сервере, на клиентах же никаких изменений не требуется. На деле оказалось, что у значительного количества пользователей почтовик указан реальным DNS-именем сервера (который вот-вот будет выведен из эксплуатации), плюс несколько клиентов, где почтовик задан IP-адресом. В последнем случае невозможно даже использовать преимущества разделенного DNS, и без перенастройки почтовая программа у мобильных пользователей не будет работать одновременно во внутренней и внешней сетях. Т.е. необходимо было искать эффективный способ массового переконфигурирования ПО на машинах пользователей.

    Для решения второй задачи с небезопасными соединениями был выбран комплексный подход:

    1. На граничном файрволе штаб-квартиры, где и располагается почтовый сервер, разрешается входящий защищенный SSL трафик SMTPS (tcp:465), IMAPS (tcp:993), POP3S (tcp:995) и небезопасный SMTP (tcp:25), без которого никак – должны же прочие MTA слать почту для моего домена. Незащищенные POP3 (tcp:110) и IMAP (tcp:143) запрещаются.
    2. Дополнительно блокируется исходящий из других удаленных офисов моей компании SMTP-трафик (tcp:25).
    3. С помощью групповых политик к рабочим станциям пользователей применяются IPSec-политики, запрещающие трафик от рабочей станции к почтовому серверу на tcp-порты 25, 110 и 143.
    4. Почтовые клиенты конфигурируются на использование SSL-соединений к серверу. На примере Outlook:

    outlookcfg-1 

    Здесь также не обойтись без перенастройки программ пользователей.

    Т.к. практически везде использовался Outlook, хранящий все интересующие меня настройки под ключом реестра HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676, проблема была решена назначением в групповых политиках logon-скрипта outlookcfg.vbs:

    ****************************************************************************

    ‘* Script for Outlook Mail Accounts Configuration

    ‘* ver 1.00 2010.04.05

    ‘* Programmed by Polyakov A.N.

    ‘****************************************************************************

    ‘ set mail server      - outlookcfg.vbs <FQDNName_OR_IP>

     

    rem BEGIN

     

    On Error Resume Next

     

    const MyMailDomain = “@corp.domain.ru”

     

    const HKEY_CURRENT_USER = &H80000001

     

    const reg0=”Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676″

     

    ROOT=HKEY_CURRENT_USER

     

    if WScript.Arguments.count=0 then WScript.quit

    srv=WScript.Arguments(0)

     

    set objReg=GetObject(”winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv”)

     

     

    if objReg.enumKey(ROOT, reg0, arr0)=0 then

      for I=0 to UBound(arr0)

        key=reg0 & “\” & arr0(I)

        if objReg.getBinaryValue(ROOT, key, “Email”, V)=0 then

           if InStr(LCase(bin2str(V)), MyMailDomain)>0 then

              if objReg.getBinaryValue(ROOT, key, “IMAP Server”, V)=0 then

                 objReg.setBinaryValue ROOT, key, “IMAP Server”, str2bin(srv)

                 objReg.setDWORDValue ROOT, key, “IMAP Port”, 993

                 objReg.setDWORDValue ROOT, key, “IMAP Use SSL”, 1

              end if

              if objReg.getBinaryValue(ROOT, key, “POP3 Server”, V)=0 then

                 objReg.setBinaryValue ROOT, key, “POP3 Server”, str2bin(srv)

                 objReg.setDWORDValue ROOT, key, “POP3 Port”, 995

                 objReg.setDWORDValue ROOT, key, “POP3 Use SSL”, 1

              end if

              objReg.setBinaryValue ROOT, key, “SMTP Server”, str2bin(srv)

              objReg.setDWORDValue ROOT, key, “SMTP Port”, 465

              objReg.setDWORDValue ROOT, key, “SMTP Secure Connection”, 1

              objReg.setDWORDValue ROOT, key, “SMTP Use SSL”, 1

              objReg.setDWORDValue ROOT, key, “SMTP Use Auth”, 1

              objReg.DeleteValue ROOT, key, “SMTP Auth Method”

           end if

        end if

      next

    end if

     

     

    function bin2str(arrBin)

      Ret=”"

      for J=0 to UBound(arrBin)

        if arrBin(J)>0 then Ret=Ret & chr(arrBin(J))

      next

      bin2str=Ret

    end function

     

     

    function str2bin(S)

      Ret=”"

      L=len(S)

      for J=1 to len(S)

        C=asc(mid(S,J,1))

        if len(Ret)=0 then

           Ret=C

        else

           Ret=Ret & “,” & “00″ & “,” & C

        end if

      next

      Ret=Ret & “,00,00,00″

      str2bin=split(Ret, “,”)

    end function

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

     

    Видео в корпоративной среде и работа над ошибками внедрения

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

    Недолго думая, я стал работать над автоматизацией установки пачки кодеков K-Lite,  выходящих в нескольких бандлах. Из них K-Lite Corporate позиционируется для использования в организациях. Официальный сайт (http://www.codecguide.com/about_kl.htm) сразу обнадежил – «It is extremely easy to make a fully customized unattended installation with the integrated wizard». Но с разбегу найти информацию о том, как это делается, не удалось. Документация и FAQ этот вопрос не освещают, типа – это и так «экстремально легко», и кумекайте дальше сами. Помог официальный форум - http://codecs.freeforums.org/post13710.html#p13710. Из него мне стало известно о специальном мастере, зашитом в дистрибутив, и ключе для его вызова /makeunattended

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

    k-lite-1 

    Пробежавшись по мастеру, я получил свои 2 файла, INI-шник переименовал в install.inf, в батнике посмотрел ключи запуска установщика с файлом ответов, а затем его удадил. Оказалось, что такой же файл ответов можно получить, используя ключ /SAVEINF, штатным способом для установщика InnoSetup, с помощью которого сделан дистрибутив.

    А дальше нужно было делать все абсолютно аналогично описанной мной ранее ситуации с PDFCreator (http://icoo.cyberblogger.ru/2010/07/25/adobe-acrobat-killer.html) – MSI пакет-обертку с батниками для установки и удаления ПО, дистрибутив с файлом ответов, плюс еще несколько сопутствующих файлов. Но я, начитавшись мануалов, в версии K-Lite 5.9.0 «оптимизировал» деинсталляцию кодеков вместе с удалением пакета-обертки. Мануалы утверждали, что для как можно более раннего выполнения CustomAction на этапе деинсталляции их нужно планировать на момент времени LaunchConditions-. Я так и сделал, воткнув в описание пакета-обертки инструкции по запуску uninstall.bat, удаляющего K-Lite кодеки

    #(

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

        <$ExeCa

           EXE=”[SystemFolder]cmd.exe”

           Args=^/C “[INSTALLDIR]uninstall.bat”^

           WorkDir=”INSTALLDIR”

           SEQ=”LaunchConditions-”

           Type=”immediate Sync AnyRc”

           Condition=”<$CONDITION_UNINSTALL_ONLY>”

        >

    #)

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

    k-lite-2 

    Т.е. штатным методом программа не удаляется - приехали! Но лекарство есть. Для убийства подобного неудаляемого ПО, установленного с помощью Windows Installer, Microsoft предлагает пару утилит:

    • MsiZap.exe – консольная программа из Windows Installer SDK.
    • Windows Installer Clean Up – утилита-надстройка с человеческим GUI-лицом над тем же MsiZap.

    Использовать в скрипте можно только консольную MsiZap, работающую исключительно с GUID-ами, поэтому сначала нужно узнать GUID проблемного продукта. Они группируются под ключом реестра HKLM\Software\Microsoft\CurrentVersion\Uninstall, и конкретный легко найти поиском по названию ПО (в данном случае по сигнатуре – K-Lite Codeck Pack 5.9.0 Wrapper)

    k-lite-3  

    Экперименты с MsiZap показали, что иногда удалить продукт с первого прохода не получается (возможно дело в обходе зависимостей «против шерсти»), и для надежности лучше дважды запустить утилиту.

    С учетом этих особенностей был написан Install.bat, устанавливающий K-Lite Codeck Pack 6.2.0 Corporate:

    @echo off

     

    set SETUP=klcodec620c.exe

    set VER0=620

     

    set REG1=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KLiteCodecPack_is1

     

    %~d0

    set DIR0=%~p0

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

    cd “%DIR0%”

     

    setlocal enabledelayedexpansion

     

    for /F “tokens=3″ %%S in (’reg.exe QUERY “%REG1%” /v DisplayVersion’) do set VER=%%S

     

    if not defined VER goto :Install

     

    set VER=#%VER:.=%

    :1

    if %VER:#0=%==%VER% goto :2

    set VER=%VER:#0=#%

    goto :1

    :2

    set /A VER=%VER:#=%

     

    if %VER% GEQ %VER0% goto :EOF

     

     

    :Uninstall

    for /F “tokens=1,2,*” %%A in (’reg.exe QUERY “%REG1%” /v QuietUninstallString ^| find /I “QuietUninstallString”‘) do set USTR=%%C

    for %%S in (%USTR%) do (

     if not defined UNINSTALLER set UNINSTALLER=”%%~S”

    )

     

    taskkill.exe -im iexplore.exe -t -f

    %USTR%

    if defined UNINSTALLER del %UNINSTALLER%

    “%DIR0%\sleep.exe” 10

    taskkill.exe -im iexplore.exe -t -f

     

    ::Uninstall Broken K-Lite Codec Pack 5.9.0 Wrapper

    call “%DIR0%\MsiZap.exe” TW! {021B39A7-B048-4D13-B62B-D6C9BD09A9AF}

    call “%DIR0%\MsiZap.exe” TW! {021B39A7-B048-4D13-B62B-D6C9BD09A9AF}

    rd /Q /S “C:\Program Files\K-Lite Codec Pack 5.9.0 Wrapper”

     

     

    :Install

    “%DIR0%\%SETUP%” /verysilent /norestart /LoadInf=”%DIR0%\install.inf”

    “%DIR0%\sleep.exe” 10

    taskkill.exe -im iexplore.exe -t -f

    Батник на всякий случай ищет установленные на машине K-Lite кодеки и проверяет их версию, если она древнее 6.2.0, то выполняет их деинсталляцию, а также работает над ошибками внедрения версии 5.9.0 с помощью MsiZap. Сама же установка актуальной версии происходит при запуске дистрибутива с ключами /LOADINF=install.inf, /VERYSILENT для подавления отображения интерфейса и /NORESTART для предотвращения перезагрузки. Дополнительно в одной папке с батником для временных приостановок выполнения нужна утилита sleep.exe из Resource Kit. Дело в том, что дистрибутив «страдает» тягой к запуску в процессе работы веб-браузера, и паузы нужны для предоставления IE возможности полностью запуститься прежде чем его прихлопнет taskkill.exe

    Для удаления кодеков K-Lite используется Uninstall.bat:

    @echo off

     

    set REG1=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KLiteCodecPack_is1

     

    %~d0

    set DIR0=%~p0

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

    cd “%DIR0%”

     

    setlocal enabledelayedexpansion

     

    taskkill.exe -im iexplore.exe -t -f

     

    for /F “tokens=1,2,*” %%A in (’reg.exe QUERY “%REG1%” /v QuietUninstallString ^| find /I “QuietUninstallString”‘) do set USTR=%%C

    for %%S in (%USTR%) do (

     if not defined UNINSTALLER set UNINSTALLER=”%%~S”

    )

     

    taskkill.exe -im iexplore.exe -t -f

    %USTR%

    if defined UNINSTALLER del %UNINSTALLER%

    “%DIR0%\sleep.exe” 10

    taskkill.exe -im iexplore.exe -t –f

    Батник в ключе реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KLiteCodecPack_is1 ищет команду тихой деинсталляции ПО (параметр QuietUninstallString), выполняет ее и решает проблему с назойливым запуском веб-браузера.

    Теперь можно собрать в одной папке все требуемые файлы:

    • Install.bat
    • Uninstall.bat
    • Install.inf
    • License.rtf
    • klcodec620c.exe
    • MsiZap.exe
    • Sleep.exe

    Текст лицензии, под которой выходит пачка кодеков, я нигде не нашел, но для проекта в MakeMSI она требуется, поэтому не придумал ничего умнее, чем написать на чистом листе Freeware и сохранить его как license.rtf

    Файл общего описания MSI-пакета “K-Lite Codec Pack 6.2.0 Wrapper.VER”:

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

    ;

    ;    MODULE NAME:   K-Lite Codec Pack 6.2.0 Wrapper.VER

    ;

    ;        $Author:   USER “Alex Polyakov”  $

    ;      $Revision:   1.0.0  $

    ;          $Date:   28 Jul 2010

    ;

    ;    DESCRIPTION:   Simple sample/test MSI.

    ;

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

    ; ProductName = K-Lite Codec Pack 6.2.0 Wrapper

    ; DESCRIPTION = The K-Lite Codec Pack is a collection of DirectShow filters, VFW/ACM codecs, and tools. Codecs and DirectShow filters are needed for encoding and decoding audio and video formats. The K-Lite Codec Pack is designed as a user-friendly solution for playing all your audio and movie files. With the K-Lite Codec Pack you should be able to play all the popular audio and video formats and even several less common formats.

    ; Licence     = license.rtf

    ; Installed   = WINDOWS_ALL

    ; MsiName     = K-Lite Codec Pack 6.2.0 Wrapper

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

     

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

    VERSION :6.2.0

    DATE    : 14 Jul 2010

    CHANGES : K-Lite Codec Pack 6.2.0

    Основной файл “K-Lite Codec Pack 6.2.0 Wrapper.mm”:

    #include “dept.mmh”

     

    ;Create Install Folder

    <$DirectoryTree Key=”INSTALLDIR” Dir=”C:\Program Files\K-Lite Codec Pack 6.2.0 Wrapper” CHANGE=”\”>

     

    ;Create Files in Install Folder

    <$Files “*.bat” DestDir=”INSTALLDIR”>

    <$Files “*.exe” DestDir=”INSTALLDIR”>

    <$Files “*.inf” DestDir=”INSTALLDIR”>

    <$Files “*.rtf” DestDir=”INSTALLDIR”>

     

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

    #(

        ;— Run after install, ignore return code and wait for completion —

        <$ExeCa

           EXE=”[SystemFolder]cmd.exe”

           Args=^/C “[INSTALLDIR]install.bat”^

           WorkDir=”INSTALLDIR”

           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 “[INSTALLDIR]uninstall.bat”^

           WorkDir=”INSTALLDIR”

           SEQ=”RemoveRegistryValues-”

           Type=”immediate Sync AnyRc”

           Condition=”<$CONDITION_UNINSTALL_ONLY>”

        >

    #)

    Осталось скомпилировать проект

    k-lite-4

    Затем выполнить административную установку полученного MSI-пакета на сетевую папку и назначить его в машинной ветке групповой политики. В случае обновления при появлении новых версий следует выбрать “Заменить”. После инсталляции ПО в апплете “Установка и удалении программ” появится 2 продукта: обертка и собственно сам K-Lite Codec Pack 6.2.0 (Corporate), а «неудаляемый» продукт исчезнет:

    k-lite-5 

    Работу же над ошибками с использованием MsiZap теперь придется делать при установке каждой новой версии ПО до тех пор, пока не будет 100%-ной уверенности, что в хозяйстве не осталось ни одной машины с проблемным продуктом.

    Ссылки:

    K-Lite Codec Pack Corporate - http://www.codecguide.com/download_k-lite_codec_pack_corporate.htm