← на главную
17 заметок с тегом

КЭНК

КЭНК: тихое удаление обновления Windows по номеру KB

Задача: тихо удалить с хоста обновление Windows по номеру KB.

Какое-то время проблема легко решалась через wusa.exe /uninstall /kb:XXXXXX /quiet, но теперь в Windows 10 команда с ключом quiet просто игнорируется, а без ключа — задает много вопросов пользователю, что ожидаемо, но не подходит для решения задачи.

В интернетах быстро гуглится способ, который хорош, но не универсален. Способ рассчитывает на то что KB будет упомянута в имени пакета для DISM, а это бывает не всегда — в примере ниже у двух последних обновлений номера KB в имени пакета нет.

Ситуацию усложняет то, что в разных локалях ОС команда dism выдает информацию на разных языках, да к тому же не структурированным объектом — а строкой. К счастью, из строки все же можно выцепить имя пакета, а по нему — запросить подробную информацию (тоже строкой), где номер KB есть (судя по моим тестам) всегда:

Итоговое решение задачи такое:

  • смотрим список всех установленных обновлений и выдергиваем имена пакетов
  • по каждому пакету смотрим расширенное описание и ищем в нём искомый номер KB
  • если в описании найден нужный номер KB — пакет по его имени отправляется на деинсталляцию через DISM.exe /Online /Remove-Package /PackageName:$sFoundPackageName /quiet /norestart

Короткий сниппет, иллюстрирующий подход:

$sKBNumber = "4578968"
$aUpdts = dism /online /get-packages | ? {$_.Contains("Package_for")} | %{($_.Split(":"))[1].Trim()}
foreach ($sUpdate in $aUpdts) {
	$sInfo = (dism /online /get-packageinfo /packagename:$sUpdate) -join(", ")
	if ($sInfo.Contains($sKBNumber)) {
		write-host "Found package $sUpdate for KB number $sKBNumber"
		# uncomment below to uninstall package
		# DISM.exe /Online /Remove-Package /PackageName:$sUpdate /quiet /norestart
	}
}

КЭНК! Слава роботам!

 Нет комментариев    24   4 мес   PowerShell   WSUS   КЭНК

КЭНК: выгрузка фото из iCloud на Яндекс диск — 2

В прошлой серии велосипедостроения на тему переноса фоток в Яндекс.Диск была успешно решена проблема выгрузки и переименовывания файлов из iCloud в соответствии с датой. Однако, опыт эксплуатации процедуры показал её недостаток: перенесенные таким образом файлы *.heic Ядиском не располагались по альбомам в соответствии с датой, а сваливались в одну кучу дня импортирования.

Пара вечеров была потрачена на анализ и сравнение *.heic файлов, импортированных яндексом с телефона самостоятельно, и обработанных мной вручную. К сожалению, никакого способа поправить теги даты так, чтобы яндекс их воспринял, не нашлось: изменения внесенные exiftool или гуевыми программами типа XnView или FastStone результата не давали. Я заморочился, сравнил файлы преобразованные яндексом и свои, добился полного совпадения полей в выгрузке exiftool — и всё равно роботы яндекса делать красоту отказывались. Поэтому с *.heic файлами придуман обходной путь — конвертировать их в jpeg (те же теги, пробитые в jpeg, срабатывали отлично)

Заодно кстати выяснилось, что яндексу важны метаданные в поле DateTimeOriginal: файлы с корректно заполненными DateCreated но не заполненными DateTimeOriginal он также датировал неправильно.

Так вот, конвертация из heic в jpeg. Тут мне открылся неведомый мир цветовых профилей и прочих тонкостей. Оказалось что эппле пишет heic со своим чудо-профилем, который мало кто понимает и корректно показывает. Все распространённые свободные конверторы в джипег на выходе дают гораздо более бледные и светлые картинки, при этом встроенный просмотрщик macOS эти файлы показывает в исходном красивом цвете, а вот в других программах и на других платформах случается «ой». Перелопачена уйма форумов, нужное колдунство найдено — нужно не просто конвертировать heic в jpeg, но ещё и заменять цветовой профиль, а также корректировать гамму (значение корректировки я подобрал на глаз более-менее похожим, возможно тут будут нюансы на фотках разных насыщенностей)

