— = The GRomR1 Blog = —
My work & My actions & My opinion
Страницы
23 февраля 2013 г.
Скрипты для работы с обновлениями Windows 7/8
[WinUpdate_ru-board.com]
Примечание:
Статья обновлена: 5 февраля 2014. Новая версия — v1.5. Старая — более не актуальна.
Здесь я опишу свою последнюю разработку на C++, она же первая, которая не является типичной задачкой из какого-то учебника, а создавалась с конкретной прикладной целью, для решения определенных поставленных передо мной задач. А именно для работы с обновлениями (скачиванием, установкой, поддержанием в актуальном виде).
В данной теме, постараюсь, описать все нюансы работы с этими программами (еще могу назвать их скриптами, что является одним и тем же, т.е синонимом): что выполняет каждый скрипт; какие вопросы задает, и что они значат; что получается в итоге, и какие промежуточные результаты при этом создаются.
Сразу хочу сказать, что являюсь дилетантом в области программирования, никогда им профессионально не занимался, а всего лишь учусь этому нелегкому делу (где-то около года). Поэтому высмеивать нерациональные мои методы бессмысленно. Но вразумительной критике и замечаниям всегда рад, особенно, если в результате удастся чему-нибудь новому научиться.
Отдельная благодарность ув. TAILORD, за создание списков с обновлениями Windows, и поддержании их в актуальном состоянии. Именно его сообщения являются основными входными данными в моих скриптах. А так же другим участникам форума ru-board.com, в частности данной темы, которые принимали участие в разработке данных скриптов: тестировании и высказывании своих советов и пожеланий.
Вступление закончено. Дальше по плану.
Пакет WinUpdate_ru-board.com_1.5(скачать) состоит из 4 программ:
- getUpdate — получает прямые ссылки на обновления выбранного списка и выбранной разрядности, и если требуется — скачивает их, так же служит для закачки дополнительных программ по прямым ссылкам;
- deleteUpdate — удаляет неактуальные скачанные обновления, которые были заменены Microsoft;
- installUpdate — устанавливает скачанные обновления, исходя из разрядности ОС, на которой запущен
- installUpdateCreateCmd — создает cmd-скрипт для самостоятельной установки требуемых обновлений, разрядность выбирается пользователем
Кроме основных программ пакет содержит:
- каталоги, необходимые для работы скриптов;
- библиотеки Visual C++ 2010 (msvcp100.dll, msvcr100.dll), необходимые для запуска скриптов, если не установлен Microsoft Visual C++ 2010 SP1 Redistributable Package;
- curl.exe — консольная утилита cURL, для загрузки файлов из интернета.
- getLength.exe — собственная утилита, которая получает и возвращает размер файла из ответа сервера.
- start_d.bat — bat-файл, содержащий команды передаваемые cURL и служащий для поддержания требуемых функций по загрузке файлов.
- прочие файлы, которые создаются в процессе работы скрипта.
Пойдем по порядку, с загрузки обновлений.
Этот скрипт обрабатывает списки обновлений. А берет он их отсюда для Windows 7, и отсюда для Windows 8.1. На выходе получаем или скачанные выбранные обновления, или список прямых ссылок для их закачки.
Начну с того как он берет эти списки. Возможны 2 варианта:
1. Автоматически с моего ресурса (из дропбокса). Обновление списков ложится на мои плечи. Обновляю раз в месяц, или по требованию. Если необходимы последние списки — используйте вариант 2.
2. Предварительно самостоятельно сохранив список обновлений (сообщение TAILORD на ru-board (Win7, Win8) в режиме редактирования (Win7, Win8)) в текстовый файл upd_new.txt в каталоге text. Только после этого запускаем getUpdate.
Если upd_new.txt присутствует в каталоге text, то новый список закачан не будет, а будет взят upd_new.txt за основу.
Предварительные действия окончены, переходим к запуску getUpdate.
Примечание: не стал менять скриншоты для новой версии (оставил скрины для v1.4) — смысл ведь не изменился.
Шаг 1. Запускаем скрипт, и в зависимости от способа получения списков видим следующие сообщения:
Вариант 1:
Вариант 2:
Шаг 2. Выбираем какие списки будем качать. В Win7 их 3, в Win8 их 2.
О их назначении. Win7:
Список 1 – Содержит так или иначе обязательные для установки, критические и другие обновления.
Список 2 – Содержит Microsoft .NET Framework 4.5.1, IE11 и их обновления.
Список 3 – Содержит критические и другие обновления, но требующие определенные условия, либо применяется в редких случаях или предоставляет дополнительные возможности, не являющиеся обязательными.
О их назначении. Win8:
Список 1 – Содержит так или иначе обязательные для установки, критические и другие обновления.
Список 2 – Содержит критические и другие обновления, но требующие определенные условия, либо применяется в редких случаях или предоставляет дополнительные возможности, не являющиеся обязательными.
Для Win7 в большинстве случаев достаточно 1 и 2 списка, для Win8 — 1 списка.
«y» — включить этот список в список закачиваемых (любая введенная фраза начинающаяся на «y» будет распознана как положительный ответ).
«n» или все кроме «y» — отрицательный ответ (не включать в список закачиваемых).
При выборе 2 списка в Win7 будет задан вопрос:
Какую локализацию (язык) IE качать («r» — русскую или «e» — английскую)?
(«IE11: RUS or ENG? (r-RUS, e-ENG):»)
Пример выбора 1 и 2 списков, и русской версии IE11:
После корректного выбора разрядности в каталоге text создастся текстовый документ upd_download_links.txt, который содержит прямые ссылки на обновления выбранной разрядности.
Шаг 4. Закачиваем их или нет.
Начну с отрицательного ответа. Введя «n» или все кроме «y» — скрипт успешно завершает свою работу, и вы можете самостоятельно скачать обновления по прямым ссылкам, сохраненных в документе upd_download_links.txt.
Ответив «y» — будет выведено сообщение с предложением проверить и/или откорректировать файл содержащий прямые ссылки на обновления.
1 — Первое число — порядковый номер закачиваемого файла. Второе — всего файлов.
Примечание:
Нумерация своя. С нумерацией на ру-боарде может не совпадать.
2 — Имя скачиваемого файла.
3 — Имя каталога, в который загружается файл.
4 — Процесс закачки данного файла.
5 — Размер скачанного файла (в байтах).
Также после закачки Вы можете увидеть: время потраченное на загрузку файла и среднюю скорость загрузки. Последняя строчка означает, что размер локального файла полностью совпадает с размером файла на сервере и докачка не требуется.
Рассмотрим исключительные ситуации:
1. Если закачиваемый файл уже присутствует в папке и полностью скачан, и файл на сервере не новее локального, то вы можете примерно следующее окно:
Этот скрипт получает списки с замененными обновлениями, которые были заменены Microsoft на другие, и ищет эти неактуальные обновления среди скачанных в каталогах x86_upd, x64_upd, x86x64_upd. Если они присутствуют в этих папках, то с согласия пользователя — будут удалены.
Списки с замененными обновлениями содержатся в «Отчете об изменениях в списках» (Win7, Win8).
Поэтому перед запуском getUpdate , в случае когда уже большинство обновлений было скачано, рекомендуется запустить deleteUpdate и удалить все замененные обновления.
Предварительные действия окончены, переходим к запуску deleteUpdate.
Примечание:
Иногда происходит удаление некоторых актуальных скачанных обновлений (но вы же все равно собираетесь запускать потом getUpdate — так что ничего страшного, я думаю, не случится, несколько лишних мегабайт при нынешних скоростях — пустяки).
Шаг 1. Запускаем скрипт, и после успешного скачивания списка замененных обновлений, выбираем разрядность проверяемых обновлений на актуальность:
Этот скрипт устанавливает обновления, заранее скачанные и находящиеся в папках x86_upd, x64_upd и x86x64_upd. Разрядность устанавливаемых обновлений выбирается исходя из разрядности ОС, на которой запущен данный скрипт.
Установка ведется в скрытом тихом режиме, без участия пользователя. После установки всех обновлений будет предложена перезагрузка ОС, для завершения установки обновлений.
Для установки обновлений не используется сторонних утилит. Все обновления устанавливаются через «Автономный установщик обновлений Windows (Wusa.exe)», который присутствует в стандартной версии Windows. Для установки exe-файлов не являющихся обновлениями используются ключи «/q /norestart».
Обновления устанавливаются в алфавитном порядке (по номеру KB). В число первых были поставлены .NET и IE11, чтобы их обновления не ставились вперед них.
Если в папках с обновлениями находится IE разным версий (ru и en) — будет выведен запрос устанавливаемой версии (при условии, что имена файлов не менялись).
Предварительные действия окончены, переходим к запуску installUpdate.
Примечание:
1. В версии 1.5 оставил только установку IE11 и его обновлений. Так что перед запуском скрипта убедитесь, что каталоги с обновлениями не содержат устаревших версий IE9 и IE10 и их обновлений. И удалите их, если они там есть.
2. Все-таки слишком уж долго ставятся все обновления этим способом по сравнению с получением их через узел WindowsUpdate. Не знаю почему так, но учтите это, если вам дорого ваше время. Это же касается и установку через cmd-скрипт.
Шаг 1. Запускаем скрипт, и немножко подумав соглашаемся с установкой обновлений.
Данная проверка была добавлена на случай непреднамеренного запуска скрипта установки обновлений.
Шаг 3. После установки всех обновлений будет предложено перезагрузить компьютер для завершения установки. Лучше согласиться, иначе перезагружаемся самостоятельно.
После перезагрузки можете начинать работать на обновленной системе. Больше действий не требуется.
Чтобы знать какие обновления будут установлены, в каком порядке и как, а также управлять этим процессом — был написан этот скрипт. Он создает cmd-скрипт с именем installUpdate.cmd, который содержит все необходимые команды для установки скачанных обновлений из папок x86_upd, x64_upd и x86x64_upd.
installUpdateCreateCmd не устанавливает обновления и никаких действий над ОС не производит!
Он всего лишь создает cmd-скрипт для их установки. А его вы можете отредактировать по своему усмотрению (выбрать не все обновления, изменить порядок установки, и пр.).
В своей работе он полностью повторяет скрипт installUpdate, за исключением отсутствия автоматической установки обновлений.
Шаг 1. Выбрать разрядность ОС, на которой планируется развернуть скрипт.
Шаг 2. Запустить скрипт и дождаться получения, примерно, следующего сообщения:
Шаг 3. Редактировать полученный cmd-скрипт installUpdate.cmd по своему усмотрению.
При копировании статьи просьба указывать источник и автора.
С уважением, GRomR1.
Автоматизация установки обновлений на клиентскую машину с отсевом ошибочных обновлений
Раз в год выходит обновление ломающее привычную работу. Windows пытается поставить его 3 раза, и если 3 раза был откат то она загружается без установки. Пользователи с утра начинают звонить. Если ничего не предпринять то на следующее утро ситуация повторится.
- На WSUS сервере нет смысла перемещать его в Unapproved т.к. патч уже скачан на клиенскую машину и находится в папке SoftwareDistribution, надо удалять вручную
- глючных патчей может быть много
- через пол годика админ может по запарке его снова одобрить
- если одобряем раз в полгода-год, отсев плохих от хороших займет до 1 дня работы на 1 машину (класс машин)
- обновления одной конфигурации могут не подходить для другой конфигурации даже если ОС одна
- состояние обновления скрытое будет сброшено если удалить SoftwareDistribution
- SoftwareDistribution надо скидывать если глюкнула база, слишком долго идет поиск, а лучше делать это периодически
Это все неудобно, поэтому админ почти всегда сделает одно и то же — он отключит обновления на проблемной машине. А через годик или два он начнет накатывать обновления и столконется с этой же проблемой.
Т.к. глюк обновлений вызывает аварийный режим, жрет неимоверное количество времени персонала на абсолютно бессмысленную фигню, и с целью преехода к умной инфраструктуре было решено попробовать автоматизировать этот процесс. Попутно был получен скрипт который может установить все обновления на свежеустановленую машину в автоматическом режиме.
Сразу оговорюсь — данный скрипт не умеет ремонтировать систему которая не загружается вообще, он умеет сам ставить обновления, в автоматическом режиме выкидывать обновы вызывающих циклическую перезагрузку, имеет возможность вручную добавить плохие обноления в список и сигнализировать админу о возникших неполадках с установкой.
Как это все запустить, быстрый старт
2. Выставье параметры оповещения о ошибках обновлений, для этого измените параметры
$ReportMail1 = ‘admin@test.local’ на вашу почту
$SMTPServer = ‘mail.test.local’ на ваш почтовый сервер.
3. скопировать скрипт сброса конфигурации на нужную машину и запустить его. Он создаст каталог с начальными настройками, если каталог есть сбросит их в начальное состояние.
5. создать задание в планировщике с правами SYSTEM на запуск 1 раз в день. Известная проблема — установка обновлений может быть инициирована только под правами SYSTEM. (кстати можете этот способ применять для запуска активаторов и всего что должно работать с наивысшей привелегией)
хорошо себя показала задержка после старта 6 часов
Все, сценарий должен работать.
Первые 3 раза его можно запустить вручную для проверки. Запустите задание из планировщика и проверьте содержимое файла \BadUpdates\log.txt он должен содержать лог работы сценария. Если он пуст проверьте разрешена ли политика исполнения скриптов, доступен ли сервер обновлений, попробуйте вручную поискать обновления.
Если обновлений будет больше чем 45 (можете менять это значение) сценарий будет пытаться устанавливать обновления пачками. При этом первый раз он попытается поставить по 1\3 за раз, если ни одна из 3х пачек обновлений не установится, шаг будет изменен на 1/4, если ниодна из пачек не встанет то алгоритм перейдет на установку по 5. Данный алгоритм родился из жизни, когда встретилось на одной машине 6 неподходящих обновлений равномерно размазаных, при этом устанавливать по одному почти 90 обновлений не вариант (90 дней по одной обновке).
Происходить будет следующее:
1. каждый день WUErrorreporting будет проверять журнал на ошибку 20, если ошибка есть то будет отправлять оповещение на почту с выборкой какое обновление и когда не установилось.
2. каждый день будет происходить сброс папки SoftwareDistribution
3. каждый день скрипт установки обновлений будет проверять наличие обновлений. Если обновления есть то:
4. если их больше чем 45 автомат переключится в состояние быстрых обновлений и «уснет» до перезагрузки
- на следующий день сбросит автомат быстрых обновлений, вычислено сколько обновлений ставить за раз, при первом проходе 1/3, при втором быстром проходе 1/4, при третьем по 5
- каждый день пока работает быстрая установка будет получатся список обновлений из него будут удалены обновления которые пробовали ставить ранее и обновления из списка точно плохих обновлений
- из оставшихся будут выбраны некоторое количество обновлений, они будут отправлены на установку
- обновления отправленные на установку будут записаны в файл BadUpdates\LastInstalledUpdates.txt и будут исключены из списка при следующем проходе
- После завершения быстрого прохода произойдет автоматический переход к установке по одному обновлению за раз
5. если их меньше 45 автомат переключится в режим установки обновлений по одному
6. в режиме установки по одному
- сначала произойдет сброс переменных для установки по одному обновлению
- будет получен список обновлений без тех что пробовали и точно плохих, если обновлений не осталось то не установленные обновления будут добавлены в список точно плохих и потправлены оповещением на почту. Если еще есть то начнется установка
7. После отработки автомат перейдет в состояние ожидания обновлений
Если вам нужно обновить свежеустановленную систему сделайте следующее:
- установите параметр $RebootEnabled = $true, это разрешит сделать перезагрузку сразу же после работы скрипта
- установите триггер срабатывания на 10 минут после запуска системы
- сохраните сценарий и запустите его
- дальше он сам будет пытаться устанавливать обновления и будет сам перезагружать компьютер, создавать отдельного пользователя, или логинится специально для его работы не нужно.
- через определенное время контролируйте его заглядывая в лог файл
- когда он все поставит и перейдет в состояние 9 (ожидание обновлений) установите $RebootEnabled = $false
- отключите триггер если вам больше не нужно обновляться
WUErrorreporting
1. Установите Ваши переменные
Наиболее значимым явлется переменная $DaysBefore — за сколько дней будет сканироваться журнал, по умолчанию 5 дней. Если произошла ошибка установки обновления то вы будете получать административное оповещение 5 дней подряд об одной и тойже ошибке. В принципе нормально, ставить 1 или 2 дня, не имеет смысла, можно пропустить репорт если ктото выходил работать на выходные.
Переменная $SaveLog отвечает за сохранение лога текущего прогона на диск. Полезно, вы можете придти или подключится к клиентской машине и во время работы заглянуть какое обновление не поставилось.
Последние 4 переменные регулируют кому отправлять отчет. Нужно оставить $SendReport = $true если нужно чтобы приходило оповещение на почту, указать email админа $ReportMail1 = ‘admin@test.local’ и на какой сервер слать $SMTPServer = ‘mail.test.local’. Если нужна аутентификация то добавьте ее в 156 строке
2. Принцип работы очень прост
сгружаем только ошибки с ID20 из журнала System
Если ошибки есть то формируем объекты отчета
применяемый CSS стиль заточен под outlook, а он в качестве HTML движка использует Word, что ведет к неполной поддержке стандарта. Если ктонибудь подберет другой красивый стиль который работал бы в Outlook скиньте и мне.
Install-ClientUpdate.ps1
в скрипте реализованы 3 конечных автомата, для простого администратора сценарий будет достаточно сложным для понимания.
выставляем нужные перменные:
$FastInstallLimit выше этого порога будет включатся быстрая установка, меньше этого порога будем ставить обновления по одному.
$RebootEnabled разрешает перезагрузку после каждого прохода скрипта. Применяется если вам нужно обновить машину. Устанавливаете этот параметр в $true, выставляете время запуска 10 минут и оставляете до утра.
Чуть ниже идут настройки почты
Если вам нужно посмотреть есть ли обновления на удаленной или локальной машине используйте следующий код. Можно просто скопипастить в консоль
Общая рекомендация: при первом запуске лучше быть на связи с пользователем, т.к. он пугается долгой установки обновлений и последующего отката.
Также, лучше ему объяснить чтобы он просто отключал компьютер, а не нажимал «обновить и завершить работу» иначе установятся вообще все обновления и логика работы будет нарушена.
Данный сценарий прошел обкатку на win 8.1; 2012R2; win 7 x64