🕒 Как получить сведения о запланированном задании в PowerShell
Смотрел тут свои старые скрипты, решил поделиться. Задача несложная, однако в зависимости от цели может понадобиться три разных запроса.
1️⃣ Состояние задания -
Годится запрос по имени задания, в том числе неполному. Заодно выведем чуть больше инфо - полное имя, состояние, адрес.
Задание синхронизации языковых настроек включено.
2️⃣ Сведения о последним запуске задания -
Здесь наряду с именем задания требуется еще и путь в
⏩ На практике задачи 1 и 2 чаще объединяются в конвейер. Причем можно сходу фильтровать по неполным именам нескольких заданий, обходясь без
3️⃣ Параметры задания -
Выводится XML, как в экспорте задания из планировщика. PowerShell легко перемещается по узлам.
Задание отложено на 30 секунд после входа в систему.
////
Создание запланированного задания в #PowerShell будет посложнее. Я показывал это в блоге, в том числе в сравнении с утилитой
Смотрел тут свои старые скрипты, решил поделиться. Задача несложная, однако в зависимости от цели может понадобиться три разных запроса.
1️⃣ Состояние задания -
Get-ScheduledTask
Годится запрос по имени задания, в том числе неполному. Заодно выведем чуть больше инфо - полное имя, состояние, адрес.
Get-ScheduledTask -TaskName '*sync*lang*' | fl TaskName,State,URI
TaskName : Synchronize Language Settings
State : Ready
URI : \Microsoft\Windows\International\Synchronize Language Settings
Задание синхронизации языковых настроек включено.
2️⃣ Сведения о последним запуске задания -
Get-ScheduledTaskInfo
Здесь наряду с именем задания требуется еще и путь в
-TaskPath
. Либо в качестве имени указывайте URI
из запроса выше.Get-ScheduledTaskInfo -TaskName '\Microsoft\Windows\International\Synchronize Language Settings
LastRunTime : 1/25/2025 10:22:22
LastTaskResult : 0
NextRunTime :
NumberOfMissedRuns : 0
TaskName : \Microsoft\Windows\International\Synchronize Language Settings
LastTaskResult
выводит код завершения предыдущего запуска. 0
означает успех, 1
- неудачу, остальное надо смотреть по коду.⏩ На практике задачи 1 и 2 чаще объединяются в конвейер. Причем можно сходу фильтровать по неполным именам нескольких заданий, обходясь без
Where-Object
.Get-ScheduledTask -TaskName *backup*,*sync* | Get-ScheduledTaskInfo | fl TaskName,LastRunTime
3️⃣ Параметры задания -
Export-ScheduledTask
Export-ScheduledTask -TaskName '\Microsoft\Windows\International\Synchronize Language Settings'
Выводится XML, как в экспорте задания из планировщика. PowerShell легко перемещается по узлам.
[xml]$task = Export-ScheduledTask -TaskName '\Microsoft\Windows\International\Synchronize Language Settings'
$task.Task.Triggers.LogonTrigger.Delay
PT30S
Задание отложено на 30 секунд после входа в систему.
////
Создание запланированного задания в #PowerShell будет посложнее. Я показывал это в блоге, в том числе в сравнении с утилитой
schtasks
. Бывает проще импортировать подготовленный XML. Пример уже был на канале ✌️www.outsidethebox.ms
Как в Windows автоматически выполнять задачи на восходе и закате солнца
В Windows есть режим ночного света, меняющий свет экрана с дневного на более теплый и обратно. Это работает вручную, по фиксированному расписанию или на закате и восходе. И я не раз видел желающих применить именно последний вариант для смены цветов ОС или…
🧹 Удаление временных файлов из служебных профилей
Недавно я анализировал недостаток дискового пространства на одной системе. Помимо прочего утилита dfp выдала такое:
Я натравил её на папку
ℹ️
Удаление временных файлов безвредно, причем ухищрений не требуется. В смысле не надо ломиться в системные папки как лось, меняя на ходу разрешения NTFS. Просто в #PowerShell от имени администратора:
Total Commander или FАR от админа тоже годятся ✌️
Недавно я анализировал недостаток дискового пространства на одной системе. Помимо прочего утилита dfp выдала такое:
1.6G 527 191 C:\Windows\ServiceProfiles
1.6G 287 81 C:\Windows\ServiceProfiles\NetworkService
1.6G 281 71 C:\Windows\ServiceProfiles\NetworkService\AppData
1.6G 244 39 C:\Windows\ServiceProfiles\NetworkService\AppData\Local
1.6G 243 34 C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp
Я натравил её на папку
Temp
и выяснил, что 1.6 GB занято древней папкой с именем типа E58DAD6F-63DE-461C-AB9F-7F58DDC916D9
ℹ️
NetworkService
и LocalService
- служебные аккаунты, чьи профили хранятся в папке Windows. Их содержимое аналогично профилям интерактивных пользователей из папки C:\Users
. Удаление временных файлов безвредно, причем ухищрений не требуется. В смысле не надо ломиться в системные папки как лось, меняя на ходу разрешения NTFS. Просто в #PowerShell от имени администратора:
Remove-Item -Force -Recurse -Path 'C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp\E58D*'
Total Commander или FАR от админа тоже годятся ✌️
😎 Знакомая прислала скриншот веб-редактора аудиофайлов
- какую кнопку нажать, чтобы выйти из этого режима?
- Esc
- сын то же самое сказал, не срабатывает... очень много работы сделала(((
- в смысле боишься потерять?
- да, уже было такое
- перетащи туда файл
- я никогда так не делала
- повод попробовать :)
- ура!!!
Я уже вижу, как вы прониклись чувством превосходства над неопытным пользователем :) Но в этой истории есть отличная мораль. В любой непонятной ситуации следуйте указаниям на экране! А внимательно читать и анализировать написанное - это высший пилотаж ✌️
- какую кнопку нажать, чтобы выйти из этого режима?
- Esc
- сын то же самое сказал, не срабатывает... очень много работы сделала(((
- в смысле боишься потерять?
- да, уже было такое
- перетащи туда файл
- я никогда так не делала
- повод попробовать :)
- ура!!!
Я уже вижу, как вы прониклись чувством превосходства над неопытным пользователем :) Но в этой истории есть отличная мораль. В любой непонятной ситуации следуйте указаниям на экране! А внимательно читать и анализировать написанное - это высший пилотаж ✌️
Викторина / опрос. В файле hosts на разных строках прописаны два разных IP-адреса, указывающих на один домен. В общем случае и при прочих равных, в какой IP-адрес Windows преобразует доменное имя? В вариантах ответа порядок адресов сверху вниз.
Final Results
43%
Первый
10%
Кажется, первый
16%
Второй
8%
Кажется, второй
6%
Ни первый, ни второй
18%
Правильного варианта тут нет
⚙️ Нюансы префетчинга приложений в Windows
Сегодня в рубрике "Возвращаясь к напечатанному" префетчинг приложений и количество записей, которые он хранит и обрабатывает.
• В 2013 году я разбирал префетчинг в рамках мифов оптимизации SSD
• В 2019 году он снова попал в фокус в статье Нюансы отключения службы SysMain в Windows
Параметр
🔢 В Windows 10 и ранее оно по умолчанию 256, а в Windows 11 — 512 (так же и в серверных ОС). Думаю изменение связано с тем, что сама ОС разрослась с 2006 года и запускает больше своих исполняемых файлов.
1. Понимать, запускаются ли
2. Проанализировать файлы в папке
Я не думаю, что древний префетчинг способен ускорить запуск программ с твердотельных накопителей. Но запуск исполняемых файлов (например, игр) с жесткого диска еще может быть актуален. Для оценки можно посчитать количество файлов в папке и сопоставить с лимитом. В #PowerShell от имени администратора:
ℹ️ На количество файлов могут влиять разные факторы. Например, едва установив систему, вы начинаете ставить и запускать любимые приложения. Каждый установщик - это как минимум один исполняемый файл. С другой стороны, после чистой установки система сама оптимизирует себя, что может быть сопряжено с запуском различных
Все это оседает в папке Prefetch. По достижении предела старые записи будут вытеснены автоматически, но "одноразовые" установщики и не нужны.
Если в обжитой системе вы запускаете
Так, у
Измерить же реальный прирост скорости запуска исполняемых файлов затруднительно. Зато душу будет греть тот факт, что вы оптимизировали свою ОС не случайно найденной в интернетах подборкой твиков, а на основе грамотного анализа ✌️
Сегодня в рубрике "Возвращаясь к напечатанному" префетчинг приложений и количество записей, которые он хранит и обрабатывает.
• В 2013 году я разбирал префетчинг в рамках мифов оптимизации SSD
• В 2019 году он снова попал в фокус в статье Нюансы отключения службы SysMain в Windows
Niks
спросил, работает ли префетчинг по умолчанию, когда система установлена на SSD. Да, работает, и это легко проверить по мотивам статьи про SysMain:Get-MMagent
ApplicationLaunchPrefetching : True
ApplicationPreLaunch : True
MaxOperationAPIFiles : 512
MemoryCompression : True
OperationAPI : True
PageCombining : True
Параметр
ApplicationLaunchPrefetching
- это он. Вообще, этот префетчинг еще времён XP, и по большому счету с тех пор ничего не изменилось. Однако сравнивая вывод наших команд, я заметил, что отличается значение MaxOperationAPIFiles
. Это предельное количество файлов в сфере префетчинга.🔢 В Windows 10 и ранее оно по умолчанию 256, а в Windows 11 — 512 (так же и в серверных ОС). Думаю изменение связано с тем, что сама ОС разрослась с 2006 года и запускает больше своих исполняемых файлов.
Niks
интересовался, стоит ли увеличить значение до 2048. Чтобы ответить на этот вопрос, нужно:1. Понимать, запускаются ли
.EXE
с жесткого диска2. Проанализировать файлы в папке
C:\Windows\Prefetch\
Я не думаю, что древний префетчинг способен ускорить запуск программ с твердотельных накопителей. Но запуск исполняемых файлов (например, игр) с жесткого диска еще может быть актуален. Для оценки можно посчитать количество файлов в папке и сопоставить с лимитом. В #PowerShell от имени администратора:
(Get-ChildItem "C:\Windows\Prefetch\*.pf" -File).Count
ℹ️ На количество файлов могут влиять разные факторы. Например, едва установив систему, вы начинаете ставить и запускать любимые приложения. Каждый установщик - это как минимум один исполняемый файл. С другой стороны, после чистой установки система сама оптимизирует себя, что может быть сопряжено с запуском различных
.EXE
. Все это оседает в папке Prefetch. По достижении предела старые записи будут вытеснены автоматически, но "одноразовые" установщики и не нужны.
Если в обжитой системе вы запускаете
.EXE
с HDD, а количество PF-файлов близко к лимиту, может иметь смысл увеличить предельное значение.Set-MMAgent -MaxOperationAPIFiles 1024
Так, у
Niks
спустя две недели после очистки и увеличения лимита в папке стало 354 PF-файла. Что превышает стандартный предел в его Windows 10, но далеко от 512 в Windows 11. Измерить же реальный прирост скорости запуска исполняемых файлов затруднительно. Зато душу будет греть тот факт, что вы оптимизировали свою ОС не случайно найденной в интернетах подборкой твиков, а на основе грамотного анализа ✌️
😎 Коммунальные услуги теперь и в вашем SSD
Говорят, пока только для москвичей ;)
Наверняка в оригинале -utilities. Основное значение слова - организации, осуществляющие поставку газа, воды и электричества потребителям. А не вот этих ваших утилит :)
Спасибо
Говорят, пока только для москвичей ;)
Наверняка в оригинале -
Спасибо
dartraiden
и ԤИОНЕР
за очередной #автоперевод ✌️🌐 О приоритете записей в файле hosts
В чате обсуждали использование файла hosts с целью запретить приложению подключение к своим адресам. Речь зашла о возможных дубликатах записей. Один опытный участник заявил:
hosts читается сверху вниз и будет использован последний дубликат
Другой не менее опытный участник это полайкал. Судя по результатам викторины в виде опроса, так думает лишь четверть подписчиков. Правильно же ответили более 40%, что для моих викторин - отличный результат 😎
Я поинтересовался у автора заявления, как бы он его проверял. Тот предложил вписать в файл две строчки и пропинговать.
Я бы тоже так делал! И вот результат:
👉 Получается, что Windows использует первый адрес. И Linux тоже!
Разумеется, такое утверждение нужно снабжать примечаниями. Опрос не случайно ограничивался Windows и с оговоркой в общем случае и при прочих равных. На уровне ОС возможны исключения, хотя примеров у меня нет.
📄 Несколько человек поднимали вопрос о влиянии кэша DNS. Однако в соответствии с одной из старейших актуальных статей базы знаний Microsoft, Microsoft TCP/IP Host Name Resolution Order, клиент Windows смотрит в локальный файл hosts прежде чем опрашивать серверы DNS. Кэш DNS в статье явно не упомянут, но это производная от серверов.
Сторонние же программы могут применять свой алгоритм чтения файла hosts либо вообще игнорировать его. Например, разработчикам Firefox пришлось реализовывать свой парсер hosts, чтобы он не игнорировался при использовании встроенного в браузер резолвера DoH (спасибо,
Я сам когда-то думал, что выигрывает последняя запись. Пока не столкнулся с этим по работе. У тестовых серверов поменялись IP-адреса, и я добавил новые записи в конец файла hosts. Однако рабочее приложение не смогло подключиться по доменному имени. Так и узнал ✌️
В чате обсуждали использование файла hosts с целью запретить приложению подключение к своим адресам. Речь зашла о возможных дубликатах записей. Один опытный участник заявил:
hosts читается сверху вниз и будет использован последний дубликат
Другой не менее опытный участник это полайкал. Судя по результатам викторины в виде опроса, так думает лишь четверть подписчиков. Правильно же ответили более 40%, что для моих викторин - отличный результат 😎
Я поинтересовался у автора заявления, как бы он его проверял. Тот предложил вписать в файл две строчки и пропинговать.
127.0.0.1 ya.ru
127.0.0.2 ya.ru
Я бы тоже так делал! И вот результат:
gc "C:\Windows\System32\drivers\etc\hosts" -Tail 2; ping ya.ru
127.0.0.1 ya.ru
127.0.0.2 ya.ru
Pinging ya.ru [127.0.0.1] with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
👉 Получается, что Windows использует первый адрес. И Linux тоже!
Разумеется, такое утверждение нужно снабжать примечаниями. Опрос не случайно ограничивался Windows и с оговоркой в общем случае и при прочих равных. На уровне ОС возможны исключения, хотя примеров у меня нет.
📄 Несколько человек поднимали вопрос о влиянии кэша DNS. Однако в соответствии с одной из старейших актуальных статей базы знаний Microsoft, Microsoft TCP/IP Host Name Resolution Order, клиент Windows смотрит в локальный файл hosts прежде чем опрашивать серверы DNS. Кэш DNS в статье явно не упомянут, но это производная от серверов.
Сторонние же программы могут применять свой алгоритм чтения файла hosts либо вообще игнорировать его. Например, разработчикам Firefox пришлось реализовывать свой парсер hosts, чтобы он не игнорировался при использовании встроенного в браузер резолвера DoH (спасибо,
dartraiden
). А в Linux всегда найдется какой-нибудь дистрибутив с альтернативной реализацией 🐧Я сам когда-то думал, что выигрывает последняя запись. Пока не столкнулся с этим по работе. У тестовых серверов поменялись IP-адреса, и я добавил новые записи в конец файла hosts. Однако рабочее приложение не смогло подключиться по доменному имени. Так и узнал ✌️
🚀 Ускорение загрузки файлов в PowerShell
Недавно я перепроверял давно опубликованный в блоге скрипт для скачивания файла с помощью #PowerShell, и слишком уж долго шла загрузка. Хочу поделиться решениями.
1️⃣ Отключение прогресса
В принципе, эта переменная может слегка ускорить процесс и снизить нагрузку на ЦП не только при скачивании файлов. Но конкретно для командлета
У этого командлета проблема наблюдается только в Windows PowerShell 5.1, но не в PowerShell Core. Я писал об этом в канале 7 лет назад :) И недавно краем глаза где-то видел, что якобы в 5.1 уже починили. Мои тесты это не подтверждают.
2️⃣ Подстановка юзер-агента
На самом деле даже без прогресса у меня
После этого скорость окончательно наладилась!
3️⃣ Загрузка с помощью BITS
В Windows помимо командлетов
Это не совсем про ускорение, а про альтернативы. Но в моем случае был сайт Microsoft, и родную BITS он не тормозил в отличие от
////
▶️ Скрипт для экспериментов:
Скрипт скачивает актуальный файл сигнатур защитника Windows с этой страницы. Но учтите, что для обновления сигнатур из консоли есть методы получше ✌️
Недавно я перепроверял давно опубликованный в блоге скрипт для скачивания файла с помощью #PowerShell, и слишком уж долго шла загрузка. Хочу поделиться решениями.
1️⃣ Отключение прогресса
$ProgressPreference = 'SilentlyContinue'
В принципе, эта переменная может слегка ускорить процесс и снизить нагрузку на ЦП не только при скачивании файлов. Но конкретно для командлета
Invoke-WebRequest
(псевдоним iwr
) разница значительная! Один и тот же файл размером 175 мегабайт без прогресса у меня на разных системах скачивался от 16 до 42 секунд, а с прогрессом - от 3 до 13 минут! 🤔У этого командлета проблема наблюдается только в Windows PowerShell 5.1, но не в PowerShell Core. Я писал об этом в канале 7 лет назад :) И недавно краем глаза где-то видел, что якобы в 5.1 уже починили. Мои тесты это не подтверждают.
2️⃣ Подстановка юзер-агента
На самом деле даже без прогресса у меня
Invoke-WebRequest
качал слишком долго. Я предположил, что сайт специально притормаживает отдачу, и решил прикинуться браузером. -UserAgent "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
После этого скорость окончательно наладилась!
3️⃣ Загрузка с помощью BITS
В Windows помимо командлетов
Invoke-WebRequest
и Invoke-RestMethod
также можно скачивать файлы с помощью Start-BitsTransfer
. Этот командлет запускает джоб с помощью службы BITS (фоновая интеллектуальная служба передачи данных). Именно ее использует центр обновления Windows.Это не совсем про ускорение, а про альтернативы. Но в моем случае был сайт Microsoft, и родную BITS он не тормозил в отличие от
iwr
без юзер-агента. ////
▶️ Скрипт для экспериментов:
$file = "$env:temp\mpam-fe.exe"
$uri = 'https://go.microsoft.com/fwlink/?LinkID=121721&arch=x64'
$u = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
$ProgressPreference = 'SilentlyContinue'
Measure-Command {
Invoke-WebRequest -Uri $uri -OutFile $file -UserAgent $u
}
Measure-Command {
Start-BitsTransfer -Source $uri -Destination $file
}
Скрипт скачивает актуальный файл сигнатур защитника Windows с этой страницы. Но учтите, что для обновления сигнатур из консоли есть методы получше ✌️
🔍 Расследование: кто перезагрузил Windows
В чате участник
У ТС все подробности свелись к "отхожу на несколько часов". Обычно, так быстро сразу после установки обновлений перезагрузка не происходит. Стандартно - в 3 часа ночи, но дальше может в любой момент вне активных часов 🕒
Проще проверить всё самому, и я зарядил виртуалку. За несколько часов ничего не произошло, как и с утра. Однако ночью я сплю, и моя основная ОС тоже, т.е. ВМ в ней неактивны. Поэтому наутро я изменил часовой пояс ВМ и продолжил тест.
👉 Перезагрузка произошла! Но чтобы обвинить в ней обновление Windows, надо ответить на второй по важности вопрос всех времен и народов: какие ваши доказательства?
Они собраны в журнале событий, поэтому пост публикуется в рубрике "Гадание по логам" с помощью #PowerShell.
1️⃣ Смотрим время загрузки ОС - сразу после 3 часов ночи. Уже горячо!
2️⃣ Выясняем, какие процессы это вызвали - событие
3️⃣ Проверяем связь с планировщиком - поиском по части имени файла
4️⃣ Но это еще не всё! Надо определить, был ли в это время выполнен вход пользователя в систему. Ведь политика должна предотвращать перезагрузку только в этом случае.
Здесь фильтруем события входа и выхода, затем ищем нужные по части SID - 1001 в конце у администраторов.
Событие 4647! Выход четко совпадает по времени с выполнением запланированного задания оркестратора. Указано, что пользователь инициировал выход, но это издержки регистрации в журналах. По факту он стал неактивен, не отреагировал вовремя на уведомление о перезагрузке, и его выход форсировали.
////
☑️ Итак, мы однозначно определили, что перезагрузку выполнил оркестратор обновлений, проигнорировав групповую политику и завершив пользовательский сеанс.
В Windows 10 политика
P.S. Неподдерживаемый обходной путь здесь.
В чате участник
A S.
сообщил, что в Windows 11 политика NoAutoRebootWithLoggedOnUsers
не предотвращает перезагрузку после установки обновлений. Статью про это я написал в 2018 году и с тех пор не перепроверял. Причем 4 года спустя эту политику наряду с другими объявили устаревшей и не поддерживаемой в Windows 11. И пообещали в будущем выпилить.У ТС все подробности свелись к "отхожу на несколько часов". Обычно, так быстро сразу после установки обновлений перезагрузка не происходит. Стандартно - в 3 часа ночи, но дальше может в любой момент вне активных часов 🕒
Проще проверить всё самому, и я зарядил виртуалку. За несколько часов ничего не произошло, как и с утра. Однако ночью я сплю, и моя основная ОС тоже, т.е. ВМ в ней неактивны. Поэтому наутро я изменил часовой пояс ВМ и продолжил тест.
👉 Перезагрузка произошла! Но чтобы обвинить в ней обновление Windows, надо ответить на второй по важности вопрос всех времен и народов: какие ваши доказательства?
Они собраны в журнале событий, поэтому пост публикуется в рубрике "Гадание по логам" с помощью #PowerShell.
1️⃣ Смотрим время загрузки ОС - сразу после 3 часов ночи. Уже горячо!
(Get-CimInstance Win32_OperatingSystem).LastBootUpTime
Sunday, February 2, 2025 3:01:46 AM
2️⃣ Выясняем, какие процессы это вызвали - событие
1074
в журнале Система:Get-WinEvent -FilterHashtable @{LogName='System'; Id=1074} |
Select-Object TimeCreated, Message | Format-List
TimeCreated : 2/2/2025 3:00:03 AM
Message :
The process C:\WINDOWS\uus\AMD64\MoUsoCoreWorker.exe (DESKTOP-GQKOJ6B)
has initiated the restart of computer DESKTOP-GQKOJ6B on behalf of
user NT AUTHORITY\SYSTEM for the following reason:
Operating System: Service pack (Planned)
Reason Code: 0x80020010
Shutdown Type: restart.
3️⃣ Проверяем связь с планировщиком - поиском по части имени файла
MoUsoCoreWorker
. Время совпадает!Get-ScheduledTask | where TaskName -match 'Uso' | Get-ScheduledTaskInfo
LastRunTime : 2/2/2025 3:00:05 AM
LastTaskResult : 2147942402
NextRunTime : 2/3/2025 10:48:35 PM
NumberOfMissedRuns : 0
TaskName : USO_UxBroker
TaskPath : \Microsoft\Windows\UpdateOrchestrator\
4️⃣ Но это еще не всё! Надо определить, был ли в это время выполнен вход пользователя в систему. Ведь политика должна предотвращать перезагрузку только в этом случае.
Здесь фильтруем события входа и выхода, затем ищем нужные по части SID - 1001 в конце у администраторов.
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624,4634,4647} |
where message -match '1001' | Select-Object Id, TimeCreated, Message -First 15 |
ft -AutoSize
Id TimeCreated Message
-- ----------- -------
4634 2/2/2025 3:20:10 AM An account was logged off....
4624 2/2/2025 3:03:05 AM An account was successfully logged on....
4647 2/2/2025 3:00:05 AM User initiated logoff:...
4624 2/1/2025 11:33:32 PM An account was successfully logged on....
Событие 4647! Выход четко совпадает по времени с выполнением запланированного задания оркестратора. Указано, что пользователь инициировал выход, но это издержки регистрации в журналах. По факту он стал неактивен, не отреагировал вовремя на уведомление о перезагрузке, и его выход форсировали.
////
☑️ Итак, мы однозначно определили, что перезагрузку выполнил оркестратор обновлений, проигнорировав групповую политику и завершив пользовательский сеанс.
В Windows 10 политика
NoAutoRebootWithLoggedOnUsers
продолжает выполнять свою функцию. А в Windows 11 уже нет поддерживаемого способа предотвратить форсированный перезапуск после установки обновлений. Единственный обходной путь - ручное планирование перезагрузки, что позволяет отложить ее максимум на неделю ✌️P.S. Неподдерживаемый обходной путь здесь.
🆘 О самостоятельной техподдержке в организации
Однажды в пятницу вечером мне написала коллега. Она уже полностью отчаялась решить проблему - её виртуальный десктоп Windows 365 завис при входе.
🤖 Сначала она долго пробивалась через чат-бота поддержки. Он сыпал бесполезными советами и отказывался звать человека.
Кожаные мешки в итоге оказались не лучше. Первый создал базовый инцидент, но уже второй закрыл его - якобы, вместо инцидента надо было создавать запрос (на самом деле - нет). Сам его создал, но повесил на неправильную группу. Та с лёгким сердцем его и закрыла 🤦♂️ Вообще, попадание тикета в нужные руки - это одна из нерешённых пока глобальных проблем человечества :)
Всё это происходило небыстро, и девушка пыталась повлиять на процесс с помощью своего менеджера. Тот сказал обращаться в поддержку.
Так прошло две недели 😱
У меня было два простых совета.
1️⃣ Создавать инциденты самостоятельно с помощью формы на портале, нежели через чат с ботом и затем с первой линией поддержки. Экономия времени значительная! Заодно в тикет идёт изложенная своими словами проблема, а не в пересказе туговатового сотрудника техподдержки, нанятого за 2 песо. Об этом написано в руководстве для сотрудников проекта, но кто ж его читает.
2️⃣ Перезагрузить виртуальный десктоп. Неважно, установлена Windows на физическом железе или на виртуальной машине - живительный ребут никто не отменял! Кстати, недавно случайно узнал, что некоторые коллеги не понимали значение слова reboot - слишком технический термин 🤷♂️
Но тут был интересный нюанс: как перезагрузить Windows, когда она висит на входе, а кнопки питания нет нигде? 🤔 Более того, эти десктопы в принципе настроены так, что из графического интерфейса Windows убраны все опции перезагрузки и выключения. И даже консольные блокируются за исключением одного - в PowerShell от администратора
👉 Однако облачные десктопы зачастую можно перезагрузить "снаружи". В данном случае нужно зайти на windows365.microsoft.com с аккаунтом организации. А там есть перезагрузка, откат к снимку системы и сброс. Это тоже было описано во внутреннем руководстве, кстати.
///
Вскорости после разговора коллега сообщила, что перезагрузка десктопа помогла, хотя и не сразу. Я не стал уточнять, что означала эта оговорка. Можно считать и сразу, когда за полчаса решаешь вопрос, с которым мучилась две недели ✅
Мораль вытекает из пунктов выше:
1. RTFM.
2. Перезагружайте Windows, прежде чем обратиться в техподдержку ✌️
Однажды в пятницу вечером мне написала коллега. Она уже полностью отчаялась решить проблему - её виртуальный десктоп Windows 365 завис при входе.
🤖 Сначала она долго пробивалась через чат-бота поддержки. Он сыпал бесполезными советами и отказывался звать человека.
Кожаные мешки в итоге оказались не лучше. Первый создал базовый инцидент, но уже второй закрыл его - якобы, вместо инцидента надо было создавать запрос (на самом деле - нет). Сам его создал, но повесил на неправильную группу. Та с лёгким сердцем его и закрыла 🤦♂️ Вообще, попадание тикета в нужные руки - это одна из нерешённых пока глобальных проблем человечества :)
Всё это происходило небыстро, и девушка пыталась повлиять на процесс с помощью своего менеджера. Тот сказал обращаться в поддержку.
Так прошло две недели 😱
У меня было два простых совета.
1️⃣ Создавать инциденты самостоятельно с помощью формы на портале, нежели через чат с ботом и затем с первой линией поддержки. Экономия времени значительная! Заодно в тикет идёт изложенная своими словами проблема, а не в пересказе туговатового сотрудника техподдержки, нанятого за 2 песо. Об этом написано в руководстве для сотрудников проекта, но кто ж его читает.
2️⃣ Перезагрузить виртуальный десктоп. Неважно, установлена Windows на физическом железе или на виртуальной машине - живительный ребут никто не отменял! Кстати, недавно случайно узнал, что некоторые коллеги не понимали значение слова reboot - слишком технический термин 🤷♂️
Но тут был интересный нюанс: как перезагрузить Windows, когда она висит на входе, а кнопки питания нет нигде? 🤔 Более того, эти десктопы в принципе настроены так, что из графического интерфейса Windows убраны все опции перезагрузки и выключения. И даже консольные блокируются за исключением одного - в PowerShell от администратора
Restart-Computer
. Но права админа просто так не дают.👉 Однако облачные десктопы зачастую можно перезагрузить "снаружи". В данном случае нужно зайти на windows365.microsoft.com с аккаунтом организации. А там есть перезагрузка, откат к снимку системы и сброс. Это тоже было описано во внутреннем руководстве, кстати.
///
Вскорости после разговора коллега сообщила, что перезагрузка десктопа помогла, хотя и не сразу. Я не стал уточнять, что означала эта оговорка. Можно считать и сразу, когда за полчаса решаешь вопрос, с которым мучилась две недели ✅
Мораль вытекает из пунктов выше:
1. RTFM.
2. Перезагружайте Windows, прежде чем обратиться в техподдержку ✌️
⚙️ Как удалить ассоциацию программы с типом файлов
В чате
Вариантов регистрации много. Самый простой и работающий с незапамятных времен - программа прописывает себя в разделе
ℹ️ В случае с файлами без расширения - раздел будет
В нашем случае автор вопроса в безуспешных попытках решить проблему удалил раздел
Но заодно создалась другая. Она не волновала ТС, хотя это скорее исключение. Теперь даже легитимно связанные с программой типы файлов в ней не откроются, потому что их расширения в реестре ссылаются на отсутствующий раздел. Кроме того, остался нераскрытым вопрос, почему даже после удаления раздела
Во время диагностики я позабыл про один нюанс. В разделе HKCR выполняется регистрация приложения с типом файлов на уровне системы. Далее, если у пользователя нет других программ, связанных с этим расширением, файл откроется сразу. Иначе появится выбор из всех зарегистрированных приложений.
Пользовательская регистрация расширений прописана в разделе
Для каждого расширения там есть подразделы:
•
•
•
✅ Отсюда следует решение вынесенного в заголовок вопроса.
🔹 Если вы желаете сменить одну зарегистрированную программу на другую, не нужно лезть в реестр. Это можно сделать из диалога "Открыть с помощью" (за исключением файлов без расширений).
🔹 Если вы хотите удалить пользовательские ассоциации и убрать указатели на них в "Открыть с помощью", зачищайте подразделы
🔹 Если требуется удалить системную связь программы с расширением, анализируйте раздел
У проблемной программы был еще один нюанс. После своего обновления она восстанавливала ассоциации файлов. В таком случае придется регулярно зачищать их скриптом. Альтернатива - отобрать разрешения на пользовательский раздел реестра по такой же схеме как с нежелательным значком OneDrive в панели навигации проводника ✌️
В чате
Zubastic
задал этот вопрос в контексте файлов без расширения - некая программа предательски захватила ассоциацию с ними.Вариантов регистрации много. Самый простой и работающий с незапамятных времен - программа прописывает себя в разделе
HKCR\ProgramName
, в том числе команду на запуск в разделе HKCR\ProgramName\shell\open\command
. А для каждого расширения вносит указатель на этот раздел в HKCR\.ext
, где ext
- расширение. ℹ️ В случае с файлами без расширения - раздел будет
HKCR\.
. По умолчанию он отсутствует. Более того, Windows не позволяет вам создать его путем "Открыть с помощью": для файлов без расширений нет опции всегда открывать этой программой! Однако вот пример связи таких файлов с блокнотом по описанной выше схеме старыми добрыми командами assoc
и ftype
.assoc .=NoExtFile
ftype NoExtFile="notepad.exe" "%1"
В нашем случае автор вопроса в безуспешных попытках решить проблему удалил раздел
HKCR\.
, тем самым уничтожив указатель на программу. А назвать свой подраздел в HKCR она могла как угодно. С помощью Process Monitor мы определили конкретное название раздела - HKCR\PhotonWorkShop
. После его удаления проблема решилась ☑️Но заодно создалась другая. Она не волновала ТС, хотя это скорее исключение. Теперь даже легитимно связанные с программой типы файлов в ней не откроются, потому что их расширения в реестре ссылаются на отсутствующий раздел. Кроме того, остался нераскрытым вопрос, почему даже после удаления раздела
HKCR\.
файлы без расширения продолжали открываться в этой программе 🤷♂️Во время диагностики я позабыл про один нюанс. В разделе HKCR выполняется регистрация приложения с типом файлов на уровне системы. Далее, если у пользователя нет других программ, связанных с этим расширением, файл откроется сразу. Иначе появится выбор из всех зарегистрированных приложений.
Пользовательская регистрация расширений прописана в разделе
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\
Для каждого расширения там есть подразделы:
•
OpenWithList
- список программ в "Открыть с помощью"•
OpenWithProgids
- список зарегистрированных программ или отсылка к типу файлов в HKCR•
UserChoice
- текущая программа по умолчанию, выбранная пользователем (при наличии - преобладает над подразделами выше)✅ Отсюда следует решение вынесенного в заголовок вопроса.
🔹 Если вы желаете сменить одну зарегистрированную программу на другую, не нужно лезть в реестр. Это можно сделать из диалога "Открыть с помощью" (за исключением файлов без расширений).
🔹 Если вы хотите удалить пользовательские ассоциации и убрать указатели на них в "Открыть с помощью", зачищайте подразделы
OpenWithProgids
и OpenWithList
в HKCU. В этом случае при открытии файла будут отображаться системные ассоциации ↓🔹 Если требуется удалить системную связь программы с расширением, анализируйте раздел
HKCR\.ext
. Там тоже могут быть подразделы OpenWithProgids
и OpenWithList
. Универсального рецепта здесь нет ввиду различных способов регистрации.У проблемной программы был еще один нюанс. После своего обновления она восстанавливала ассоциации файлов. В таком случае придется регулярно зачищать их скриптом. Альтернатива - отобрать разрешения на пользовательский раздел реестра по такой же схеме как с нежелательным значком OneDrive в панели навигации проводника ✌️
😎 Сегодня у меня для вас рекомендации по автообрастаниям и автосхрюнку (или автохрюнку, это неточно :)
И не отрежьте там себе ничего автосхромкой! 🪚
Microsoft прогрессирует - переходит от ручного ухуренивания к автоухрюнку.
Этот #автоперевод документации SQL Server прислал Romchik Alekseev ✌️
И не отрежьте там себе ничего автосхромкой! 🪚
Microsoft прогрессирует - переходит от ручного ухуренивания к автоухрюнку.
Этот #автоперевод документации SQL Server прислал Romchik Alekseev ✌️
▶️ Простой и эффективный поиск текста в PowerShell - Select-String
По работе нередко возникают задачи, связанные с поиском текста в разрозненных источниках. Например, есть сервис, который работает потихоньку и пишет логи с ежедневной ротацией. В какой-то момент обнаруживается сбой и связанная ошибка в логе. Нужно узнать, когда это происходило за некий срок. А после исправления проблемы убедиться, что она не воспроизводится.
Как правило, люди открывают Notepad++, загружают туда пачку логов и выполняют поиск во всех открытых файлах. На предложение использовать скрипт пожимают плечами - мол, это же разовая задача. И так сойдет 👌
У этого подхода много проблем:
1. Медленно.
2. Не выгружается сводка и найденные данные.
3. При большом количестве / размере файлов это работает плохо или вообще никак.
Да и не разовая это у них задача, поэтому скрипт подходит отлично.
👉 В #PowerShell для этой цели есть командлет
Срыва покровов здесь нет, но есть нюанс. Его я замечал раньше в рамках гугления, а сейчас вижу в скриптах чат-ботов и джунов, что примерно одно и то же :)
🤖 Чат-боту задача по поиску текста ставится общими словами. Например, найди все строки с 'exception ' в этих файлах, посчитай количество на каждый файл, запиши в файл эту строку и 20 следующих, выведи на экран сводку и т.д.
И бот быстро пишет рабочий скрипт. Только он зачастую использует другой командлет -
Простое сравнение. Ищем ошибку '0x800f0805' десяти файлах
У меня
💡 И кстати по поводу контекста, у
////
В общем, если вам нужно дальше работать с чистыми найденными строками в качестве объектов,
🍪 Бонус - #классика канала про мониторинг логов в реальном времени при помощи:
• командлета PowerShell
• утилиты CMTrace
По работе нередко возникают задачи, связанные с поиском текста в разрозненных источниках. Например, есть сервис, который работает потихоньку и пишет логи с ежедневной ротацией. В какой-то момент обнаруживается сбой и связанная ошибка в логе. Нужно узнать, когда это происходило за некий срок. А после исправления проблемы убедиться, что она не воспроизводится.
Как правило, люди открывают Notepad++, загружают туда пачку логов и выполняют поиск во всех открытых файлах. На предложение использовать скрипт пожимают плечами - мол, это же разовая задача. И так сойдет 👌
У этого подхода много проблем:
1. Медленно.
2. Не выгружается сводка и найденные данные.
3. При большом количестве / размере файлов это работает плохо или вообще никак.
Да и не разовая это у них задача, поэтому скрипт подходит отлично.
👉 В #PowerShell для этой цели есть командлет
Select-String
. Он умеет искать простое совпадение или регулярное выражение.Select-String -Path 'C:\logs\*.log*' -Pattern '0x800f0805' -SimpleMatch
Select-String -Path 'C:\logs\*.log*' -Pattern '0x800f0805|0x80070490'
Срыва покровов здесь нет, но есть нюанс. Его я замечал раньше в рамках гугления, а сейчас вижу в скриптах чат-ботов и джунов, что примерно одно и то же :)
🤖 Чат-боту задача по поиску текста ставится общими словами. Например, найди все строки с 'exception ' в этих файлах, посчитай количество на каждый файл, запиши в файл эту строку и 20 следующих, выведи на экран сводку и т.д.
И бот быстро пишет рабочий скрипт. Только он зачастую использует другой командлет -
Get-Content
и передает весь массив на поиск командлету Where-Object
. А для такой задачи это неэффективно - слишком медленно!Простое сравнение. Ищем ошибку '0x800f0805' десяти файлах
cbs.log
общим объемом около 1.2GB.$logpath = "C:\temp\logs\*cbs*.log"
Measure-Command {
$a = Select-String -Path $logpath -Pattern '0x800f0805' -SimpleMatch
}
$a.count
Measure-Command {
$b = Get-Content -Path $logpath | where $_ -match '0x800f0805'
}
$b.count
У меня
Select-String
справился за 7.5 секунд, а Get-Content | where
понадобилось 4 мин и 40 секунд.💡 И кстати по поводу контекста, у
Select-String
есть очень полезный параметр -Context
, который выводит строки до и после найденного совпадения.Select-String -Path $logpath -Pattern 'exception ' -SimpleMatch -Context 2,20
////
В общем, если вам нужно дальше работать с чистыми найденными строками в качестве объектов,
Get-Content
имеет смысл. Но просто для поиска текста Select-String
вполне достаточно. И да, можно сказать чат-боту, чтобы применял конкретный командлет!🍪 Бонус - #классика канала про мониторинг логов в реальном времени при помощи:
• командлета PowerShell
• утилиты CMTrace
Docs
Select-String (Microsoft.PowerShell.Utility) - PowerShell
The Select-String cmdlet uses regular expression matching to search for text patterns in input strings and files. You can use Select-String similar to grep in Unix or findstr.exe in Windows. Select-String is based on lines of text. By default, Select-String…
⚙️ Об изменениях в создании локальной учётной записи при установке Windows
В конце прошлой недели всплыли две новости.
1️⃣ Файл
2️⃣ Нашлась другая короткая команда, которая открывает диалог создания локальной учётной записи.
На первом экране OOBE нажмите
Предположу, что это выпилят довольно быстро - может не дожить до 25H2. И напомню, что все это время неизменно рабочим способом остаётся файл ответов. Его можно применять:
🔹 с первого этапа установки
🔹 для автоматизации этапа OOBE
Учите матчасть ✌️
В конце прошлой недели всплыли две новости.
1️⃣ Файл
bypassnro.cmd
выпилят из дистрибутива 25H2. Сам метод пока работать не перестанет, но вместо одной короткой команды для запуска файла придётся вводить две, которые в нём содержались. Это внесение изменений в реестр и перезагрузка.2️⃣ Нашлась другая короткая команда, которая открывает диалог создания локальной учётной записи.
На первом экране OOBE нажмите
Shift+F10
, ткните в окно командной строки и введите:start ms-cxh:localonly
Предположу, что это выпилят довольно быстро - может не дожить до 25H2. И напомню, что все это время неизменно рабочим способом остаётся файл ответов. Его можно применять:
🔹 с первого этапа установки
🔹 для автоматизации этапа OOBE
Учите матчасть ✌️
This media is not supported in your browser
VIEW IN TELEGRAM
☁️ OneDrive: как исключить определенные типы и имена файлов из синхронизации
Допустим, вы синхронизируете в облако папки "Рабочий стол" с двух разных компьютеров. Их содержимое смешивается. Это неудобно, когда у вас там ярлыки на разные программы либо на папки, которые не входят в сферу синхронизации. С таким подтекстом
🐞 В принципе, в параметрах клиента OneDrive есть настройка для исключения расширений. Но с ней есть две проблемы:
1. Расширения должны состоять не менее чем из трех символов. Например,
2. Настройка не работает :) По крайней мере так, как люди ожидают. Множество жалоб в интернете подтвердили, что это не просто моя локальная проблема. Некоторые также правят INI-файл политик клиента, но безуспешно.
///
👉 Мы пойдем другим путем © У OneDrive есть групповые политики, и в изданиях Pro и выше можно решить вопрос политикой Exclude specific kinds of files from being uploaded (Исключить отправку определенных видов файлов).
⚠️ Учтите, что:
1. Политика применится только к новым файлам, то есть не будут исключаться уже существующие файлы, втч переименованные после включения политики. Поэтому придется навести порядок руками - например, пересоздать ярлыки.
2. Политика работает только с именами файлов и не действует на имена папок. Но папки можно исключить в настройках клиента.
3. Чтобы эта и другие политики OneDrive отобразились в графическом интерфейсе
⚙️ Изменения в реестр можно внести из консоли от имени администратора или REG-файлом. В этих примерах не будут синхронизироваться ярлыки и файлы с именем вроде
После внесения изменений в реестр перезапустите клиент OneDrive и ваш файловый менеджер.
Теперь можете закинуть в папку OneDrive несколько попадающих под действие политики файлов и убедиться, что они получили особый статус и значок. В тултипе поясняется, что файл исключен из синхронизации ✌️
Допустим, вы синхронизируете в облако папки "Рабочий стол" с двух разных компьютеров. Их содержимое смешивается. Это неудобно, когда у вас там ярлыки на разные программы либо на папки, которые не входят в сферу синхронизации. С таким подтекстом
Aliaksandr
задал в чате вынесенный в заголовок вопрос, хотя звучал он совсем иначе.🐞 В принципе, в параметрах клиента OneDrive есть настройка для исключения расширений. Но с ней есть две проблемы:
1. Расширения должны состоять не менее чем из трех символов. Например,
md
не исключить.2. Настройка не работает :) По крайней мере так, как люди ожидают. Множество жалоб в интернете подтвердили, что это не просто моя локальная проблема. Некоторые также правят INI-файл политик клиента, но безуспешно.
///
👉 Мы пойдем другим путем © У OneDrive есть групповые политики, и в изданиях Pro и выше можно решить вопрос политикой Exclude specific kinds of files from being uploaded (Исключить отправку определенных видов файлов).
⚠️ Учтите, что:
1. Политика применится только к новым файлам, то есть не будут исключаться уже существующие файлы, втч переименованные после включения политики. Поэтому придется навести порядок руками - например, пересоздать ярлыки.
2. Политика работает только с именами файлов и не действует на имена папок. Но папки можно исключить в настройках клиента.
3. Чтобы эта и другие политики OneDrive отобразились в графическом интерфейсе
gpedit.msc
, нужно закинуть административные шаблоны из папки с клиентом OneDrive в %systemroot%\PolicyDefinitions
. Но прямая правка реестра работает и без этого.⚙️ Изменения в реестр можно внести из консоли от имени администратора или REG-файлом. В этих примерах не будут синхронизироваться ярлыки и файлы с именем вроде
mytest.txt
.reg add "HKLM\SOFTWARE\Policies\Microsoft\OneDrive\EnableODIgnoreListFromGPO" /v "*.lnk" /t REG_SZ /d "*.lnk" /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\OneDrive\EnableODIgnoreListFromGPO" /v "*test*" /t REG_SZ /d "*test*" /f
После внесения изменений в реестр перезапустите клиент OneDrive и ваш файловый менеджер.
Теперь можете закинуть в папку OneDrive несколько попадающих под действие политики файлов и убедиться, что они получили особый статус и значок. В тултипе поясняется, что файл исключен из синхронизации ✌️
💩 За кулисами создания г-сборки Windows (SE17E06)
Я регулярно поднимаю тему г-сборок в канале:
• затрагивал их экономику,
• разбирал "хорошие" г-сборки
• и относительно недавно заглядывал за кулисы
А тут не смог пройти мимо ещё одного повода, тем более не только у меня брови поднялись.
Есть известный в определённых кругах разработчик
А еще он делает г-сборки 😎 Не удивлюсь, если в неофициальном рейтинге г-сборщиков он входит в топ. Внезапно в своем канале он сорвал покровы с интимного процесса изготовления. И там было такое... Орфография и пунктуация автора сохранены.
Я не оспариваю тормоза проводника, они и без больших нагрузок есть 🤷♂️ Но в качестве препятствия для создания г-сборок это звучит очень странно.
Действительно, зачем обновлять и защищать от вирусов систему, на которой создаются сборки с целью выложить их для других людей. И так сойдет! 👌
Я регулярно поднимаю тему г-сборок в канале:
• затрагивал их экономику,
• разбирал "хорошие" г-сборки
• и относительно недавно заглядывал за кулисы
А тут не смог пройти мимо ещё одного повода, тем более не только у меня брови поднялись.
Есть известный в определённых кругах разработчик
rgadguard
, чьи полезные ресурсы неоднократно фигурировали у меня в блоге (тут) и канале (раз, два, три). Такие проекты приносят пользу сообществу, а разработчику - уважение и хорошую репутацию.А еще он делает г-сборки 😎 Не удивлюсь, если в неофициальном рейтинге г-сборщиков он входит в топ. Внезапно в своем канале он сорвал покровы с интимного процесса изготовления. И там было такое... Орфография и пунктуация автора сохранены.
Операционная система - Windows Server 2022 Datacenter
Почему установлена не последняя версия операционной системы, а всё по тому, при больших нагрузка, есть эффект подтормаживание проводника.
Я не оспариваю тормоза проводника, они и без больших нагрузок есть 🤷♂️ Но в качестве препятствия для создания г-сборок это звучит очень странно.
Также проведены операции, как полностью отключения Defender (с помощью Defender Remover) и отключение автоматического обновления (с помощью WUMT).
Действительно, зачем обновлять и защищать от вирусов систему, на которой создаются сборки с целью выложить их для других людей. И так сойдет! 👌
⚙️ Нюансы применения ZDP во время установки Windows
В терминологии Microsoft термин ZDP - это Zero Day Patch или Zero Day Package или Zero Day Priority [update] в зависимости от источника.
Осенью 2024 года я анализировал причину долгой установки Windows. Очень внимательный читатель Олег поймал меня на несоответствии. Его внимание привлекла эта фраза:
Первым делом обновляется сам OOBE - пакетом OOBE ZDP.
⌛️ Подписчик перешел по ссылке в блог Рэймонда Чена. И процитировал мне, что ZDP служит вовсе не для исправления багов OOBE. Это некий пакет самых критичных исправлений ОС для установки на этапе OOBE. Он должен быть маленьким, чтобы побыстрее установиться.
📄 Однако Чен писал в 2016 году, и с тех пор много воды утекло! Текущая реальность в журналах установки. Я пообещал Олегу разбор в канале. И сегодняшний пост публикуется в рубриках "гадание по логам" и "доставка пруфов"!
Нас интересуют файлы из папки
• setupact.log (фрагмент) с основными событиями установки ОС
•
🖼 Далее комментарии к строкам второго файла, из них на картинку вошли 442 - 462.
106 - загружается ZDP Plugin
442 - ожидаем результатов поиска от WU ZDP
443 - нашлось одно обновление (это KB5046683 для OOBE, строка 69 во фрагменте основного логе)
450 - установка успешная
451 - требуется перезагрузка
453 - пошли события после перезагрузки
На этом упоминания ZDP заканчиваются! Дальше идет установка последнего накопительного обновления (LCU).
462 - начат поиск срочных обновлений
495 - идет загрузка KB5044284
ℹ️ При установке с файлом ответов этого не происходит.
////
На основе этих логов я и сделал выводы:
1️⃣ Посредством OOBE ZDP сейчас обновляется только сам процесс OOBE, и это действительно маленький пакет.
2️⃣ Критические обновления ОС и сервисный стек устанавливаются в рамках стандартного LCU.
Разумеется, последней инстанцией здесь являются разработчики. Но получить их комментарии невозможно. Однако логи установки Windows весьма подробные, а их анализ - хорошее упражнение ✌️
В терминологии Microsoft термин ZDP - это Zero Day Patch или Zero Day Package или Zero Day Priority [update] в зависимости от источника.
Осенью 2024 года я анализировал причину долгой установки Windows. Очень внимательный читатель Олег поймал меня на несоответствии. Его внимание привлекла эта фраза:
Первым делом обновляется сам OOBE - пакетом OOBE ZDP.
⌛️ Подписчик перешел по ссылке в блог Рэймонда Чена. И процитировал мне, что ZDP служит вовсе не для исправления багов OOBE. Это некий пакет самых критичных исправлений ОС для установки на этапе OOBE. Он должен быть маленьким, чтобы побыстрее установиться.
📄 Однако Чен писал в 2016 году, и с тех пор много воды утекло! Текущая реальность в журналах установки. Я пообещал Олегу разбор в канале. И сегодняшний пост публикуется в рубриках "гадание по логам" и "доставка пруфов"!
Нас интересуют файлы из папки
C:\Windows\Panther
(ссылки на pastebin):• setupact.log (фрагмент) с основными событиями установки ОС
•
UnattendGC\
setupact.log с событиями ОOBE🖼 Далее комментарии к строкам второго файла, из них на картинку вошли 442 - 462.
106 - загружается ZDP Plugin
442 - ожидаем результатов поиска от WU ZDP
443 - нашлось одно обновление (это KB5046683 для OOBE, строка 69 во фрагменте основного логе)
450 - установка успешная
451 - требуется перезагрузка
453 - пошли события после перезагрузки
На этом упоминания ZDP заканчиваются! Дальше идет установка последнего накопительного обновления (LCU).
462 - начат поиск срочных обновлений
495 - идет загрузка KB5044284
ℹ️ При установке с файлом ответов этого не происходит.
////
На основе этих логов я и сделал выводы:
1️⃣ Посредством OOBE ZDP сейчас обновляется только сам процесс OOBE, и это действительно маленький пакет.
2️⃣ Критические обновления ОС и сервисный стек устанавливаются в рамках стандартного LCU.
Разумеется, последней инстанцией здесь являются разработчики. Но получить их комментарии невозможно. Однако логи установки Windows весьма подробные, а их анализ - хорошее упражнение ✌️
🔓 О папке C:\inetpub
Обычно она создаётся при включении необязательных компонентов IIS (встроенные в Windows веб-сервер и FTP-сервер). Однако после апрельского накопительного обновления внимательные люди обнаружили папку в клиентских и серверных Windows даже при выключенных компонентах IIS.
Спустя пару дней популярные сетевые издания сообщили со слов Microsoft, что так и задумано, а удалять папку не следует вне зависимости от наличия включённого IIS. И действительно, 10 апреля в статью с описанием уязвимости CVE-2025-21204: Windows Process Activation Elevation of Privilege Vulnerability безопасники Microsoft добавили специальное примечание:
After installing the updates listed in the Security Updates table for your operating system, a new %systemdrive%\inetpub folder will be created on your device. This folder should not be deleted regardless of whether Internet Information Services (IIS) is active on the target device. This behavior is part of changes that increase protection and does not require any action from IT admins and end users.
ℹ️ Дело тут серьёзное. В соответствии со статьёй, используя изъян в стеке Windows Update, злоумышленник с локальным доступом может легко повысить свои привилегии с обычных до системных. Это называется Elevation of Privilege, EoP.
Слабость классифицируется как CWE-59: Improper Link Resolution Before File Access ('Link Following'). И это похоже на очередную уязвимость в обработке ярлыков Windows, т.е. файлов .LNK. Среди наиболее заметных уязвимостей LNK с EoP из прошлого: CVE-2010-2568 и CVE-2017-8464. Но они были куда опаснее тем, что позволяли удалённое повышение привилегий.
🤔 Казалось бы, предотвращение уязвимости путём создания папки выглядит несерьёзно. Но с одной стороны, Microsoft заявляет это лишь как одну из мер. А с другой - это может быть достаточным временным (надеюсь 🙂) решением до реализации более существенного исправления.
⚙️ Вероятно, уязвимость эксплуатируется путём создания файлов .LNK в C:\inetpub. После установки обновления (и при включении IIS, если на то пошло) для записи в папку и её удаления требуются права системы, TrustedInstaller или администратора.
То есть теперь злоумышленник с ограниченными правами не может ни создать в ней файлы для эксплуатации уязвимости, ни заменить её на свою папку. См. картинку.
////
В общем, лучше папку не удалять. Если она мозолит глаза, сделайте её скрытой и системной. Если же вы удалили папку и теперь жалеете, есть пара вариантов:
🔹 Удалите апрельское накопительное обновление и установите его заново
🔹 Включите любой компонент IIS (это создаст папку) - клонируйте ACL во временную папку - выключите IIS и перезагрузитесь - создайте папку вручную - клонируйте ACL из временной папки. Разрешения будут не один к одному, но обычного пользователя ограничат.
Ещё можно попробовать дождаться следующего накопительного обновления. Однако я могу лишь предположить, что оно восстановит папку, но не гарантировать. Да и лучше не сидеть месяц с уязвимостью ✌️
P.S. Спустя полтора месяца, Microsoft выпустила скрипт #PowerShell для создания папки с нужными разрешениями NTFS: Set-InetpubFolderAcl.
Обычно она создаётся при включении необязательных компонентов IIS (встроенные в Windows веб-сервер и FTP-сервер). Однако после апрельского накопительного обновления внимательные люди обнаружили папку в клиентских и серверных Windows даже при выключенных компонентах IIS.
Спустя пару дней популярные сетевые издания сообщили со слов Microsoft, что так и задумано, а удалять папку не следует вне зависимости от наличия включённого IIS. И действительно, 10 апреля в статью с описанием уязвимости CVE-2025-21204: Windows Process Activation Elevation of Privilege Vulnerability безопасники Microsoft добавили специальное примечание:
After installing the updates listed in the Security Updates table for your operating system, a new %systemdrive%\inetpub folder will be created on your device. This folder should not be deleted regardless of whether Internet Information Services (IIS) is active on the target device. This behavior is part of changes that increase protection and does not require any action from IT admins and end users.
ℹ️ Дело тут серьёзное. В соответствии со статьёй, используя изъян в стеке Windows Update, злоумышленник с локальным доступом может легко повысить свои привилегии с обычных до системных. Это называется Elevation of Privilege, EoP.
Слабость классифицируется как CWE-59: Improper Link Resolution Before File Access ('Link Following'). И это похоже на очередную уязвимость в обработке ярлыков Windows, т.е. файлов .LNK. Среди наиболее заметных уязвимостей LNK с EoP из прошлого: CVE-2010-2568 и CVE-2017-8464. Но они были куда опаснее тем, что позволяли удалённое повышение привилегий.
🤔 Казалось бы, предотвращение уязвимости путём создания папки выглядит несерьёзно. Но с одной стороны, Microsoft заявляет это лишь как одну из мер. А с другой - это может быть достаточным временным (надеюсь 🙂) решением до реализации более существенного исправления.
⚙️ Вероятно, уязвимость эксплуатируется путём создания файлов .LNK в C:\inetpub. После установки обновления (и при включении IIS, если на то пошло) для записи в папку и её удаления требуются права системы, TrustedInstaller или администратора.
То есть теперь злоумышленник с ограниченными правами не может ни создать в ней файлы для эксплуатации уязвимости, ни заменить её на свою папку. См. картинку.
////
В общем, лучше папку не удалять. Если она мозолит глаза, сделайте её скрытой и системной. Если же вы удалили папку и теперь жалеете, есть пара вариантов:
🔹 Удалите апрельское накопительное обновление и установите его заново
🔹 Включите любой компонент IIS (это создаст папку) - клонируйте ACL во временную папку - выключите IIS и перезагрузитесь - создайте папку вручную - клонируйте ACL из временной папки. Разрешения будут не один к одному, но обычного пользователя ограничат.
Ещё можно попробовать дождаться следующего накопительного обновления. Однако я могу лишь предположить, что оно восстановит папку, но не гарантировать. Да и лучше не сидеть месяц с уязвимостью ✌️
P.S. Спустя полтора месяца, Microsoft выпустила скрипт #PowerShell для создания папки с нужными разрешениями NTFS: Set-InetpubFolderAcl.
Опрос: применяете ли вы генеративный ИИ (ChatGPT, Midjourney и т.п.) для повышения продуктивности в своей работе или учебе?
Anonymous Poll
26%
Да, регулярно
22%
Да, иногда
15%
Да, редко
13%
Нет, но хотелось бы
14%
Нет, работа не подразумевает такого
7%
Нет, я отрицаю ИИ
4%
Моего варианта тут нет
▶️ Как быстро искать по различным параметрам служб Windows
И не только служб. И не только в Windows!
В чате Николай посетовал :
Когда они сделают сквозной поиск по службам Windows. Ну то есть по всем атрибутам служб. Я вот не могу запомнить как какая служба называется в русскоязычном интерфейсе. Вывели хотя бы в оснастке столбец "Отображаемое имя", но нет.
В диспетчере задач Windows 11 есть приличный сквозной поиск по службам. Но отображаемого имени там нет. И многих прочих параметров тоже.
👉 Николаю сразу посоветовали #PowerShell - командлет
Это самый настоящий графический интерфейс! Здесь есть:
🔹 сквозной фильтр по всем параметрам
🔹 тонкие критерии фильтров
🔹 сортировка по столбцам
По умолчанию выводится всего три параметра служб: имя, отображаемое имя и статус. Все доступные параметры можно отобразить так:
Дальше вы можете управлять набором столбцов в графическом интерфейсе. И да, их можно сразу перечислить в
🏷 Наконец, можно сделать ярлык на такую "оснастку".
////
Этот прием можно применять и к другим оснасткам. Именно так я ковыряюсь в дебрях планировщика Windows. Потому что динамическая фильтрация рулит!
Продолжая пост про задания планировщика, вот список всех заданий с командами:
Разумеется, этот способ не ограничивается оснастками MMC и вообще ОС Windows. Применяйте командлет
И не только служб. И не только в Windows!
В чате Николай посетовал :
Когда они сделают сквозной поиск по службам Windows. Ну то есть по всем атрибутам служб. Я вот не могу запомнить как какая служба называется в русскоязычном интерфейсе. Вывели хотя бы в оснастке столбец "Отображаемое имя", но нет.
В диспетчере задач Windows 11 есть приличный сквозной поиск по службам. Но отображаемого имени там нет. И многих прочих параметров тоже.
👉 Николаю сразу посоветовали #PowerShell - командлет
Get-Service
для получения сведений о службах. Однако ТС хотел графический интерфейс и отрицал этот способ. Тогда я добавил еще один командлет - Out-GridView:Get-Service | Out-GridView
Это самый настоящий графический интерфейс! Здесь есть:
🔹 сквозной фильтр по всем параметрам
🔹 тонкие критерии фильтров
🔹 сортировка по столбцам
По умолчанию выводится всего три параметра служб: имя, отображаемое имя и статус. Все доступные параметры можно отобразить так:
Get-Service | Select-Object * | Out-GridView
Дальше вы можете управлять набором столбцов в графическом интерфейсе. И да, их можно сразу перечислить в
select
. 🏷 Наконец, можно сделать ярлык на такую "оснастку".
////
Этот прием можно применять и к другим оснасткам. Именно так я ковыряюсь в дебрях планировщика Windows. Потому что динамическая фильтрация рулит!
Get-ScheduledTask | Select-Object * | Out-GridView
Продолжая пост про задания планировщика, вот список всех заданий с командами:
$tasklist = @()
Get-ScheduledTask | ForEach-Object {
$task = [xml](Export-ScheduledTask -TaskName $_.URI)
$taskdetails = New-Object -Type Psobject -Property @{
"Name" = $_.URI
"Action" = $task.Task.Actions.Exec.Command
}
$tasklist += $taskdetails
}
$tasklist | Select-Object Name,Action | Out-GridView
Разумеется, этот способ не ограничивается оснастками MMC и вообще ОС Windows. Применяйте командлет
Out-GridView
для анализа любых табличных наборов данных! ✌️