Windows 11, 10, etc - Вадим Стеркин
13.8K subscribers
279 photos
5 videos
8 files
1.04K links
Авторский канал. Windows, безопасность, мобильный мир:
• тайное знание
• профессиональный ликбез
• гадание по логам
• срыв покровов
• доставка пруфов

Чат: @winsiders
Блог: outsidethebox.ms
Oбратная связь: @vsterkin
Поддержать ₽: boosty.to/sterkin
Download Telegram
▶️ Как массово удалить папки, распакованные из архивов

В чате участник Павел задал такой вопрос:
В папке ~450 разных файлов, папок и архивов *.rar. Периодически рары разархивируются, и получается папка с тем же именем, что и rar. Стоит задача удалить эти папки, оставив при этом архивы. Как отсортировать, чтобы снизу папки сразу был её родительский архив?

Очевидно, он рассматривал вариант сортировки в файловом менеджере. Хотя надо сразу смотреть в сторону #PowerShell. Для начинающих это отличное практическое упражнение! Впрочем, этому унылому занятию Павел предпочел ожидание поста в канале 😎

Я бы решал задачу в лоб:
1. Отбираем только папки.
2. Для каждой проверяем наличие архива с таким же именем, "приклеивая" к имени папки расширение.
3. При совпадении удаляем.

$folders = Get-ChildItem -Path "C:\test" -Directory
foreach ($folder in $folders) {
if (Test-Path "$($folder.FullName).rar")
{Remove-Item $folder -Recurse -WhatIf}
}


Василий Гусев предложил нестандартное решение - группировка! 🤔 Мне оно в голову не пришло, хотя я трижды показывал Group-Object в блоге:
поиск дубликатов драйверов
выборка уникальных ссылок с веб-страниц
замена дубликатов файлов на жесткие ссылки

Доработав идею, я получил такой конвейер:
1. Группируем по имени папки и файлы без расширения с помощью свойства BaseName.
2. Отбираем группы, где с одинаковыми именами ровно два объекта - файл и папка!
3. Из каждой группы выбираем папки и удаляем их.

Get-ChildItem -Path "C:\test" | Group-Object -Property BaseName |
Where-Object {$_.Count -eq '2'} | ForEach-Object {$_.group} |
Where-Object {$_.Attributes -eq 'Directory'} | Remove-Item -Recurse -WhatIf


⌛️ Примечательно, что с обоими способами перекликается #классика блога Как массово переименовать файлы по маске в PowerShell. Там я склеивал имя файла из фрагментов, одним из которых было свойство BaseName.

🤖 И неудивительно, что ChatGPT тоже задействовал это свойство, когда я поставил задачу перед ним. Он пошел тем же путем что и я, но выбрал перебор архивов нежели папок и создал побольше переменных. В свою очередь чат-бот Bing практически повторил мой способ. Но для определения папки он использовал старое свойство объекта PSIsContainer (параметр -Directory у dir доступен более 10 лет, с версии 3.0).

Короче, получив направление в PowerShell, Павел мог сразу спросить чат-бота. И не дожидаться, пока кожаный мешок опубликует решение его простенькой задачи в канале ✌️
🔒 О ПИН-коде для удобства

Посмотрите на картинку↓ Это - варианты входа в Windows. Причем способы, относящиеся к Windows Hello, обозначены явно. Вроде все правильно, но есть нюанс © В левом верхнем углу написано, что вход выполнен с локальным аккаунтом. А в этом случае пометку "Windows Hello" с ПИН-кода следовало бы снять, потому что проверка подлинности работает иначе! 👈

Заметьте, что вход с паролем к Windows Hello не относится. Microsoft давно опубликовала статью Почему ПИН-код лучше пароля, хотя изначально в тексте пароль не имел приставки "онлайн". Там много говорится о преимуществах ПИН-кода над локальными паролями, но ни разу не упоминается локальный аккаунт.

