PSCX и миграция OU

В PoSH изначально была задумана расширяемая система провайдеров. Файловая система, реестр, функции и переменные — всё это представлено в едином виде, то есть вы можете сделать как cd c:\windows так и cd hklm:\software или cd function:\ и для всего будет использоватся одна и таже команда. Доступность разных команд конечно отличается в разных провайдерах, но общие, вроде cd (set-location), pwd (get-location), new-item, del (remove-item), cp (copy-item), и т.п. работают в большинстве. То есть однажды научившись основам — не придется переучиватся для работы с новыми средами (впрочем это свойственно вообще PoSH — достаточно знать сам шелл, а с WMI, COM, .NET и т.д. работа в нём очень похожа).
Проект PowerShell Community Extensions создан энтузиастами желающими дополнить PoSH элементами которые Микрософт по тем или иным причинам не включила в первый релиз PowerShell. В частности в него входят несколько провайдеров, например Vista FeedStore (хранилище rss подписок) и ActiveDirectory.
Установив PSCX можно сделать просто cd ИмяДомена: и дальше перемещатся по структуре AD как по обычной файловой системе. Да и методы работы практически те же. Возьмем задачку из жизни — перенести Organisational Unit'ы из одного домена в другой.

PS D:\PowerShell> cd МойДомен:

Можете попробовать набрать ls или dir, поперемещатся по структуре с помощью cd…
Далее получаем список всех OU в домене, с помощью команды Dir и параметра -Recurse. Фильтром where выбираем только объекты с типом organizationalUnit, и для каждого из них (foreach) выводим полный путь — fullname. (Чтобы посмотреть свойства любых объектов всегда можно выполнить dir | get-member или dir | select -first 1 | format-list *)
$ous = dir -recurse | where {$_.type -like «organizationalUnit»} | foreach {$_.fullname}
Теперь в переменной $ous у нас находятся пути к OU домена. Запишем их в обычный текстовый файл:

PS D:\PowerShell> $ous set-Content c:\ous.txt

или

PS D:\PowerShell> $ous > c:\ous.txt

как привычнее🙂

Затем нам надо перейти в другой домен, и возможно импортировать $ous если дело происходит уже на другом компьютере:

PS D:\PowerShell> $ous = get-Content c:\ous.txt

Так как пути записаны в формате ИмяДомена:\OU1\SubOU то нам надо заменить название старого домена в начале путей:

PS D:\PowerShell> $newOus = $ous -replace "^OldDomain:","NewDomain:"

Теперь попробуем посмотреть что будет если мы создадим OU из списка с помощью foreach и командлета new-item. При выполнении этой команды никакие объекты созданы не будут, так как указан ключ -whatif. Из за наличия этого ключа командлет лишь напишет нам что он сделал бы (Этот ключ поддерживается практически всеми командами изменяющими состояние системы).

PS D:\PowerShell> $newOus | foreach {New-Item -type "organizationalUnit" -path $_ -whatif}

Если всё в порядке — можно выполнить эту команду снова, на этот раз уже без ключа -whatif:

PS D:\PowerShell> $newOus | foreach {New-Item -type "organizationalUnit" -path $_}

Или можно поставить ключ -confirm и тогда будет выдан запрос на создание каждого конкретного OU.

Опубликовано в PowerShell. Комментарии к записи PSCX и миграция OU отключены
%d такие блоггеры, как: