Требуется обновлять лицензию 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-файлах, лишив нас возможности создавать монструозные и труднопонимаемые батники с вложенными циклами!
Если уж про винду заговорили то пользуйте Enterprise Suit и не морочьте голову.
Централизованое ВСЕ.
При создании символической ссылки файл drweb32_now.key в дирректории “c:\Program Files (x86)\DrWeb\” имеет размер 0 kb и не подхватывается ДвВебом7 как лиц. ключ. Как быть?
да, только что проверил – действительно так больше не работает. дрвеб переработал механизм управления ключами и его теперь так просто не обманешь. стоит попробовать создать жёсткую ссылку:
mklink /h “c:\Program Files (x86)\DrWeb\drweb32_now.key” drweb32_now.key
но я не помню как NTFS отнесётся к замене оригинального файла – разорвёт связь (создав ещё один новый) или заменит его таким образом, что обе ссылки будут вести на новую версию. В никсах однозначно будет поведение по первому сценарию.
Пробовал жесткие и символические ссылки, результат аналогичен. DrWeb блокирует и жесткую и символическую ссылку как свой вн. файл. Спасибо за ответ.