🏠: it

Что сделал на этой неделе

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

Скрипт, меняющий пароли локального администратора на рабочих станциях

Вещи типа Local Administrator Password Solution использовать в наших широтах не очень принято, поэтому приходится изобретать свой велосипед. Работа идёт через ADSI, так как Powershell v5, где есть удобные команды типа Get-LocalUser, установлен далеко не везде (почему — это отдельная тема, слабо связанная с технической стороной).

Скрипт берёт имена рабочих станций из AD, потом для каждой проверяет соединение. Если связь есть, лезет туда и получает список членов группы локальных администраторов. Если у учётки «Администратор» пароль старше 60 дней (он в секундах, надо его делить на 86400), генерит новый и задаёт его, затем снимает флаги «пароль не требуется», «пароль не может быть изменён», и «учётная запись отключена», ставит флаг «срок действия пароля неограничен» — ведь неизвестно, когда в следующий раз удастся поменять пароль. Если среди членов группы администраторов обнаружились пользователи с определёнными названиями (техподдержка при заливке машин давала такие имена) — удаляет эти учётные записи.

Результаты пишутся в файл CSV — имя компьютера, имя локального администратора, пароль, дата последней успешной смены пароля, дата последней попытки смены пароля. Отчёт о работе скрипта высылается на почту.

Логон-скрипт, собирающий статистику о локально подключенных почтовых архивах в формате .pst

При входе пользователя в систему идёт подключение к COM-объекту Outlook.Application и выгружается список локальных объектов хранения, где встречается «.pst», также вычисляется размер этих файлов.

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

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

Автоматизация создания файловой структуры, генерации групп и раздачи прав

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


Рис. 1. Вложенность ресурсных групп для раздачи прав на каталоги

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

На первом этапе создаются ресурсные группы в AD (индекс вложенности в имени группы вычисляется интересно (сам быстро не додумался, пришлось гуглить) — путь к папке, например, \\server\share\department1\group2, разбивается на массив символов, где подсчитываются наклонные черты минус 2).