Вот что выходит с разными конвертациями и (что важно) при разных программах просмотра:

оригинальный heic в Preview macOS, конверченный ImageMagick jpeg без коррекции цвета в Preview macOS, он же в XnView, jpeg с коррекцией цвета в Preview macOS и в XnView

Хорош рассусоливать, что вышло-то?

Итоговая на текущий момент процедура конвертации такова:

  • перегнать все heic в jpeg при помощи ImageMagick, заменяя цветовой профиль на sRGB.icc и цветовое пространство на sRGB и корректируя гамму, стереть оригиналы
  • пробить во все экспортированные файлы (и в том числе в джипеги, конвертированные из heic) метаданные из *.xmp
  • видосикам пробить FileModifyDate из TrackCreateDate и переименовать
  • там где у картинок DateTimeOriginal задан — переименовать файлы в соответствии с датой
  • там где у картинок DateTimeOriginal не задан — пробить его из DateCreated и переименовать файлы в соответствии с датой

Обработанные таким образом медиаматериалы корректно раскладываются яндекс диском в альбомы по времени и геолокации. Косяки и нюансы

  • не раскладываются по датам PNG (у меня это на 100% скриншоты) — ну да от них участия в генерации памятных сторис и прочей красоты не требуется.
  • heic с Live Photos внутри конвертируются в два файла: картинка с дефолтным кадром и микро-mp4 с полной анимацией. Не парит опять же.

В полном соответствии с методологией КЭНК и принципами Hobby-as-Code процедура собрана в shell скрипт, ознакомиться с которым можно на github (уберите от консоли беременных детей и женщин): https://github.com/alexbatishchev/kenk-yadisk-photomaster

КЭНК!
Слава роботам!

КЭНК: выгрузка фото из iCloud на Яндекс диск

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

Например, Инстаграм — попробуйте штатными средствами, положенными по закону, выгрузить свои данные — и через боль и неудобства вы сможете сохранить жалкое подобие архива, а как красиво всё смотрится пока работает. Увели у вас аккаунт, заблокировали по какой-то уважительной для роботов причине — вы абсолютно беззащитны перед произволом обстоятельств и желаниями компании.

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

Что случилось и кто виноват

В мире победившей вычислительной фотографии я уже много лет снимаю на телефон и веду архив фото на телефоне. Это удобно, и всё связанное с повседневным фото завязано у меня на экосистему Apple. Однако, было бы глупо полагаться только на одного вендора, да и вручную выдёргивать фото из Apple для резервной копии не самый удобный вариант, поэтому как только Яндекс запустил фичу автоматической синхронизации фотографий на Яндекс.Диск, я сразу же начал ей пользоваться.

Вышло удобно:

  • фотографирую на телефон или планшет, имею синхронизированные фотки на всех личных устройствах и ноуте (на разных платформах приложение называется по разному, буду дальше использовать термин Айклауд как синоним определения «ну где там у эпплов всё лежит и красиво синхронизируется и показывается на всех девайсах»).
  • Сразу после съемки или по напоминанию отмечаю в Айклауде сердечком лучшие фото и удаляю откровенный брак и шлак, на телефоне остаются материалы лучшие и «пусть просто для архива»
  • Всё это время полное зеркало всех фото и видео с телефона автоматически синхронизируется с папкой Фотокамера в Яндекс диске (а она уже в свою очередь бэкапится как надо на NAS)
  • раз в 2-3 месяца провожу чистку:
  1. захожу в айклауд через приложение на ноуте или телефоне,

2. скрываю все избранные (Library — альбом Favourites — ⌘A — hide items),

  1. стираю все оставшиеся нескрытые (и не лайканые) фотки (Library — альбом photos — ⌘A — delete items),
  2. возвращаю все скрытые обратно (Library — альбом Hidden — ⌘A — unhide items)
  • переношу все фотки из папки Фотокамера Яндекс диска в долговременный архив, Яндекс на телефоне сам синхронизируется и обратно заливает в фотокамеру только избранные фотографии

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

Красиво переименованные и уложенные яндексдиском файлы