👉 На самом деле при использовании локальной учетной записи ПИН-код служит для удобства. У Microsoft он так и называется - convenience PIN. Потому что процесс аутентификации отличается от учетной записи Microsoft (MSA) и аккаунтов Windows Hello for Business (WHfB).

ℹ️ Покровы срывает документ Common questions about Windows Hello for Business. Русский машинный перевод сойдет.

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

⚙️ Не случайно, когда форсируется вход с Windows Hello, вариант входа с паролем пропадает и у локальных учетных записей, в том числе автологон. Это лишь в Параметрах написано, что Windows Hello требуется для MSA. А по факту настройка распространяется на всю систему.

Кстати, в том же документе Microsoft говорится, что технология WHfB не предназначена для работы с локальными учетными записями. И внезапно там же нашлось объяснение алгоритма, предотвращающего использование простых ПИН-кодов, о котором я писал в блоге.

В заключение, основная #классика блога по теме:
🔹 ПИН-код в Windows
🔹 Нюансы допустимых ПИН-кодов в Windows
🔹 Нюансы беспарольного входа в Windows
🔹 Как включить автоматический вход в Windows
⚙️ Диагностика проблемы с созданием файлов загрузки в разметке GPT

Сегодня в рубрике "Возвращаясь к напечатанному" #классика блога про восстановление загрузки в разметке GPT. В тот раз, получив ошибку bcdboot при создании загрузки, я зрительно определил помеху - "лишний" раздел EFI на другом диске. Но не всегда причина очевидна.

Недавно в чат поддержки пришёл человек с проблемой загрузки. У него был подключен только один диск. Но даже после пересоздания раздела EFI команда завершалась ошибкой Сбой при копировании файлов загрузки.

👉 На такой случай у bcdboot есть ключ -v, выводящий подробный ход операции. И сразу стало видно, что не найден файл c:\Windows\Boot\PCAT\bootmgr

Утилита же не берет файлы из воздуха. Для создания конфигурации загрузки она используют в качестве источника оффлайн систему. В папке PCAT также не было еще нескольких файлов. Когда их скопировали с другой системы, bcdboot отработала как положено.

Впрочем, это не решило исходную проблему, потому что в ОС не оказалась множества других ключевых файлов. Но это уже другая история ✌️
⚙️ О развитии утилиты diskusage

Сегодня в рубрике "Возвращаясь к напечатанному" утилита для анализа дискового пространства, входящая в поставку Windows 11. Три года назад я публиковал в блоге подробный разбор ключевых функций.

На тот момент утилита только появилась в предварительных сборках, и у меня был ряд нареканий. С тех пор основные недочеты устранили. Давайте пройдемся по улучшениям!

⚙️ Определение размера системных файлов
На смену ключу /systemAndReserve пришли два:
/systemFile[:N] для отображения служебных системных файлов
/reserved для зарезервированного пространства

Ключ /systemFile[:N] отображает системные файлы, которые обычно не видны в файловых менеджерах:
diskusage /systemFile:15 /humanReadable

Результат команды на картинке↓ В отчет входят служебные файлы NTFS, включая $MFT и $UsnJrnl. В целом очень похоже на вывод:
fsutil volume allocationreport C:

Этот ключ также закрыл вопрос с теневыми копиями, которые утилита изначально могла отображать только при запуске от имени системы. Пути вида C:\{GUID}{GUID} — это теневые копии. Вроде, это первая комплектная утилита, которая показывает размер отдельных теней.

Да, хотелось бы видеть папку System Volume Information в рамках вывода самых больших папок, /TopDirectory[:N]. Но и на том спасибо 👌

⚙️ Определение объема зарезервированного пространства
Ключ /reserved, как и его предшественник, не срабатывает в сочетании с [некоторыми] другими. Если смотреть отдельно, быстрее всего натравить утилиту на пустую папку:
diskusage C:\new /reserved /humanReadable

У меня в одной из систем объем зарезервированного пространства по сведениям утилиты отличается от цифры в параметрах на 1.5 GB. При этом он почти совпадает с объёмом первой из трёх зарезервированных областей:
fsutil storagereserve query C:

