Записи с меткой автоматизация

Обёртки над текстовыми командами в 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

Прежде чем продолжить, следует отдавать себе полный отчёт о возможных проблемах и рисках, которые несёт с собой подобная махинация. (Подробнее по ссылке из статьи Википедии).

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

Итак, приступим:

  1. Настраиваем параметры подключения VPN. Нужно отключить перенаправление всего трафика через это соединение при подключении:
    • Сетевые подключения → Свойства VPN → Сеть → IPv4 → Свойства → Дополнительно… → Убрать галку "Использовать основной шлюз в этой сети"

    Network Connections → VPN Connection → Properties → Networking → IPv4 → Properties → Advanced... → Uncheck "Use default gateway on remote network"

  2. Теперь хочется привязать выполнение скриптов к моменту установления подключения. Для этого воспользуемся Журналом событий Windows (это косметика, можно сразу переходить к шагу 3):
    • Пуск → Компьютер → Управление → Просмотр событий → Журналы Windows
    • В журнале Приложения найти событие о подключении VPN (код события: 20225; источник: RasClient)
    • В контекстном меню выбрать Привязать задачу к событию… (параметры см. далее):
      Start → Computer → Manage → Event Viewer → Windows Log → Application
  3. Созданные задания находятся чуть выше в консоли; нужно их отредактировать (или сразу создавать):

    • Планировщик заданий → Библиотека планировщика заданий → Задачи просмотра событий
    • Находим (или создаём вручную, если был пропущен шаг 2) наше задание, жмём Свойства:
      Task Scheduler → Task Scheduler Library → Event Viewer Tasks → <Our task> → Properties
    • Общие → Отметить “Выполнить с наивысшими правами”
      General → Check "Run with highest privileges"
    • Триггеры → При событии; журнал: Приложение; источник: RasClient; код события: 20225 (только если создаём руками)
    • Некоторые промежуточные действия, необходимые для дальнейших сценариев.
      Нужно узнать номер основного подключения, через которое осуществляется подключение к Интернету. Это можно сделать, выполнив в командной строке команду route print и посмотрев на Список интерфейсов:
      route print → Intrface List
    • Действия. Должно быть 2 штуки, оба типа “Запуск программы”:
      1. Программа или сценарий: netsh; добавить аргументы: interface ipv4 add route prefix=192.168.64.0/23 interface=17 metric=200 (здесь 192.168.64.0/23 – параметры внутренней сети; 17 – номер VPN подключения; 200 – метрика, чем меньше, тем более предпочтительна)
      2. Программа или сценарий: netsh; добавить аргументы: dnsclient add dnsservers 11 192.168.64.252 1 (здесь 11 – номер основного подключения; 192.168.64.252 – адрес DNS-сервера во внутренней сети; 1 – номер в списке DNS-серверов):

      Actions

    • Условия
      1. Отключить “Запускать только при питании от электросети” (опционально)
      2. Включить “Запускать только если подключении к следующей сети” и выбрать VPN-соединение:

      Conditions →

    • Параметры. При желании можно включить опцию “Остановить задачу, выполняемую дольше 1 минуты”:
      Settings → Check "Stop the task if it runs longer than: 1 minute"
  4. Теперь подобным образом нужно добавить выполнение скриптов, отменяющих наши манипуляции со списком DNS-серверов на основном соединении (если что-то пойдёт не так, то всё будет работать, просто время разрешения имён может возрасти):
    • Триггеры. Журнал: Система; источник: RasMan; код события: 20268
    • Действия. Команда: netsh; параметры: dnsclient delete dnsservers 11 192.168.64.252 (параметры те же, что и в соответствующей команде из п.3):
      Adding command on disconnect
  5. Проверяем работоспособность. Для этого пингуем / трэйсим какой-нибудь внутренний и внешний ресурс:
    Pinging addresses on intra- and internet

Заключение

Про IPv6 и DirectAccess мы поговорим как-нибудь в другой раз :-)

Вверх