Схема удобная, и работала она несколько лет, пока не случилась та самая упомянутая ранее потеря сервиса. В какой-то момент Яндекс поменял логику работы мобильного приложения — весной при очередной чистке я обнаружил, что он больше не перезакачивает в папку Фотокамера файлы, которые ранее в ней были, и после были мной удалены. Похоже что у себя они хранят хэши всех файлов, так как отредактированные после фотки в диск при такой схеме перезаливаются. Но неизменные — нет, а значит я больше не мог проводить синхронизацию лучших фото при регулярной чистке.

В принципе, потеря небольшая, просто весь 2020-й Яндекс диск скидывал мне напоминания о событиях 19-го. Тем не менее, это натолкнуло меня на мысль о том, что случись что — у меня есть полный архив всех фото включая самые свежие, но архива лучших нет! На отбор их потрачено время, и теперь сведения этого отбора не защищены от потери.

Казалось бы, чего тут сложного? Берём штатный способ выгрузки из Айклауда, сохраняем в папку избранные данные за нужный период — вуаля. Но тут вскрывается второй упомянутый ранее аспект — скрытая под капотом сложность.

Айклауд (как и Яндекс) красиво показывает в ленте фото по датам и местам, умеет на основе этой метаинформации собирать истории и альбомы. При этом на уровне файлов творится дикая дичь — в зависимости от источника (фото сделано на телефон, сохранено из мессенджера, проявлено в Лайтруме на компе и прислано по почте, это скриншот экрана или сохранёнка с веб страницы), а также от типа файла (разные форматы видео и графики), метаданные о времени съемки, локации и другом хранятся в разных полях по разной логике. И вот выгруженные штатными средствами файлы именуются непонятно как, имеют странные даты съемки (ещё и отображаемые по-разному в зависимости от программы просмотра) — в общем никакой красоты, удобства и единообразия тут нет.

Выгрузка из Айклауда. Ад и мешанина в именах, атрибутах и метаданных файлов. Дата съемки видео якобы неизвестна (но она есть, просто зашита глубоко)

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

Что делать

Проводим НИР, применяем для решения задачи великий и могучий ExifTool. Общая схема такая:

  • экспортируем данные из macOS Photo в оригинальном качестве и с записью дополнительных файлов xmp
  • пробиваем с помощью ExifTool метаданные из xmp в медиафайлы
  • проходимся по файлам набором команд ExifTool с разными параметрами в зависимости от типа файла и сохранённых в нём данных, чтобы переименовать их по дате
  • раскладываем полученные файлы по каталогам дат (для удобства)

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

Зато теперь есть способ выгрузить лучшие материалы из Айклауда и разложить их красиво с сохранением метаданных, в том числе и положить в Яндекс диск для бэкапа и красивостей. Вторичная выгода — прокачка скилла и овладение инструментом ExifTool и скриптования на bash под macOS, теперь эти ваши экзифы и переименования файлов можем делать с закрытыми глазами и одной левой

Итог

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

# экспортируем фотки из macOS Photo в оригинальном качестве и с записью xmp, открываем терминал в этот каталог

# далее пробиваем параметры из xmp в графические файлы
find . -maxdepth 1  -not -iname "*.xmp" -exec bash -c 'file="{}"; xmpname=${file%.*}.xmp; echo "$xmpname"; echo "$file"; exiftool -tagsfromfile "$xmpname" -xmp "$file" -overwrite_original' \;

# пробиваем атрибуты и переименовываем файлы по дате в зависимости от типа и содержимого

exiftool '-FileModifyDate<TrackCreateDate' '-FileName<TrackCreateDate' -d "%Y-%m-%d %H-%M-%S.%%f.%%e" *.mov -directory=out
exiftool '-FileModifyDate<TrackCreateDate' '-FileName<TrackCreateDate' -d "%Y-%m-%d %H-%M-%S.%%f.%%e" *.mp4 -directory=out

exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpg -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")' 
exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpeg -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")' 
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpeg -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")'
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpg -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")'


exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.heic -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00")))'

exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.png -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00")))'
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.png -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00")))'

exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.gif -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00"))) and ($filetype eq "GIF")' 
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.gif -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00"))) and ($filetype eq "GIF")'

