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

Чат: @winsiders
Блог: outsidethebox.ms
ЛС: @vsterkin
Донаты ₽: boosty.to/sterkin
РКН: https://clck.ru/3LBugC
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, т.к. он для установки с флэшки.

Так или иначе, фича ценная, и новость отличная! #Классика блога про переустановку поверх обновлена ✌️
🔎 Новое в блоге: Дело о долгой перезагрузке Windows

Казалось, Холмс совсем отошел от дел. Он строго-настрого наказал миссис Хадсон отправлять всех визитеров в Скотланд-Ярд. А сам предавался курению трубки, игре на скрипке и своему новому увлечению — поездкам по вечернему Лондону на электрическом велосипеде. Однако в то утро посетители оказались исключительно настойчивыми.

Выйдя на шум, мы столкнулись с запыхавшейся миссис Хадсон: «Мистер Холмс, эти джентльмены заявляют, что никуда не уйдут, пока не получат вашу аудиенцию. Они уверены, что вы их примете. Не могу же я поселить их внизу!». Понизив голос, она доверительно добавила: «Они в штатском, но думаю, что это военные».

Холмс незаметно посмотрел сверху на посетителей и, кажется, узнал одного из них: «Что ж, пригласите их ко мне».


Читайте продолжение:
https://boosty.to/sterkin/posts/dc8a99a5-e05b-42f3-9b75-a23f976af067

///

Да, Холмс возвращается после 8-летнего перерыва! Эта детективная история написана специально для фанатов серии и всех кому действительно интересно мое творчество 🖊

У меня в Boosty немного платных подписчиков, поэтому скучно ограничивать рассказ для широкой аудитории столь узким кругом. Вы можете прочесть этот детектив не только по подписке, но и просто поддержав меня разовым взносом 🤝

Если у вас нет возможности или желания это делать, вся #классика блога доступна без ограничений https://www.outsidethebox.ms/tag/sherlock-holmes/

Приятного чтения✌️
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 ✌️
⚙️ Установка Windows 11 с локальной учетной записью

👉 С учетом изменений в версии 24H2

Интернет и учетная запись Microsoft (MSA) теперь заложены в официальные системные требования Windows. В домашнее издание Windows 11 - с версии 21H2, а в профессиональное - с 22H2 (сборка 22557). Первую попытку форсировать это компания сделала еще в Windows 10 1903.

Я пользуюсь MSA, но всегда выполняю установку с локальным аккаунтом, чтобы контролировать имя профиля.

Рабочие способы обойти ограничение

В любых изданиях:

🔹 Выполняйте установку, не подключаясь к сети. На первом экране OOBE нажмите Shift+F10, щелкните окно командной строки и введите oobe\bypassnro. Подробнее в отдельном посте.

🔹 Используйте файл ответов - #классика блога в помощь. См. также статью блога об автоматизации OOBE.

Только в изданиях Pro и выше:

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

////

Начиная с версии Windows 11 24H2 не работает вход в учетную запись Microsoft 1@1.ru с паролем 1. Ранее, если MSA не существует или заблокирована, открывался путь в локальную учетную запись. Теперь этот путь блокирует новый экран с предложением сбросить пароль.
🆕 Что нового в 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 ✌️
🔎 Как очистить историю поисковых запросов в меню Пуск

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

Казалось бы, простой вопрос, но ответ не лежит на поверхности.

ℹ️ Для начала поиск в Пуске - это фактически отдельное приложение Поиск (Win+S). Именно в него вы переключаетесь, когда в Пуске ищете приложения или настройки либо выполняете поиск в интернете. Все недавние запросы видны сразу при открытии поиска любым способом.

В статье базы знаний KB4553482 есть раздел "Журнал поиска на этом устройстве" с инструкциями по очистке из Параметров. Также в интернетах можно найти совет сбросить приложение Client.CBS (Feature Experience Pack) из #PowerShell:

Get-AppPackage -Name MicrosoftWindows.Client.CBS | Reset-AppxPackage

