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

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

https://devblogs.microsoft.com/oldnewthing/20201110-00/?p=104434

Рэймонд Чен как всегда прекрасен 👍
​​😎 В диалоговом окне "Открыть" в поле "Имя файла" можно указывать прямую ссылку на файл из интернета

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

Происходящее несложно отследить в Process Monitor с фильтром по пути.
1. Когда вы вставляете и открываете URL, в дело вступает служба WebClient.
2. В процессе закачки создается файл во временной папке в кэше IE.
3. Полностью скачанный файл перемещается в %temp% и передается приложению.

Этапы я пометил на картинке. И да, я в курсе, что Telegram сам подтягивает файл, если отправить прямую ссылку на нее в чат или канал. Картинка просто иллюстрирует анализ фичи Windows ✌️

👍 - о, что-то новенькое!
👌 - я все это знаю
▶️ PowerShell vs. CMD: автоматизация задач с датами

В форуме скриптов я регулярно вижу людей, пытающихся решать разнообразные задачи с датами с помощью CMD. Точнее, они приходят в форум, чтобы кто-то за них решал :)

Я понимаю, что далеко не все такие задачи формируются с нуля. Нередко люди пытаются модифицировать имеющиеся или найденные в сети скрипты для решения насущной проблемы. И тем не менее...

В #PowerShell вывод Get-Date варьируется в зависимости от региональных настроек ОС, как и %date% в CMD. Но в CMD это заканчивается тупиком или немыслимыми костылями, а в PowerShell все только начинается 👌

К дате элементарно добавляются или вычитаются из нее дни, часы, минуты и секунды:
(Get-Date).AddDays(-1)

А формат даты легко приводится к желаемому виду:
"{0:dd.MM.yyyy}" -f (Get-Date)

Знания этих двух моментов может быть достаточно для решения разнообразных задач. Вот человек в форуме хочет с помощью CMD каждый день копировать из одной папки в другую вчерашний файл с именем вида ДД.ММ.ГГГГ.doc.

Опытный скриптовик решит задачу и на CMD - зацените его код 👀 Мне до него как до Луны, я могу написать лишь корявенький ванлайнер на PowerShell
copy C:\1\$(-join("$("{0:dd.MM.yyyy}" -f (Get-Date).AddDays(-1))", ".doc")) C:\2

Он же в более наглядном виде:
$source = "C:\source"
$target = "C:\target"
$format = "{0:dd.MM.yyyy}" #10.09.2020
$filename = -join("$($format -f (Get-Date).AddDays(-1))", ".doc")
Copy-Item -Path $source\$filename -Destination $target


Кстати, сегодня 333й день года:
(Get-Date -Year 2020 -Month 11 -Day 28).DayOfYear
✌️

#PowerShellvsCMD
​​⚙️ Новое в блоге: Смена канала активации Windows 10

По работе столкнулся с занятным сценарием. Конечные пользователи сами устанавливают #Windows10 Pro из Media Creation Tool, пропуская ввод ключа продукта. Дальше в дело должны были вступить Intune и KMS, но что-то пошло не так ©

➡️ Читать в блоге: http://www.outsidethebox.ms/20619/
​​⚙️ Новая групповая политика Teams: Restrict sign in to Teams to accounts in specific tenants

В жестко контролируемой корпоративной среде запуск или работу Teams можно блокировать политиками AppLocker или WDAC, либо на фаерволе. Когда возникает бизнес-необходимость, эти ограничения снимаются.

Однако Teams также доступен для личного использования - на iOS/Android с июня 2020 г., а на Windows - с 19 ноября.

ℹ️ Как следствие, возрастает риск утечки конфиденциальных данных, поскольку пользователь может войти в Teams с личным аккаунтом. Новая политика предотвращает такой сценарий, ограничивая возможность входа списком конкретных клиентов (организаций).

Политика входит в набор административных шаблонов для Microsoft 365 Apps for enterprise.

Пользуясь случаем, хочу передать привет своему ИТ-отделу ✌️
​​⚙️ О Feature Experience Pack

На этой неделе стало понятно, как Microsoft планирует использовать загадочный Windows Feature Experience Pack, версия которого теперь красуется в сведениях о системе.

ℹ️ Этот пакет представляет собой компонент по требованию (Feature on Demand, FOD). Его не видно в Параметры - Приложения - Дополнительные компоненты. Однако он задокументирован, да и #PowerShell покажет:
Get-WindowsCapability -Name '*ShellCom*' -Online

В блоге инсайдерской программы сообщили о доставке новой версии компонента в канал Beta. Обновление в частности привнесло в оболочку нововведение: создав скриншот с Win+Shift+S, можно вставить файл в папку из буфера обмена, Ctrl+V.

Обновления пакета будут доставляться посредством Windows Update. Инсайдерам прислали отдельное обновление, нежели упаковали в накопительное исправление (cumulative update, CU).

👉 Мораль тут в том, что облочка #Windows10 будет получать нововведения не только при выходе новых версий, но и между ними. С одной стороны, надо приветствовать, что новые фичи или исправления косяков оболочки доставляются оперативно.

Как заметил в Твиттере Проничкин, это в первую очередь внутреннее изменение, а для конечных пользователей процесс прежний. Изменения и добавления функций ОС посредством CU - не новость, а здесь просто нюанс в виде дополнительного компонента.

Но у медали есть и обратная сторона 🤔 По каналу WU приходит множество исправлений - CU для системы и .NET, сервисный стек, необязательные драйверы и обновления BIOS, теперь еще Feature Experience Pack. Это затрудняет диагностику в случае проблем - ведь не всегда мы замечаем их моментально. Кроме того, становится сложнее отслеживать что нового появилось в ОС и когда именно.

Так или иначе, это - Windows as a Service, get used to it ✌️
​​▶️ Новое в блоге: Как определить, является файл компонентом Windows или просто выпущен Microsoft

Вечера в чате обсуждали работу OneDrive и возник вопрос, входит cldflt.sys в состав Windows 10 или устанавливается вместе с клиентом OneDrive. Можно посмотреть в WIM-образе, но допустим, что такой возможности у вас нет.

В принципе, на картинке все видно, но пост в канале не годится из-за объема кода для разных примеров.

➡️ Читайте в блоге: http://www.outsidethebox.ms/20631/
🌐 В Edge Canary вернулась группировка вкладок
https://t.me/win1leaks/2045

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

Сама по себе группировка вкладок не нова (привет, IE8), но в контексте вертикальных вкладок - это дополнительный челлендж UX.

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

А как вам вертикальные вкладки?
👍 - отлично!
🤔 - хотелось бы, но такой возможности нет
👀 - первый раз слышу
- мне это не нужно
​​▶️ Новое в блоге: #PowerShell: как извлечь список уникальных ссылок с веб-страницы

Возникла задача получить со страницы Confluence все ссылки, в URL которых была последовательность символов XYZ. Вручную – не вариант, потому что ссылок много.

Я в блоге показывал парсинг веб-страниц с командлетом PowerShell Invoke-WebRequest. Но тут пришлось бы возиться с авторизацией и двухфакторной аутентификацией, поэтому я решил сохранить HTML-страницу локально.

➡️ Читать в блоге: http://www.outsidethebox.ms/20645/
​​#️⃣ В Excel для инсайдеров Office 365 на прошлой неделе завезли крутую штуку. Теперь можно создавать свои функции на основе языка формул Excel (нежели JavaScript, например).

С помощью =LAMBDA можно:
- Оборачивать сложные формулы в свою функцию и вызывать ее из любой ячейки листа

- Вызывать свою функцию рекурсивно, т.е. свою функцию из этой же функции

👉 Подробности и примеры в блоге Excel.
▶️ Автоматическое открытие редактора реестра в нужном разделе

В форуме спросили, как из командной строки открыть regedit сразу с переходом в нужный раздел. На практике это не нужно с момента появления адресной строки в редакторе реестра #Windows10 1703 (сборка 14942). Но вопрос занятный.

В теме, конечно, посоветовали утилиты RegJump Руссиновича и nircmd Софера. А мне вспомнилась утилита JumpReg, которую создал на основе AutoIt один из участников OSZone с учетом пожеланий сообщества.

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

Например, скрипт #PowerShell:
param(
$Key=""
)
$regedit = Get-Process regedit -ErrorAction SilentlyContinue
if ($regedit) {
$regedit.CloseMainWindow()
Start-Sleep -Milliseconds 100
if (!$regedit.HasExited) {
$regedit | Stop-Process -Force
}
}
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" -Name Lastkey -Value $Key -Type String -Force
Start-Process regedit
Remove-Variable regedit


и его запуск:
.\lastkey.ps1 -Key "HKEY_CURRENT_USER\Keyboard Layout\Preload"

В принципе, можно не проверять запущенный процесс и не пытаться его щадяще закрыть, заменив блок в середине на
Get-Process regedit | Stop-Process -Force
Но тогда будут ошибки в консоли ✌️
😂 Ц - целеустремленность!

И нет, это не издержки перевода. В оригинале: A current driver on your PC may be better than the driver we're trying to install. We'll keep trying to install.
👍 Сегодня у меня для вас #рекомендация - бот блога и канала @sterkin_ru_bot ;)

Недавно в чате Василий Гусев настоятельно советовал читать мой блог одной особе, у которой в голове засохла каша пятилетней давности на тему Windows 10. Я подумал, что просто открыть и читать блог не очень увлекательно и вспомнил про бота.

Вряд ли им кто-то пользуется, хотя создал его я почти 5 лет назад и даже анонсировал в статье блога про Telegram. Бот умеет выдавать:
🔹 Разделы блога (верхнее меню).
🔹 Подборки интересных тем блога (избранные мной метки).
🔹 Случайную статью блога из популярных. Раньше была ручная подборка, но сейчас я сделал выборку топ-100 по просмотрам за 2020 на основе Google Analytics.
🔹Случайный пост из этого канала (это я добавил на днях).

Посты канала задним числом я правлю крайне редко. В нем много заметок, представлявших интерес лишь на момент выхода поста - например, новостей о появлении новых фич Windows 10, которые уже давно стали привычными. Впрочем, всегда находятся люди, которые о них не знают. Равно как есть немало трюков, о публикации которых я и сам успел забыть ✌️

А вот статьи блога я поддерживаю в актуальном состоянии, и под каждой указаны поколения ОС Windows, к которым статья применима. В топе немало старых статей, причем описанные в них действия не особо-то и нужны (например, перенос папки Users или файла подкачки). Но раз уж люди берутся, то пусть делают грамотно 👌

Топ-5 по просмотрам в этом году:
1. 10 мифов Windows 10 LTSC, которые никогда не умрут
2. Нюансы отключения службы SysMain в Windows 10
3. 12 мифов об оптимизации SSD, которые никогда не умрут
4. Как бесплатно получить Windows 10 (вопросы и ответы)
5. Как грамотно переместить пользовательские папки на другой диск

Расклад понятен, надеюсь :)

👍 - о, нашлось что-то новенькое!
👌 - я все это знаю, но иногда залипаю
- архивы не читаю
▶️ Как проверить наличие значения в массиве и собрать все рабочие ссылки на посты канала Telegram

В #PowerShell легко проверить, есть ли в массиве конкретное значение:
$a = 1,2,3
$a.Contains(2) # содержит?
True
!$a.Contains(2) # не содержит?
False


Я не планировал так быстро возвращаться к теме парсинга веб-страниц, но для бота мне понадобилось собрать ссылки на все посты канала. Понятно, что они начинаются с https://t.me/sterkin_ru/1 и увеличиваются инкрементно. Но часть постов была удалена (неактуальность, ошибочный постинг), а битые ссылки не нужны.

Иду по ссылке в браузере и смотрю исходный код страницы. Если поста по ссылке нет, сервис t.me отдает описание канала. Сравниваю с исходным кодом любого поста и ищу отличия. В описании канала упомянут чат @winsiders, что в исходном коде выглядит как https://t.me/winsiders (этого, кстати, не происходит при таком упоминании чата в тексте поста).

Поэтому в данном случае достаточно выбрать страницы, где в массиве ссылок не содержится ссылка на чат. Дальше уже знакомый вам Invoke-WebRequest. К сожалению, при публикации в канал код некорректно обрабатывается поэтому ссылки на Pastebin и скрипт в архиве
¯\_(ツ)_/¯

950..955 - для примера на случай, если вы будете проверять:) На практике я использовал 1..999, т.к. последний на тот момент пост был за номером 999. Это - оператор range, попробуйте в консоли 1..5 | %{$_}

В итоге из 1000 ссылок по факту отсутствовали 10% ✌️
​​▶️ Как распарсить JSON и собрать все рабочие ссылки на посты канала Telegram

Мне тут сразу два человека доставили по поводу предыдущего поста 🙈

Василий Гусев пожурил за использование метода Contains, потому что он подходит только для массивов и вообще не задокументирован в справке #PowerShell, ибо .NET. Он посоветовал использовать операторы -contains и -notcontains.
$a = 2
$a -contains '2' # содержит?
True
$a -notcontains '2' # не содержит?
False


Соответственно, условие проверки будет таким (полный код по ссылке):
if ($c.links.href -notcontains 'https://t.me/winsiders')

👉 Также выяснилось, что для решения конкретной задачи, т.е. получения списка постов канала Telegram, есть более эффективный способ. Из описания любого канала можно экспортировать его историю в JSON (см. картинку).