$level = (($_.FullName).ToCharArray() |? {$_ -eq "\"} |measure).count - 2

Второй этап — вложенность групп. Тот же тройной цикл, но теперь ищутся группы в AD, соответствующие названию текущей папки (например, FS-2-$($_.name)-). Далее делаются команды добавления членства в группах с выборками соответствующих имён согласно вышеприведённой схеме. Важно, что нужно задавать условие существования для добавления групп (if ($2groups -and $3groups)), потому что не везде существуют группы 4-го или 3-го уровней; также, нужно обнулять содержимое переменных групп 3 и 4 уровней после окончания их цикла, потому что иначе, когда снова начнётся главный цикл, не сработают условия существования групп (переменные уже будут содержать данные из предыдущего цикла), и в результате, группы нижних уровней из прошлой итерации добавятся в группы из новой, что совершенно не нужно.

Третий этап — раздача прав на папки. Здесь было уже проще — из-за такой сложной вложенности групп права на папку даются только для тех групп, которые соответствуют её названию, а также группе локальных администраторов сервера и учётной записи «Система». В Powershell изначально нет нормального функционала работы с правами NTFS, но зато есть прекрасный модуль NTFSSecurity. Вот права, например, для 3-го этапа:

Set-NTFSInheritance -Path "$($_.FullName)" -AccessInheritanceEnabled:$false
Add-NTFSAccess -Path "$($_.FullName)" -Account 'BUILTIN\Администраторы', 'NT AUTHORITY\СИСТЕМА' -AccessRights FullControl
Add-NTFSAccess -Path "$($_.FullName)" -Account $($3groups.name -match "FS-.*-r$") -AccessRights ReadAndExecute
Add-NTFSAccess -Path "$($_.FullName)" -Account $($3groups.name -match "FS-.*-rw$") -AccessRights Modify
if ($3groups.name -match "FS-.*-l$") {
  Add-NTFSAccess -Path "$($_.FullName)" -Account $($3groups.name -match "FS-.*-l$") -AccessRights ReadAndExecute -AppliesTo ThisFolderAndSubfolders
}

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

Remove-NTFSAccess -Path "$($_.FullName)" -Account "СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ" -AccessRights FullControl

3 месяца на новой работе

Что сделал, из основного:

  • Включил корзину AD, сбросил стандартные групповые политики (их бессистемно правили до этого, проанализировал, сравнил со стандартными значениями, задокументировал), затем перенёс некоторые их настройки в отдельные политики.
  • Перенастроил неправильно настроенные интерфейсы некоторых виртуальных хостов, чтобы они смотрели в отдельно взятую подсеть только одним IP-адресом.
  • Мигрировал старый файловый сервер (Windows 2003) на новый.
  • Установил и настроил Dokuwiki, Zabbix, Redmine, Nextcloud, Request Tracker, тестовый стенд HAProxy + Keepalived, обновил Exchange Edge.
  • Прошил на серверах все ILO и восстановил к ним доступ, включил в мониторинг Zabbix.
  • Ввёл в эксплуатацию несколько железных серверов.
  • Поднастроил Kaspersky Security Center, сделал разливку агента через GPO и автоустановку антивируса на рабочие станции.
  • Настроил динамические группы рассылки в Exchange, с фильтрацией по должностям (например, все сотрудники минус генеральный и его замы).

Написал на Powershell:

  • Парсер выгрузки штатного расписания из 1С.
  • Отчёт о соответствии AD штатному расписанию, генерация соответствующих команд и отчёт в почту.
  • Логон-скрипт — автоматическое прописывание в учётку пользователя в AD имени компьютера и времени входа, также ведение истории входов в CSV.
  • Автоматическое прописывание extensionAttributes пользователям в соответствии со штатным расписанием + отчёт в почту.
  • Автоматическое создание групп подразделений в AD в соответствии со штатным расписанием, со вложенностью по иерархии.
  • Автоматическое добавление и удаление пользователей и компьютеров из групп подразделений, в соответствии с ExtensionAttributes и именем компьютера в учётке пользователя + отчёт в почту об изменениях.
  • Автоматическое отключение компьютеров, не входивших в систему больше 90 дней + перемещение уже отключенных объектов в соответствующий контейнер + отчёт в почту.
  • Генерация команд для выгрузки ящиков Exchange для отключенных учёток, не входивших в систему более 180 дней, отчёт в почту.
  • Глобальная адресная книга Exchange — автоматическое удаление отключенных и добавление включенных пользователей.
  • Дополнительно — генераторы паролей, логинов, инициалов, названий групп, транслитератор, отчёты о членстве в группах AD, о правах NTFS на общих каталогах, парсер отчёта AccessEnum, парсер отчёта Kaspersky Security Center.

Обновление старого нетбука

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

Модель — Acer Aspire One AOD257, на борту неплохой процессор Intel Atom N570 о двух физических ядрах + 2 ядра гипертрединга, памяти всего лишь 1 ГБ (хотя она DDR3-1333 / PC3-10600) и штатный очень медленный 250 ГБ жёсткий диск WD Scorpio Blue WD2500BPVT.

Я решил увеличить памяти до 2 ГБ и поменять жёсткий диск на какой-нибудь дешёвый SSD. Памяти бы я поставил и 4 ГБ, но процессор Atom N570 не умеет работать больше чем с 2 ГБ. Жёстким диском на замену я выбрал WD SSD Green 240 ГБ (WDS240G2G0A) — звёзд с неба он не хватает, однако на него дают 3 года гарантии, он имеет большой ресурс и для интерфейса SATA II, имеющегося в нетбуке, его будет более чем достаточно. Да и стоит он на сегодняшний день очень дёшево — чуть больше 2000 рублей.

Обзаведясь необходимым железом, я приступил к работам. Сначала обновил BIOS, поставил новую память, подключил новый диск через USB и склонировал на него содержимое старого с помощью Acronis True Image WD Edition.

В процессе клонирования диска

После клонирования я вытащил из нетбука старый диск и поменял его на новый, затем восстановил исходный заводской образ системы (Windows 7 Starter 32-bit) из раздела восстановления. После этого я решил попробовать обновить систему до Windows 10, потому что имелась информация, что при обновлении старых систем активация сохраняется, несмотря на то, что широко рекламируемый период бесплатного обновления до Windows 10 давно закончился. В случае неудачи всегда можно откатиться обратно на заводской образ.

Для обновления операционки я скачал и запустил утилиту Media Creation Tool, которая всё прекраснейшим образом сделала сама: скачала нужную редакцию системы — Windows 10 Home 32-bit, предупредила о несовместимости встроенного видеоадаптера Intel GMA 3150, предложила сохранить параметры и файлы, и установка началась.

Во время процесса скачивания и установки Windows 10 Home поверх Windows 7 Starter

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

Конечный результат

Единственное, что не удалось — это заставить работать штатную утилиту для мониторинга диска WD SSD Dashboard, при запуске она ругается на то, что видеокарта не поддерживает OpenGL 2.0, и на Windows 7 было то же самое. Задал вопрос на форуме Western Digital, посмотрим. В принципе, и так неплохо.

Upd: Последующее тестирование показало, что машинка практически новая — CrystalDiskInfo выдаёт, что диск отработал всего около 1700 часов (71 сутки), т. е., всего ничего. Батарея, что удивительно, тоже прекрасно себя чувствует — после полутора часов непрерывного воспроизведения видео на Youtube индикатор показывает 62% оставшегося заряда.

Удаление рекламы на уровне сети

Обнаружил замечательный проект — Pi-hole, который служит фильтром рекламы и трекеров телеметрии. Это микросервер, который нужно на роутере указывать как DNS для клиентов DHCP, или, в случае статических адресов, указывать Pi-hole как DNS непосредственно на клиентах. Если роутер не умеет задавать DNS для динамических клиентов, то Pi-hole может взять на себя роль и DHCP-сервера.

Я сделал тестовую виртуальную машину с этим сервисом и прицепил её к роутеру как DNS, в результате на всех мобильных устройствах пропала реклама из приложений.

Ставится Pi-hole элементарно, у него есть красивый веб-интерфейс со статистикой и настройками.

Главная панель Журнал запросов

Идеальное применение для маленького дешёвого одноплатника, типа Orange Pi Zero, так как сервис нетребователен к ресурсам.

Альтернативный Youtube

Вчера узнал о существовании любопытного проекта под названием
Invidious, представляющий собой независимую реализацию веб-интерфейса к Youtube. Вот наиболее полезные функции:

  • Возможность включать только аудиодорожку (нет необходимости держать экран включённым на мобильнике)
  • Нет рекламы
  • Возможность скачивания с выбором качества
  • Для подписок не нужна учётная запись Google
  • Гибкое управление подписками, импорт и т. д.
  • Комментарии можно отключить или заменить на комментарии с Reddit
  • Тёмная тема, возможность встраивания видео и прочее.

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