В остальных тестовых системах вывод в целом соответствует значению в параметрах. Да и так известно, что резервируется около 7 GB. Но такие разночтения не повышают доверие к результатам.

🔗 Переход по символическим ссылкам и соединениям
Изначально это было поведением по умолчанию, а выключалось оно ключом /skipReparse. Я отметил, что логично было сделать наоборот.

Действительно, впоследствии стали игнорировать символические ссылки и соединения, для явного перехода по ним добавили ключ /reparse, а ключ /skipReparse убрали из справки.

📃 Изменения в синтаксисе
Для указания значений перешли от знака равно к двоеточию. Было /TopDirectory=25, стало /TopDirectory:25. Впрочем, старый синтаксис пока тоже работает.

Все ключи: было | стало.

////
Я стараюсь поддерживать все материалы блога в актуальном состоянии. Вот и на сей раз #классика блога обновлена.

И да, я знаю, о чем вы сейчас думаете: "Зачем все это, если есть TreeSize, WinDirStat, Scanner и т.д." 🤔

Однако у встроенной консольной утилиты есть два неоспоримых преимущества:
🔹 работа в огороженной системе, где нельзя просто взять и скачать стороннее ПО
🔹 дистанционная помощь без лишних телодвижений: "выполни команду - покажи результат"
❄️ TechNet Wiki - в архиве документации!

11 лет назад на MVP Open Days 💨 нас зазывали в авторы новоиспеченной TechNet Wiki под соусом “Пишите, и о вас узнает весь мир!”. На вопрос, как этому помогут фактически обезличенные записи, последовал незамысловатый ответ: “Ваши материалы будут на сайте Microsoft! И вообще, индусы и китайцы с радостью!”

👉 Архив https://learn.microsoft.com/en-us/archive/technet-wiki/

Спасибо за наводку Вадимсу Подансу - говорит, там было что-то годное про PKI.

Архив не индексируется поисковиками, а внутренний поиск еще совсем недавно был сломан примерно год. Но не уничтожили, и на том спасибо!

#Классика блога и канала по теме:
🔹 Сохраняем исчезающие блоги Microsoft MSDN и TechNet
🔹 Как найти исчезнувшие статьи базы знаний Microsoft
🔹 Архив видео Channel 9
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ winget: исключение приложений из массового обновления

Сегодня в рубрике "Возвращаясь к напечатанному" команда pin менеджера пакетов winget. Разбирая нюансы автоматического обновления приложений осенью 2022 года, я сетовал на отсутствие такой фичи в winget. Ее добавили летом 2023 года в качестве отдельной команды.

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

🔹 Закрепление
winget pin add powertoys

Вместо имени пакета можно использовать --id. Команда исключает приложения из обновления командой winget upgrade --all, но позволяет включить их разово ключом --include-pinned. Также работает обновление отдельного пакета: winget upgrade powertoys.

🔹 Блокировка
winget pin add powertoys --blocking

В этом случае обновление пакета (отдельно или массово) возможно лишь с ключом --force либо после снятия закрепления:
winget pin remove powertoys

🔹 Диапазон версий
winget pin add --id powertoys --version 0.70.*

Здесь все версии 0.70.ххх не будут обновляться. Обход ключом --force.

Наконец, можно посмотреть все исключения:
winget pin list

А также массово сбросить их:
winget pin reset --force

#Классика блога обновлена. Но помимо команды pin есть и другие улучшения. В ближайшее время я еще раз обновлю статью и расскажу об этом в канале ✌️
⚙️ Облачная переустановка поверх в параметрах Windows 11

Осенью 2019 года в Windows появилась функция облачного сброса. Тогда я доставил ПМу, что куда полезнее была бы функция переустановки поверх, которая сохраняет программы и настройки в отличие от сброса.

По его просьбе я отправил развёрнутые аргументы в центр отзывов, и ныне удаленное предложение набрало более 100 голосов 👍 Это очень много для такой технической функции. На русском языке я озвучил тезисы в канале. Прочтите их, чтобы прочувствовать важность фичи!