Якобы все это удаляет историю поисковых запросов в меню Пуск. И это даже правда. Но есть нюанс © Эти действия очищают историю запросов приложения Поиск, хранящуюся локально 💻

Как следствие, это еще не конец нашей истории, а только середина!

☁️ В приложение Поиск возможен вход с учетной записью Microsoft (MSA). Из коробки это происходит автоматически при:
• использовании MSA в Windows вместо локального аккаунта
• первом входе с MSA в любое приложение Microsoft, что влечет за собой вход с этим аккаунтом во все приложения компании

👤 Визуально связь с облачным аккаунтом определяется по аватарке в правом верхнем углу поиска. И в этом случае все поиски в интернете сохраняются в облаке. Более того, там собраны все запросы в Bing, где бы вы их ни делали.

👉 При использовании MSA очистка локальной истории и сброс Client.CBS не помогут убрать из списка поиски в интернете. Потому что вся история Bing заново подтянется в локальное хранилище из облачного аккаунта! Историю поиска в интернете надо удалять в настройках конфиденциальности учетной записи Microsoft, а именно - в истории поиска!

Если внимательно присмотреться к истории запросов dartraiden, там явно не взрослый мужик, а школьники что-то ищут в интернете 😎 Как выяснилось, это "аккаунт, купленный за копейки для доступа к геймпассу". То есть им пользуется множество людей. Поэтому история будет активно пополняться чужими запросами в любом случае!

Кардинальное решение - локально отключить все обращения к Bing политикой или твиком реестра, тут #классика блога в помощь! Это полностью разрывает связь с облаком - поиск перестает подкачивать историю запросов в Bing и веб-содержимое, обретая аскетичный вид. А поиски приложений и настроек можно очистить из Параметров.

The End ✌️
🚀 Как закрепить произвольный файл в меню Пуск

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

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

1. На рабочем столе щелкните правой кнопкой мыши - Создать - Ярлык
2. Впишите: explorer "полный путь к файлу тут"
3. Задайте ярлыку значок и закрепите его в меню Пуск

Файл откроется в сопоставленном с ним приложении. Вместо explorer можно указывать в кавычках полный путь к конкретному приложению, если оно поддерживает в качестве параметра командной строки путь к файлу.

💡 Из этой же серии #классика канала:
Как добавить ярлык интернета в Пуск
Закрепляемый ярлык на любой элемент Параметров
Как создать ярлык на магазинное приложение на панели файлового менеджера
Как открыть конкретный файл в приложении, отличном от приложения по умолчанию
😎 Как открыть "Мой компьютер" двойным щелчком по ярлыку

Что? Да :) Вопрос задал в чате Андрей Третьяков. Компьютер уже не "мой", а "этот". И ярлык уже по дефолту скрыт с рабочего стола (включается в Win+R - desk.cpl ,5). И все же...

Андрей заметил, что в Windows 11 не всегда открывается новое окно со списком дисков и устройств. Иногда на передний план выходит имеющееся окно проводника с последней активной вкладкой.

Я потыкал и определил, что такое поведение наблюдается, когда этот компьютер уже открыт в одной из вкладок! Убрав значок с рабочего стола, девелоперы забыли про него. С глаз долой - из сердца вон! 🤦‍♂️

Сочетание клавиш Win+E работало четко, но Андрею хотелось бы мышью. Что ж, есть пара вариантов.

🟡 Долго и неудобно: ПКМ на значке компьютера - Показать дополнительные параметры - Открыть в новом процессе. Можно сразу открывать старое меню с Shift+ПКМ, но это уже с клавиатурой.

🟢 Быстро и просто: создать новый ярлык с командой:
explorer shell:MyComputerFolder

#Классика блога про папки shell в помощь.

////

Проблема воспроизводилась в чистой установке Windows 11 24H2, но у меня ушла с ноябрьским обновлением 26100.2314. Хотя у Андрея все еще наблюдалась в декабрьском превью 26100.2454.

👉  Так или иначе, вопрос решает explorer.exe. И он регулярно приходит на выручку, когда сталкиваешься с ограничениями графического интерфейса!

Пруфы в канале:
Как закрепить произвольный файл в меню Пуск
Как добавить ярлык интернета в Пуск
Закрепляемый ярлык на любой элемент Параметров
Как создать ярлык на магазинное приложение на панели файлового менеджера
Как открыть конкретный файл в приложении, отличном от приложения по умолчанию
▶️ Простой и эффективный поиск текста в PowerShell - Select-String

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

Как правило, люди открывают 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
⚙️ Как избавиться от предупреждения в проводнике при копировании файлов на диск, отформатированный в ext4

Этот вопрос задал в чате Юрий. Он переносил файлы на внешний диск с файловой системой ext4 и получал на каждый исполняемый файл такой запрос:

Вы действительно хотите переместить файл без его свойств?

Я сходу предложил использовать консольные средства. Например, в #PowerShell можно копировать файлы и папки командлетом Copy-Item. И это сработало! ☑️

Однако Юрий не желал каждый раз лезть в консоль. Мол, он регулярно копирует файлы с локального диска на внешний. Что ж, для регулярных задач синхронизации файлов в Windows испокон веков есть прекрасная утилита командной строки robocopy! ☑️

Но и это Юрия не устроило. И сторонние файловые менеджеры тоже отметались :) Он оказался маководом и хотел амазинга просто копировать в проводнике. Он также сообщил, что нагуглил в качестве решения утилиту NTFS Stream Explorer. Но опять же, в ней требовались ручные действия перед копированием.

////

ℹ️ Здесь в самый раз подходила #классика блога Альтернативные потоки данных NTFS. Юрий нашел в ней твик реестра, но тот не помог. Тогда все-таки пришлось читать, вникать, и вскоре мы увидели примерно такую картину. Я сохранил смысл, но в качестве примера взял свой файл из папки Downloads и сократил вывод до сути.

Get-Item -Path .\*keep*exe -Stream * | 
Select-Object pschildname,stream

PSChildName Stream
----------- ------
KeePass-2.57-Setup.exe::$DATA :$DATA
KeePass-2.57-Setup.exe:SmartScreen SmartScreen


Сразу прояснилось множество деталей:
1. Альтернативный поток NTFS пишет SmartScreen.
2. Исполняемый файл скачан в Microsoft Edge, что вытекает из п. 1 и проверяется чтением потока.
3. Потока с идентификатором зоны нет. Он уже удален либо запись отключена политикой ↓
4. Твик с политикой "Не хранить сведения о зоне..." бессилен против п. 1.

Тут школьники посоветуют "отключить SmartScreen". Причем в такой формулировке неочевидно, что конкретно отключать. Однако снижение уровня безопасности (особенно у маковода :) - это не наш путь.

////

Избавиться от предупреждения в проводнике можно без твиков / политик и отключений функций безопасности. Мы знаем, что при загрузке в любом браузере файлы получают поток с идентификатором зоны. Кроме того, в Microsoft Edge к исполняемым файлам свой поток пишет SmartScreen.

Решение укладывается в одну команду. В примере потоки от SmartScreen и диспетчера вложений удаляются из всех файлов в папке "Загрузки" рекурсивно. После чего проводник уже не суетится при их копирование на ext4.

Get-ChildItem -Path $env:USERPROFILE\downloads\ -File -Recurse | Remove-Item -Stream *SmartScreen*, *Zone.Identifier*

Это можно поставить в планировщик хоть ежечасно. В простом задании исполняемым файлом будет powershell, а аргументами

-NoProfile -Ex Bypass -Command "Get-ChildItem -Path $env:USERPROFILE\downloads\ -File -Recurse | Remove-Item -Stream *SmartScreen*, *Zone.Identifier*"

Скрытие консольных окон я разбирал четыре года назад, и с тех пор ничего не изменилось. ✌️
▶️ Тонкая настройка защитника Windows с помошью PowerShell

В чате участник Demon спросил, почему защитник Windows удаляет файлы из папки, добавленной в исключения. Я запросил вывод PowerShell:

Get-MpThreat
Get-MpPreference | ft ExclusionPath

