🏠: Viacheslav

Открыли велосезон

Вчера привёл в порядок велосипеды, а сегодня с сыном открыли сезон. Погода чудесная, солнечно и тепло. Сначала планировали поехать на Фабричный пруд, но там закрыто напрочь, тогда решили объехать вокруг Новокосина.

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

Реально проехали 17,5 км

Что сделал - 6

Скрипт синхронизации данных из базы Microsoft SQL в Active Directory

Во многих компаниях существуют сервисы, дублирующие друг друга — это происходит отчасти из-за незнания о существовании уже имеющихся инструментов или неумения их настраивать, отчасти из-за сложных взаимоотношений или плохой координации между подразделениями, а отчасти из-за конъюнктурных стремлений различных начальников. К примеру, не раз я встречал разные реализации внутренних телефонных справочников, которые не связаны с Active Directory, хотя логично было бы всю первичную информацию держать именно там, и вся информация была бы доступна через адресную книгу Outlook, или, в крайнем случае, веб-версию справочника формировать из запросов в AD. Нет, так просто нельзя — в моей нынешней конторе телефонный справочник представляет собой отдельный сервис, причём разделённый на два сервера — древняя писанная на коленке веб-морда, которая крутится на Ubuntu 14.04, и база данных, которая работает — это радует отдельно в данной ситуации — на Microsoft SQL.

Данные в этот справочник заносятся вручную, причём бессистемно — телефоны могут быть написаны и 8-495-123, и 8 (495) 123, и ещё как бог на душу положит, а сотрудники, совмещающие несколько должностей, могут быть прописаны несколько раз, причём, у одной инкарнации телефоны и кабинет могут быть прописаны, а у другой — нет. И везде куча ошибок, пропуск пробелов и т. п.

На всё вышеперечисленное безобразие я никак повлиять не могу, однако, хотелось бы иметь актуальные телефоны в Active Directory, которой я управляю. Для этого я написал скрипт синхронизации данных из базы Microsoft SQL в Active Directory. Делается выгрузка из базы (Invoke-Sqlcmd) и из AD, затем для каждого пользователя базы ищется аналог в выгрузке AD, и при несовпадении значений полей они либо меняются, либо удаляются, отчёт по результатам изменений высылается в почту. У дублирующихся пользователей в базе данных информация берётся только из самого свежесозданного по ID.

Конечно, телефоны и прочую информацию я по возможности пытаюсь причёсывать, вот, например, строка обработки телефонных номеров из базы:

@{n='tel';e={($_.tel -split ',').trim() -replace "^49","+7 49" -replace "\)",') ' `
-replace "\s+",' ' -replace '^-$' -replace "^\(|^8 \(","+7 " -replace "\)" `
-replace "123045","123-45" -join ', '}},

Переделал отчёт по несмонтированным дискам Hyper-V в полноценный отчёт по Hyper-V в целом

Отчёт включает в себя:

  1. Таблицу по виртуальным машинам — имя машины, выделенная память, кол-во процессоров, состояние, хост, кластеризована или нет, версия конфигурации. В конце статистика, типа «Всего виртуальных машин 55, общий объём памяти 363 ГБ, всего виртуальных процессоров 134, включено машин 40, выключено 15, в ином статусе 0.»
  2. Таблицу по смонтированным дискам, в конце статистика.
  3. Таблицу по несмонтированным дискам, в конце статистика.

Сбор информации о состоянии жёстких дисков с пользовательских машин

Минимальную информацию об этом может давать и Windows, но хотелось сделать красиво, для этого я привлёк программу DiskSmartView, которая умеет выгружать отчёты в форматах CSV и HTML.

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

Локальная часть делает следующее: скрипт запускается после загрузки компьютера, смотрит во временный каталог, и если последний отчёт не старше недели, прерывает работу. Если отчёта нет или он старше, запускает DiskSmartView и делает отчёт во временный каталог в формате CSV, затем проверяет, есть ли в колонке статуса значения, отличные от «OK», «неизвестно» или пустых. Если нет, то работа завершается, а если да, то отчёт делается ещё раз, но уже в общий каталог на сервере и в формате HTML. Потом этот HTML открывается, оттуда выкидывается всё ненужное и вставляется имя компьютера и время составления отчёта. На этом локальная часть исчерпывается.

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

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

Уже опубликовал этот текст, как вспомнил ещё про один

Cкрипт, связанный с массовым переходом сотрудников на удалённую работу

Суть его в том, что он запускается при загрузке компьютера, ищет в AD пользователя, ФИО которого прописано в описании компьютера, и если находит, прописывает его в локальную группу «Пользователи удалённого рабочего стола», включает RDP через реестр, через реестр же отключает «проверку подлинности сети», прописывает правило файрволла под названием «Allow RDP COVID-2019», а потом по результатам — что было сделано — пишет отчёт в общий каталог на сервере.