# Чистим xmp
rm -f ./*.xmp

# перекладываем файлы в папки YYYY/YYYY-MM/
cd out
find . -maxdepth 1  -type f -exec bash -c 'file=$(basename "{}"); yearname=${file:0:4}; monthname=${file:5:2}; pathname="$yearname/$yearname-$monthname"; mkdir -p "$pathname"; echo "$pathname"; mv "$file" "$pathname"/ ' \;

Полезные ссылки по теме

КЭНК!
Слава роботам!

 Нет комментариев    27   7 мес   Linux   КЭНК   Яндекс.Диск

КЭНК: сортируем и фильтруем каналы IPTV

Решил подарить маме на новый год IPTV от широко известного в узких кругах провайдера. Этот сервис за небольшую плату предоставляет плейлисты с каналами, и главная суть услуги — то что списки каналов обновляются, протухшие источники заменяются новыми, клиент не бегает по интернетам в поисках собранных энтузизястами плейлистов сомнительного качества, и не остаётся вдруг без любимого НТВ под ёлочкой.

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

Телевизор Темп. Ровно такая же модель стала причиной больших перемен в семье моих родителей в начале 1980-х

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

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

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

Страница на гитхабе https://github.com/alexbatishchev/kenk-iptv-playlister

КЭНК!
Слава роботам!

 Нет комментариев    15   7 мес   PowerShell   КЭНК

КЭНК: контролируем сроки действия сертификатов

Сегодняшняя КЭНК-история короткая и почти без кода, потому что универсальный скрипт предложить сложно, а главную ценность составляет идея.

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

Решение. Выгружать или как-то ещё получать доступ к сертификатам в работе система не даёт, но мы можем договориться с группой поддержки, что они будут хранить сертификаты в отдельной папке с ограниченным доступом, и работать с ней при любом обслуживании клиентов — убирать оттуда ушедшие из работы сертификаты, класть вновь выпущенные и использованные в настройке. После этого остальное дело техники — по расписанию дампим сертификаты, находим в них данные о сроке окончания, начинаем присылать предупредительные письма группе поддержки заранее. Тут кстати родилась универсальная формула, позволяющая не попасть на праздники и прочие выходные  — предупреждения высылаются за 14, 5, и 3 дня до истечения срока действия сертификата.

Главный технический ингредиент — договориться с certutil, которая в разных версиях по разному выдает дампы.
В моем конкретном случае просто парсится дата окончания через

$data = certutil -dump $file | select-string -pattern "NotAfter:"

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

Пример уведомления о скором сроке окончания действия сертификата

КЭНК!
Слава Роботам!

 Нет комментариев    16   7 мес   PowerShell   Windows Server   КЭНК

КЭНК: сиделка для WSUS и её приключения на планете апдейтов

Хорошо настроенный WSUS работает как часы: ходит себе в интернеты за обновлениями, раздает их клиентам, и много хлеба не просит. Есть только несколько моментов: во-первых по привычке со старых версий я обычно применяю регулярную принудительный пинок, форсирующий штатную очистку базы от устаревших и ненужных объектов (честно говоря, не знаю есть ли проблема сейчас — но готово решение есть, почему бы не запускать — хуже не будет, а времени роботов не жалко).

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

Последний важный момент, больше относящийся не к технологии, а к процессам и менеджменту — как построить систему одобрения обновлений так, чтобы не положить одним прекрасным ночером пару тысяч хостов кривым апдейтом (за который MS через несколько дней будет извиняться, но нас это уже не спасёт). И как при этом не оставлять системы не обновлёнными надолго, по забывчивости например. Здесь очень хочется исключить из процесса человека, оставив за кожаным мешком только задачу быстрого контроля ключевых параметров.

Трент Резнор сказал, что BSOD тут — часть инсталляции, но мы то Всё Понимаем. Фото -ltrandazzo

На уровне процессов последняя задача решается выделением тестовой группы хостов, потеря которых некритична (=которых не жалко), но которые при этом активно используются (=о сбое быстро станет известно). На эти хосты обновления одобряются сразу средствами WSUS, а по прошествии выбранного времени и при отсутствии выявленных проблем — обновления раскатываются на остальные. За это определенное заранее время хорошо бы ещё держать руку на пульсе с помощью комьюнити и тематических ресурсов — благо новости о очередном KB, превращающим комплюктеры в тыкву, разносится народным гневом как лесной пожар.

Ну а в части исключения человеческого фактора из решения — нужен робот-сиделка, что будет следить за рутиной вместо людей.

Прибежали в хату дети, притащили новый скрипт

Зовём на помощь кэнк-мена, благо у актуальных версий WSUS есть API, которое можно дёргать из PowerShell. Пара вечеров — и имеем скрипт, умеющий:

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

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

Скрипт на гитахабе https://github.com/alexbatishchev/kenk-wsus-carer

КЭНК!
Слава роботам!

 Нет комментариев    20   7 мес   PowerShell   КЭНК

КЭНК: следитор за изменениями в контактах Exchange

На нынешнем проекте сложилась практика использования ящиков в Exchange в качестве адресной книги сразу несколькими членами рабочей группы и\или на нескольких устройствах одновременно. При этом регулярно возникала необходимость понять, когда было внесено то или иное изменение в адресную книгу ящика, а иногда — ещё и скопировать изменённые данные обратно без привлечения технических специалистов и механизмов резервного копирования. Ожидаемо, функционал требовался кастомный, а бюджет на получение дополнительного сервиса не рассчитан.

Заряжаем павершелломёт

Для целей автоматизации Exchange я часто использую Exchange Web Services (EWS) Managed API, вызывая его функции из PowerShell через библиотеку. Его применение напрашивается и тут. Можно смотреть содержимое адресной книги, дампить интересуемые данные из ящика в текстовый файл, сравнивать результаты актуального дампа и предыдущего, и формировать отчёты об изменениях. Побочный результат — раз уж мы получаем изменения, можно хранить их историю и иметь возможность ретроспективы.

Дальше — дело техники и деталей. Выгружаем поля в текстовый формат, схлопываем многоэлементные объекты в строки по формату как нам вздумается, исключаем те поля, за которыми следить не хотим. Приправляем наглядным представлением в виде HTML отчёта, выделяем цветом изменения и наносим прочую пользу клиентам сервиса. Даем возможность службе техподдержки ставить и снимать ящики с контроля добавлением в специальную доменную группу. Запускаем скрипт по планировщику с максимально возможной частотой. Роботы трудятся — а человеки пользуются результатом.

Примеры отчётов об изменении части контакта и удалении контакта из ящика

Сервис на базе этого скрипта успешно работает несколько лет. Служба техподдержки всегда может разрешить вопросы клиентов об изменениях в адресных книгах, некоторые клиенты пользуются отчётами для контроля работы в группе и оперативного отката изменений. Уникальный кастомный сервис достался заказчику в рамках общего контракта на обслуживание системы. Проблемы, для решения которых раньше требовалась работа специалиста, решаются автоматически и часто без привлечения техподдержки вообще. Чистый КЭНК!

Скрипт на гитхабе https://github.com/alexbatishchev/kenk-contacts-watcher

Слава Роботам!

 Нет комментариев    33   7 мес   EWS   PowerShell   КЭНК

КЭНК: уменьшаем диск сервера Windows через зеркалирование

Редкий, но противный кейс: есть сервер на Windows — виртуальная машина на платформе VMware, у которого нужно уменьшить размер одного из дисков (и размер соответствующего vmdk файла на хранилище). До кучи — сервер нельзя выключать надолго.

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

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

Картина неизвестного художника «Админ накидал на датастор виртуалок с тонкими дисками и ушёл в отпуск»

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

Сейчас КЭНК-мэн займётся вашими дисками, ребята

Как сжать системный диск

  • Сжать раздел стандартными средствами Windows Server до необходимого
  • Добавить новый виртуальный диск(и) такого размера как получившийся необходимый размер
  • На разделах старого диска (100 мб и системный вместе, остальные если надо — по отдельности) правой кнопкой — добавить зеркало, указать новый диск. Диски преобразуются в динамические и начнётся синхронизация
  • В свойствах компьютера установить опции загрузки с вторичного плекса и выбора операционной системы и возможности восстановления при запуске
  • Дождаться полной синхронизации зеркальных томов
  • Выключить виртуалку. Отключить оригинальные диски от виртуальной машины
  • Загрузить сервер, отключить (поломавшееся) зеркалирование

Как сжать несистемный диск

* Сжать раздел стандартными средствами Windows Server до необходимого

  • Добавить новый виртуальный диск(и) такого размера как получившийся необходимый размер
  • На разделе старого диска правой кнопкой — добавить зеркало, указать новый диск. Диски преобразуются в динамические и начнётся синхронизация
  • Дождаться полной синхронизации зеркальных томов
  • Отключить (можно на горячую) оригинальные диски от сервера
  • Отключить зеркалирование, указав что пропавшего диска в зеркале больше нет и не будет.

Детали и тонкости

Использующие раздел ИС переживают такие операции без проблем, в случае если диск не системный простой сервиса = 0

Иногда всё свободное пространство освободить не получается — диспетчер дисков Windows выдает ошибку «недостаточно свободного места» (There is not enough space available on the disk(s) to complete this operation). Проблема не в месте, а в неперемещаемых файлах, используемых в момент сжатия системой. Решается изучением логов Event Viewer Windows Logs\Application, где видно что именно мешает, и после соответствующих операций (типа временного отключения мешающего файла подкачки на разделе) раздел скорее всего удастся сжать.

Слава Роботам!
КЭНК!

КЭНК: запуск диалога смены пароля во вложенных сессиях RDP

В сессии RDP (внутри сессии RDP (внутри сессии RDP (...))) очень неудобно вызывать с клавиатуры диалог смены пароля пользователя Windows (кто пробовал — поймёт).

Вот магическая строчка, решающая все проблемы:

C:\Windows\explorer.exe shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}

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

Файл ярлыка (с прибинденой иконкой из стандартного набора Windows):
https://github.com/alexbatishchev/kenk-stuff/blob/main/changepassword.zip

Слава Роботам!
КЭНК!

 Нет комментариев    22   8 мес   КЭНК

КЭНК: перенос файлов в архив 7zip через контекстное меню

У архиватора 7zip под Windows не хватает супер-удобной функции — нельзя легко из Проводника переместить папку или файл в архив. Более того, судя по многочисленным запросам в интернетах, внедрение её создателями не предполагается по какой-то принципиальной причине. Все варианты команд стандартного контекстного меню позволяют сделать архив, но оставляют оригиналы файлов. Даже в GUI самой программы галку «удалять файлы после сжатия» требуется каждый раз устанавливать вручную, и нельзя настройками включить её по умолчанию. Между тем, для меня в работе и быту это довольно частая операция (да и привычка от WinRAR осталась), и хотелось бы её максимально упростить.

Короткая НИР Отдела Малой Автоматизации показала, что никакими штатными средствами сделать это невозможно, зато возможно модифицировать реестр, вписав в контекст файлов и папок нужные команды (тут вообще поле напаханное для творчества, на самом деле).

Контекстное меню курильщика 7zip и контекстное меню 7zip здорового человека

Будим гуглочёта, затачиваем Notepad++

Собственно составляющие задачи:

  • сочинить команду для 7zip с флагом удаления оригиналов (-sdel),
  • понять как передать команде каталог или файл, на котором запущено контекстное меню (ожидаемо, %1)
  • понять где в реестре прописывается команда (см путь ниже, там Directory для каталогов и * для «вообще всего», в данном случае для файлов это работает).

Код ниже, строчка «Move To 7z archive with maximum (7) level compression» понятно может быть любой какой вам удобно, равно как и параметры компрессии (я выбрал mx7, времени роботов не жалко)

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\Move To 7z archive with maximum (7) level compression]
[HKEY_CLASSES_ROOT\Directory\shell\Move To 7z archive with maximum (7) level compression\command]
@="\"c:\\Program Files\\7-Zip\\7z.exe\" a \"%1\".7z \"%1\\\" -sdel -mx7"
[HKEY_CLASSES_ROOT\*\shell\Move To 7z archive with maximum (7) level compression]
[HKEY_CLASSES_ROOT\*\shell\Move To 7z archive with maximum (7) level compression\command]
@="\"c:\\Program Files\\7-Zip\\7z.exe\" a \"%1\".7z \"%1\" -sdel -mx7"

Не очень кайфово, что команда вызывает Чорный Экран С Буквами и показывает его, пока архив не сожмётся, но мне это не мешает

Страница с готовым .reg файлом на гитхабе https://github.com/alexbatishchev/kenk-7zip-contextmenu

КЭНК!
Слава Роботам!

 1 комментарий    25   8 мес   КЭНК
Ранее Ctrl + ↓