🎉 И спустя 4.5 года в параметрах появилась облачная переустановка поверх!

Фичу доставили в рамках обновления Moment 5. Она описана в статье базы знаний KB5036436. Помимо прочего там:

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

🔄 Прогресс загрузки установочных файлов и ход установки отображаются в центре обновления. В целом - это стандартный процесс переустановки поверх, хотя и без присущих ему экранов. Кстати, в РФ фича обретает дополнительную ценность на фоне препятствий загрузке MCT и ISO.

Но есть и ложка дегтя 🤷‍♂️ Поскольку процесс завязан на Windows Update, неподдерживаемые конфигурации блокируются. И не прокатит обходной путь AllowUpgradesWithUnsupportedTPMOrCPU, т.к. он для установки с флэшки.

Так или иначе, фича ценная, и новость отличная! #Классика блога про переустановку поверх обновлена ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🏃‍♂️ Запуск программ от имени администратора из диалога Run (Выполнить)

Вопрос из форума. Срыва покровов тут нет, но всегда найдутся те, кто не в курсе новинок 6- и 15-летней давности :)

👉 Ctrl + Shift + Enter!

Разумеется, запрос UAC появится. Это #классика канала, см. здесь контекст и дополнительное ускорение. Жаль, что в адресную строку проводника это не прикрутили. Ведь там текущий путь передается в консоль.

ТС однако ответ не устроил, ибо не работает в 1607 🤦‍♂️ Что ж, можно и поглубже копнуть. Есть классика времен в Windows 7 - запуск из планировщика, причем без запроса UAC! Поскольку ссылка не у всех откроется где надо, скопирую суть сюда.

🕑 В планировщике создаётся задание:
schtasks /Create /RL Highest /TN Run /SC ONCE /ST 14:00 /TR "cmd.exe /c start %WINDIR%\SysWOW64\rundll32.exe shell32.dll,#61"

И запускается:
schtasks /run /tn Run

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

▶️ Вне диалога "Выполнить" для отдельных приложений запуск с полными правами можно форсировать так:

🔹 В свойствах EXE на вкладке "Совместимость" или в свойствах ярлыка - "Дополнительно" поставить флажок "Запускать от имени администратора".

🔹 Задействовать в #PowerShell командлет Start-Process и его глагол RunAs:
powershell -ex bypass -command Start-Process notepad -Verb RunAs

Разумеется, для этой цели есть и другие встроенные способы (да хоть VBS с тем же глаголом), а также куча сторонних утилит.

#Классика блога в тему:
🔸 Как выполнять задачи с полными правами обычным пользователем без ввода пароля администратора
🔸 Как выполнять команды и скрипты от имени системы средствами Windows
🔸 Как выполнять скрипты с правами TrustedInstaller без сторонних утилит
✔️ Как сверить контрольную сумму дистрибутива Windows с первоисточником

Технически контрольная сумма нужна, чтобы убедиться в целостности скачанного ISO. Но сначала его нужно найти. Для чего как раз идеально подходит контрольная сумма 😎

Контрольные суммы ISO есть в каждой торрент-раздаче - это для доверчивых. Более придирчивые смотрят в https://msdn.rg-adguard.net/. В идеале же надо сверять с первоисточником - Microsoft.

Когда-то контрольные суммы были в свободном доступе на сайте MSDN. Но их спрятали за подпиской в 2017 году одновременно с переездом на домен VisualStudio. Однако в какой-то момент публичный доступ вернули. Требуется лишь вход с учетной записью Microsoft. Спасибо ԤИОНЕР за наводку!

Процесс показан на видео. Пример ссылки:
https://my.visualstudio.com/Downloads?q=Windows%2011

Выбрать утилиту для сверки вам поможет #классика блога: Как проверить контрольную сумму дистрибутива Windows ✌️
⚙️ Как быстро восстановить разрешения на файл или папку