Время;ФИО;Логин;Компьютер;Добавлен в группу;RDP;NLA;Правило файрволла
2020.03.25 15:05:55;Королёва Ирина Витальевна;koroleva;PC1384;Да;Включено;Отключено;Создано

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

Нутовые котлеты

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

IMG_20200323_203534.jpg
IMG_20200323_205357.jpg
IMG_20200323_210535.jpg

Торт для героя

Сын вычитал в комиксах рецепт торта:

Вчера с ним воплотили этот рецепт в жизнь (флажками не заморачивались).

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

Тортик получился довольно-таки съедобным. Там вроде бы ещё был рецепт каких-то печений, так что надо быть готовым к дальнейшим кулинарным экспериментам.

Праздничные дни в Powershell

Сегодня у меня сработало оповещение о том, что базы Консультанта старые — скрипт смотрит на дату в файле [Путь к каталогу Консультанта]\RECEIVE\LAST_REC.TXT, и если эта дата раньше вчерашней и сегодня не понедельник, отправляет уведомление по почте.

Сегодня вторник, но вчера был выходной в счёт праздника, попавшего на воскресенье, поэтому то, что последнее обновление было 6-го числа, совершенно нормально. Тем не менее, я подумал — а можно ли учитывать и праздничные дни тоже? Как сделать так, чтобы компьютер «знал» про праздничные дни? Ведь это может много где пригодиться, начиная от более гибкого расписания выполнения автоматических заданий, каких-нибудь оповещений, да мало ли где ещё?

Можно! В данном случае я нашёл сайт xmlcalendar.ru, где выкладывают производственный календарь в формате XML. Чтобы выгрузка с него была понятнее, я сделал некоторые преобразования. Вот скрипт:

# Скачивание XML
curl http://xmlcalendar.ru/data/ru/2020/calendar.xml -OutFile d:\temp\cal.xml
# Импорт
[xml]$cal = gc d:\temp\cal.xml -Encoding utf8
# Обработка
foreach ($day in $cal.calendar.days.day) {
$day.d = (($cal.calendar.year + '.' + $day.d) -as [datetime]).tostring("dd.MM.yyyy")

if ($day.t -eq 1) {$day.t = "Вых"}
elseif ($day.t -eq 2) {$day.t = "Сокр"}
elseif ($day.t -eq 3) {$day.t = "Раб"}

if ($day.h -match "\d") {$day.h = ($cal.calendar.holidays.holiday |? id -eq $day.h).title}
}
# Экспорт в CSV
$cal.calendar.days.day |Export-Csv "d:\temp\cal$($cal.calendar.year).csv" -Encoding utf8 -Delimiter ';' -NoTypeInformation

Результат:

d          t    h                                                                     
-          -    -                                                                     
01.01.2020 Вых  Новогодние каникулы (в ред. Федерального закона от 23.04.2012 № 35-ФЗ)
02.01.2020 Вых  Новогодние каникулы (в ред. Федерального закона от 23.04.2012 № 35-ФЗ)
03.01.2020 Вых  Новогодние каникулы (в ред. Федерального закона от 23.04.2012 № 35-ФЗ)
04.01.2020 Вых  Новогодние каникулы (в ред. Федерального закона от 23.04.2012 № 35-ФЗ)
05.01.2020 Вых  Новогодние каникулы (в ред. Федерального закона от 23.04.2012 № 35-ФЗ)
06.01.2020 Вых  Новогодние каникулы (в ред. Федерального закона от 23.04.2012 № 35-ФЗ)
07.01.2020 Вых  Рождество Христово                                                    
08.01.2020 Вых  Новогодние каникулы (в ред. Федерального закона от 23.04.2012 № 35-ФЗ)
23.02.2020 Вых  День защитника Отечества                                              
24.02.2020 Вых                                                                        
08.03.2020 Вых  Международный женский день                                            
09.03.2020 Вых                                                                        
30.04.2020 Сокр                                                                       
01.05.2020 Вых  Праздник Весны и Труда                                                
04.05.2020 Вых                                                                        
05.05.2020 Вых                                                                        
08.05.2020 Сокр                                                                       
09.05.2020 Вых  День Победы                                                           
11.05.2020 Вых                                                                        
11.06.2020 Сокр                                                                       
12.06.2020 Вых  День России                                                           
03.11.2020 Сокр                                                                       
04.11.2020 Вых  День народного единства                                               
31.12.2020 Сокр

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

Удобная альтернатива — https://www.isdayoff.ru