Первая команда показывает обнаруженные угрозы, а вторая - исключенные из мониторинга пути. Выяснилось, что исключена папка E:\Games, но удаленный файл лежал в одной из ее подпапок. Защитник определил его как HackTool:Win32/Crack.

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

ℹ️ В #PowerShell вы можете получить сведения о параметрах защитника командлетом Get-MpPreference. И есть еще два для установки параметров:

Add-MpPreference добавляет значения к существующему набору настроек.
Set-MpPreference задает свой набор настроек, перезаписывая текущий.

Оба поддерживают подстановочные символы * и ?. Но есть нюанс © У вас не получится добавить в исключения все дочерние папки рекурсивно так:

Add-MpPreference -ExclusionPath E:\Games\*

Это исключает только папки одного уровня вложенности. Два уровня - E:\Games\*\* и т.д. Поддерживается максимум 6 подстановочных символов. Подробнее смотрите в документации с примерами.

////

В рамках того же обсуждения Piter Pen посетовал, что защитник непоследовательно реагирует на различные угрозы. Одни отправляет в карантин, другие удаляет 🤷‍♂️

Мне кажется, что раньше в графическом интерфейсе были базовые настройки для действий в зависимости от серьезности угрозы. Возможно, их выпилили. Но это неважно, ведь есть PowerShell ♥️

Текущие настройки можно посмотреть так:

Get-MpPreference | Select-Object *action


HighThreatDefaultAction : 0
LowThreatDefaultAction : 0
ModerateThreatDefaultAction : 0
SevereThreatDefaultAction : 0
UnknownThreatDefaultAction : 0


Ноль означает действие по умолчанию в зависимости от предпочтений Microsoft, заданных сигнатурами. Это написано в справке Set-MpPreference.

Там же перечислены числовые значения для семи различных действий защитника. Например, 2 - карантин, 3 - удаление, 9 - игнорирование. Это помогает понять текущий уровень настроек.

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

Set-MpPreference -SevereThreatDefaultAction Quarantine


////

Не стоит воздевать руки к небу, что конечным пользователям не дали тонко настроить компонент в графическом интерфейсе. Когда касается безопасности, я только за! Потому что для неопытных людей это кончается стрельбой в ногу, а то и в голову.

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

В качестве завершающего аккорда здесь идеально подходит #классика блога О роли головного мозга в защите операционной системы ✌️
🛡️ Автоматическое определение установщиков в UAC

С момента появления в Windows Vista контроль учетных записей эволюционировал с каждой новой версией ОС. Сегодня в фокусе малоизвестное, но любопытное нововведение времен Windows 10.

ℹ️ Исполняемые файлы должны содержать манифест, где указаны требования к правам пользователя на запуск. Если там прописано requireAdministrator, вы не запустите программу без полных прав.

Манифест с highestAvailable породит запрос UAC у администраторов, но не у ограниченных пользователей. Однако такую программу можно запустить с обычными правами методом RunAsInvoker. #Классика блога в помощь: Зачем программам нужны установщики.

👉 Именно с установщиками и связано изменение UAC в Windows 10. Запрос появляется, когда манифест не содержит требования к правам, а имя исполняемого файла содержит: setup, install, update, patch!

Это работает только с 32-разрядными файлами, причем имя файла - не единственный триггер. Все критерии эвристики описаны в документации. Ссылка ведет на веб-архив 2017 года, потому что из текущей версии статьи это уже выпилено 🙄 В Windows 11 работает, разумеется.

📝 Заметка на полях: в обоих документах заявляют возможность смены часового пояса без прав администратора. Что в 2025 году нам выдают за новую фичу :)

Возвращаясь к UAC, это изменение идеально подходило бы для Windows 7. Для Vista жести и так хватало, а в 2015 году 64-разрядные программы уже пошли в массы. Впрочем, 32-разрядных и сейчас еще в немало. Легаси полно в корпоративной среде, ради которой это все и затевалось.

На видео фича в действии. Я взял первую попавшуюся 32-разрядную утилиту NirSoft, в которой манифест не диктует права на запуск