Недавно в чат поддержки пришел человек, который собственноручно сломал разрешения файла hosts. Он творил полную дичь - пытался сделать этот файл только для чтения, чтобы не слетел некий кряк 🤦‍♂️

Зато у меня появился повод показать один из моих любимых примеров мощи конвейеров в #PowerShell. От имени администратора:

cd C:\Windows\System32\drivers\etc
Get-Acl networks | Set-Acl hosts


В оригинале была одна команда, но так нагляднее. Перейдя в папку с файлами, берем список контроля доступа (ACL) у соседнего файла networks и применяем его к поврежденному hosts. Это всё! Восстанавливаются разрешения на объект файловой системы и его владелец.

ℹ️ Параметр -Path для пути к файлу я опустил. У этих командлетов он первый позиционный, т.е. подразумевается, если не указан. Такие вещи описаны в справке.

Проблему автора вопроса это решило, но ничему не научило. Уже через 5 минут он спросил, как изменить владельца родительской папки etc. Потому что не получалось сохранить измененный файл hosts 🤦‍♂️🤦‍♂️ В его инструкциях же не уточнялось, что текстовый редактор надо запускать от админа...

Вообще, правка разрешений нужна крайне редко. А для внесения изменений в файлы или реестр она фактически не требуется. На такой случай у меня есть отличная #классика блога с быстрым и грамотным способом выполнения операций с правами SYSTEM и TrustedInstaller ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 Что нового в Windows 11 24H2 для ИТ-специалистов и разработчиков

Для начала всем интересующимся Windows рекомендую большие подборки Community (RU) и Winaero (EN).

ℹ️ Для ИТ-специалистов у Microsoft есть статья What's new in Windows 11, version 24H2 с ценным упоминанием о новой иконке диспетчера задач и эффекте Mica в его настройках :) Отмечу многочисленные изменения в SMB и LAPS, а также новинку - Personal Data Encryption (PDE). Это корпоративное шифрование пользовательских папок на уровне файлов под крылом Windows Hello и под управлением Intune.

Для разработчиков я нашел изменения в:
API электропитания в той же статье для IТ Pro
доступе к Wi-Fi и местоположению
разработке драйверов

В остальном Microsoft делает упор на ИИ - NLP, OCR, живые субтитры, Recall.

////

Помимо списка ссылок расскажу про два заинтересовавших меня нововведения в 24H2.

🔁 Чекпойнты накопительных обновлений
Первый выпуск Windows 11 привнес ряд заметных улучшений в накопительные обновления. В 24H2 процесс эволюционировал. До сих пор при доставке обновлений дельта вычислялась относительно состояния компонентов в [условном] RTM.

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

Сокращение размера обновлений будет наиболее заметным в сценарии, когда новая версия ОС доставляется постепенно в рамках накопительных обновлений и включается тумблером. Так было с Windows 11 23H2 и Windows 10 многократно. Теперь #тумблер будут выпускать наряду с чекпойнтом. Он и станет базой для следующих накопительных обновлений, нежели прошлогодний RTM.

Подробнее в блоге IT Pro 📃

▶️ Sudo для Windows
Тут пошли по стопам Linux. Если выполнить с обычными правами, например: fsutil fsinfo ntfsinfo C:, будет ошибка из-за недостатка прав. Придется перезапускать консоль с полными правами.

Включив sudo в настройках разработчика в Параметрах, можно в той же консоли добавить sudo к команде: sudo fsutil fsinfo ntfsinfo C:, одобрить запрос UAC и получить результат!

Подробнее о параметрах sudo для Windows в документации 📃

Запрос UAC придется одобрять каждый раз. В этом заметное отличие UX от Linux, где после ввода пароля его не просят для sudo на протяжении N минут (настраивается) 🐧

Кэш учетных данных есть в gsudo, которая также может повышать команды #PowerShell. Нативная утилита sudo этого не умеет, но у меня есть #классика блога: sudo и resudo в PowerShell ✌️