Автоматически централизованно обновлять лицензию DrWeb

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

Ничего сложного в принципе нет, за исключением того, что Dr. Web, как правильный антивирус, следит за своей папкой и не даст положить ничего (в том числе новый ключик) к себе в %programfiles%\DrWeb, пока включена так называемая “самозащита”. Её можно отключить, щёлкнув во иконке DrWeb в трее и введя капчу после нажатия “Отключить Самозащиту”. Но в таком случае скрипт становится бесполезным, т.к. требует участия пользователя.

Решением проблемы явилась возможность использования механизма символических ссылок на NTFS томах по windows 7 командой mklink. Т.е. при установке скрипта один раз следует выполнить команду из папки со скриптом, предварительно отключив самозащиту (пример для 64-битной вин7):

mklink "c:\Program Files (x86)\DrWeb\drweb32_now.key" drweb32_now.key

где drweb32_now.key – некий ключ DrWeb, который находится в папке со скриптом.

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

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

Для работы также потребуется программа curl.

update.bat (скачивает ключ drweb32.key с корпоративного сайта)

@Echo Off
SetLocal EnableExtensions
 
Set KBFile1=drweb32.key
Set KB_Url1=http://mycorporatesite.com/drweb/%KBFile1%
 
CALL :GET_PROXY
CALL :GET_FILE "%KBFile1%" "%KB_Url1%"
 
EXIT
 
:GET_FILE
 <Nul Set /P XYZ=Testing Connection...
 curl -f -s -I "%~2" %$X%|Find " 200 OK" 
 If ErrorLevel 1 Echo ERROR [Not Responding]& Exit /B 1
 
 For /F "Skip=1 Tokens=1* Delims=: " %%i In (
 'curl -f -s -I "%~2" %$X%') Do Set %%i=%%j
 Echo Downloading "%~1"...
 curl -f -# -O "%~2" %$X%
 If Not Exist "%~1" Echo ERROR [Download not starting].& Exit /B 3
 For %%i In ("%~1") Do (
 If %%~zi EQU %Content-Length% Echo File Download Successfully! & call change.bat & Exit /B 0)
 Echo ERROR [Download interrupted abnormally]
Exit /B 4
 
:GET_PROXY
 Set $X=&Set $R=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
 For /F "Tokens=1,3" %%i In ('REG Query "%$R%"^|Find "Proxy"') Do Set %%i=%%j
 If "%ProxyEnable%"=="0x1" Set $X=-x %ProxyServer%
GoTo :EOF

change.bat (сравнивает даты валидности ключей и, если drweb32.key заканчивается позже, чем drweb32_now.key – заменяет его на свежий)

@Echo Off
SetLocal EnableExtensions
 
Set OLD=drweb32_now.key
Set NEW=drweb32.key
Set Key=SubscriptionExpires
rem SubscriptionExpires=2011-03-23 (15:49) UTC
For /F "usebackq delims=" %%i In (`Find /I "%Key%=" %OLD%`) Do Set OLDv=%%i 
For /F "usebackq delims=" %%i In (`Find /I "%Key%=" %NEW%`) Do Set NEWv=%%i 
 
set OLDv=%OLDv:~+20,-13%
set NEWv=%NEWv:~+20,-13%
Echo %OLDv%
Echo %NEWv%
 
for /f "tokens=1,2,3 delims=-" %%j in ("%OLDv%") do (
	set OYear=%%j
	set OMonth=%%k
	set ODay=%%l
 
)
 
for /f "tokens=1,2,3 delims=-" %%j in ("%NEWv%") do (
	set NYear=%%j
	set NMonth=%%k
	set NDay=%%l
 
)
 
if %NYear% GTR %OYear% (
   goto rn
) else ( 
   if %NYear% EQU %OYear% (
      if %NMonth% GTR %OMonth% (
         goto rn
      ) else (
         if %NMonth% EQU %OMonth% (
            if %NDay% GTR %ODay% (
               goto rn
            )
         )
      )
   )
)
exit /B 0
 
:rn
del %OLD% && ren %NEW% %OLD%
exit /B 0

..воспользовавшись трудами Sanja Alone и особенно amel27, а также утилитой curl.

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

4 thoughts on “Автоматически централизованно обновлять лицензию DrWeb

  1. LordMerlin

    Если уж про винду заговорили то пользуйте Enterprise Suit и не морочьте голову.
    Централизованое ВСЕ.

    Reply
  2. Я

    При создании символической ссылки файл drweb32_now.key в дирректории “c:\Program Files (x86)\DrWeb\” имеет размер 0 kb и не подхватывается ДвВебом7 как лиц. ключ. Как быть?

    Reply
    1. anonymous Post author

      да, только что проверил – действительно так больше не работает. дрвеб переработал механизм управления ключами и его теперь так просто не обманешь. стоит попробовать создать жёсткую ссылку:
      mklink /h “c:\Program Files (x86)\DrWeb\drweb32_now.key” drweb32_now.key

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

      Reply
  3. Я

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

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *