Записи с меткой автоматизация
Обёртки над текстовыми командами в PowerShell
2Хотел поделиться опытом создания простой объектно-ориентированной обёртки над обыкновенной консольной утилитой для облегчения работы с ней. Для примера была выбрана pnputil для работы с хранилищем дистрибутивов драйверов в Windows. (далее…)
PowerShell и систематизация файлов
0Дурацкое название, но что-то лучше ничего не придумалось.
Очень быстро покажу пару скриптов, которыми я постоянно пользуюсь для поддержания моей коллекции обоев с deviantArt в относительном порядке.
Для начала, хочется заметить, что в общем случае имя файла генерируется сервером в виде my_picture_s_name_by_awesome_me.jpg, т.е. название + by + имя пользователя, приведённое к виду, пригодному для сохранения в любой файловой системе.
Итак, хранятся все картинки в одной папке – новые в корне, старые – рассортированные по авторам. От скрипта требуется умение автоматически распихивать файлы заданного вида по папкам. Решается тривиально (скрипт был написан очень давно, когда v1.0 только-только вышла и я ещё почти ничего о нём не знал):
$files = Get-ChildItem -Filter "*_by_*.???" | where {$_.GetType() -eq [System.IO.FileInfo]}
$myRegEx = New-Object System.Text.RegularExpressions.Regex('.+_by_(.+)\..{3}', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
foreach ($f in $files) {
$dir = Join-Path $f.Directory $myRegEx.Split($f.Name)[1]
$destination = Join-Path $dir $f.Name
if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null }
Move-Item -Path $f.FullName -Destination $destination -Force
}
Второй скрипт пришлось придумать только что, поскольку буквально на прошлой неделе к некоторым файлам зачем-то стали приписывать некий набор символов. Пока что я не знаю, зачем он нужен и какой у него формат, эмпирически же известно, что это семисимвольный довесок, начинающийся на d2x или d2y. Пока что будем его обрезать:
ls | where {$_.FullName -Match '.+\-[a-z0-9]{7}\.[a-z]{3,4}'} |
ren -NewName {$_.FullName -Replace '(.+)(\-[a-z0-9]{7})(\.[a-z]{3,4})','$1$3'}
VPN и Интернет в одном флаконе
0Или, выражаясь умными словами, split tunneling.
Преамбула
Есть желание при подключении VPN в Windows использовать его только для доступа к внутренним ресурсам.
Проблемы
Проблема состоит в том, что по-умолчанию можно либо весь трафик перенаправлять через VPN-соединение (и тогда каждый раз нужно настраивать прокси-сервер, если такой вообще есть), либо лишится всякой разумной возможности работы с внутренними ресурсами (весь трафик будет перенаправляться через стандартный канал, который не имеет возможности попасть внутрь сети).
Возможное решение
Итак, хочется настроить split tunneling, чтобы для внутренних ресурсов трафик ходил через VPN и использовался внутренний DNS-сервер (чтобы можно было просто обращаться к внутренним ресурсам), а весь оставшийся трафик продолжал ходить через стандартный шлюз. Понятно, что всё это можно автоматизировать скриптами, но хочется, чтобы эти скрипты отрабатывали автоматически при подключении VPN-соединения и отменяли всё, что может помешать, после его разрыва.
Guide
Прежде чем продолжить, следует отдавать себе полный отчёт о возможных проблемах и рисках, которые несёт с собой подобная махинация. (Подробнее по ссылке из статьи Википедии).
Сейчас я буду творить волшебство, которое не является панацеей от всех проблем, но даёт представление о том, как всё можно организовать от и до. Отшлифовать все процессы под конкретную конфигурацию и собственные нужды придётся самому.
Итак, приступим:
-
Теперь хочется привязать выполнение скриптов к моменту установления подключения. Для этого воспользуемся Журналом событий Windows (это косметика, можно сразу переходить к шагу 3):
-
Созданные задания находятся чуть выше в консоли; нужно их отредактировать (или сразу создавать):
-
Планировщик заданий → Библиотека планировщика заданий → Задачи просмотра событий
-
Триггеры → При событии; журнал: Приложение; источник: RasClient; код события: 20225 (только если создаём руками)
-
Действия. Должно быть 2 штуки, оба типа “Запуск программы”:
- Программа или сценарий:
netsh; добавить аргументы:interface ipv4 add route prefix=192.168.64.0/23 interface=17 metric=200(здесь192.168.64.0/23– параметры внутренней сети;17– номер VPN подключения;200– метрика, чем меньше, тем более предпочтительна) - Программа или сценарий:
netsh; добавить аргументы:dnsclient add dnsservers 11 192.168.64.252 1(здесь11– номер основного подключения;192.168.64.252– адрес DNS-сервера во внутренней сети;1– номер в списке DNS-серверов):
- Программа или сценарий:
- Условия
- Отключить “Запускать только при питании от электросети” (опционально)
- Включить “Запускать только если подключении к следующей сети” и выбрать VPN-соединение:
-
-
Теперь подобным образом нужно добавить выполнение скриптов, отменяющих наши манипуляции со списком DNS-серверов на основном соединении (если что-то пойдёт не так, то всё будет работать, просто время разрешения имён может возрасти):
Заключение
Про IPv6 и DirectAccess мы поговорим как-нибудь в другой раз