Зная об этом, я бы конечно решал задачу без веб-запросов. Фрагмент структуры JSON:
{
"name": "Windows 10, etc - Вадим Стеркин",
"type": "public_channel",
"id": 9608710293,
"messages": [
{
"id": 1,
"type": "service",
"date": "2016-03-24T00:00:55",
...
},
{
"id": 22,
"type": "message",
"date": "2016-03-26T01:39:23",
"from": "Windows 10, etc - Вадим Стеркин",
"from_id": 9608710293,
"text": "Привет канал"
},


Мне нужны id постов с типом message. Получаю содержимое файла, конвертирую из JSON в объект, из которого дальше делаю выборку сообщений с нужным типом, затем перебор и запись в файл.
$j = Get-Content -Path "C:\temp\result.json" | ConvertFrom-Json
$j.messages | Where-Object {$_.type -eq 'message'} |
ForEach-Object {
$_.id | Out-File -Append C:\temp\urls.txt
}

Поскольку код в канале обрабатывается некорректно, в примере только вывод ID постов, а код с выводом ссылок на посты на Pastebin.
✌️
​​▶️ Новое в блоге: #PowerShell: как в #Windows10 быстро выявить дубликаты драйверов и удалить их

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

Я заинтересовался вопросом и применил свое руководство на практике. Помимо прочего мое внимание привлекло хранилище драйверов, занимающее 4GB. Сегодня я покажу, как автоматизировать анализ и очистку хранилища.

➡️ Читать в блоге: http://www.outsidethebox.ms/20667/
На этой неделе инсайдерам доставили новую версию приложения "Будильники и Часы" 10.2012.18.0 с обновленным дизайном на основе WinUI 2.4 (обзор на Community).

Выглядит хорошо, но участник чата Андрей сразу заметил занятный баг. Если в разделе мирового времени добавить несколько городов, то при изменении размера окна города перемещаются на другие континенты или в океаны 😂

Если вы пользуетесь приложением, поддержите баг-репорт - он в канале для гиков фидбэка 👍

Если... У меня ему нет применения в #Windows10, да и полноценная работа невозможна на устройствах без поддержки Modern Standby. Уведомление не сработает, если система уйдет в сон ⚡️

Для короткого таймера сгодится, но я привык делать это голосом на смартфоне. Да, Кортана умеет, но ей не пользуюсь даже с английским интерфейсом.

Время для трех городов есть в часах в трее, да и просто в пуске можно набрать. Для будильников и таймеров мне удобнее смартфон. А вам?

👍 - пользуюсь приложением в Windows
📱- есть же смартфон
- только механика, только хардкор
​​▶️ Маленькая функция #PowerShell для преобразования кодов ошибок в понятный текст

На форум пришел человек с проблемой установки MS Office MSI. Коллеги запросили лог и увидели там:
Note: 1: 2203 2: C:\Windows\Installer\inprogressinstallinfo.ipi 3: -2147287037
Такие коды с отрицательным значением попадаются в ошибках приложений, журналах событий, логах Windows Installer и т.п.

У меня в профиле PowerShell ($profile) давно лежала функция Convert-Error для преобразования кодов ошибок с помощью утилиты certutil, я рассказывал про нее в блоге.

После публикации первой версии этого поста Вадимс Поданс доставил, что в функции лишняя конвертация в шестнадцатеричное значение, поскольку это встроено в PowerShell. Оптимальный вариант:
Function Convert-Error
([int]$Err)
{certutil -error $Err}


Вызывается так:
Convert-Error -2147287037

Результат на картинке↓ Windows Installer ожидал наличия папки %windir%\Installer, но ее не оказалось. Особо талантливый пользователь удалил за ненадобностью 🙉 После создания папки Office установился.

Применение функции не ограничивается кодами с отрицательным значением, попробуйте:
Convert-Error 0x80070005
Convert-Error 5

(Для чисел до 9999 по умолчанию предполагается префикс 0х8007)

Мне также доставили, что можно обойтись без certutil:
$iErrorCode = -2147287037
(New-Object -TypeName System.ComponentModel.Win32Exception($iErrorCode)).Message


Однако certutil универсальнее, поскольку умеет обрабатывать ошибки из других библиотек, например, wininet.dll. Если очень хочется без certutil, у Поданса есть и такой скрипт, но это уже above my paygrade ✌️
​​🔓 Сегодня в рубрике "Знаете ли вы?" временное отключение запросов UAC в предварительной версии Windows 7 (сборка 6608).

Напомню, что в Windows Vista все было жестко - если UAC включен, то запрос шел на каждое административное действие. Поэтому контроль учетных записей отключали практически все :)

В Windows 7 добавили два промежуточных уровня:
- автоматическое одобрение администраторам для элементов панели управления (значок с щитом)
- показ запроса UAC вне безопасного рабочего стола для слабых видеокарт

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

#Классика блога времен Windows 7 в тему: Так ли страшен контроль учетных записей?
✌️
📊 Опрос: ваши впечатления от канала

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

👉 Пройдите опрос!
====
Кстати, возвращаясь к напечатанному. Анонсируя Microsoft Forms, я предложил вам самостоятельно выявить практические отличия от Google Forms. Создавая этот опрос, я отметил пару моментов.

1. В отличие от Microsoft, у Google есть валидация ответов. Например, для вопросов с множественным выбором (флажки) можно ограничить количество выбранных вариантов или наоборот потребовать выбора не менее N пунктов.

2. В отличие от Google, у Microsoft есть формат Likert, с помощью которого в рамках одного вопроса можно получить мнение по каждому его пункту. У меня - это вопрос про интерес к темам канала.
Спасибо, что читаете мой канал 👍 С наступающим новым годом! 🎄 Продолжим в следующем году ✌️