トップ回答者
PowerShellによるOUの移動について

質問
-
いつもお世話になっております。
梅崎です。
OUの移動について質問させてください。
PowerShellを用いてOUの移動を行おうとしております。
下記のサイトより、Move-ADObjectを利用してOUの移動を行おうとしておりました。
http://www.yottun8.com/wiki/PowerShell%20ActiveDirectory.html#edd1c1c8
現在のOU構成をCSVに出力し、変更するOU構成と比較し、更新を行おうとしたのですが、
親部署を移動した直後に、子の部署を移動させると、既に子の部署は階層を移動しているため、変更できないという状況に陥りました。
いったん、SIDもしくはGUIDを取得し、その情報から1件づつ移動を行おうと考えておりますが、
GUIDでの移動が行えません。
サンプル例もしくは参考となるURLなどございましたら、ご教授頂けないでしょうか?
※よりよい方法があればご教授いただけると助かります。
----------------------------------
環境:Windows 2008 R2 SP1
--------------------------------
- 編集済み チャブーンMVP, Moderator 2013年7月10日 2:01 個人情報を削除しました
回答
-
チャブーンです。
この件ですが、ようやく時間が取れたので簡単にデバッグしました。その結果、やはり引数の問題だったようです。
中段で$OUGUIDListを設定する際、したのような方法で行うと、$OUGUIDList[0]($OUGUID)もArrayとして認識されます(Gettypeすればわかります)。
##GUIDを登録
$OUGUIDList += ,@($c.objectGUID.GUID)##新親部署を登録
$newDNList += ,@($ou.New_head_DN)正しくはしたのように行います。","をつけたことで多重配列として扱われたのでしょう。もう解決しているでしょうが、お暇があれば確認してみてください。
##GUIDを登録 $OUGUIDList += @($c.objectGUID.GUID) ##新親部署を登録 $newDNList += @($ou.New_head_DN)
なお、私であれば、したのようなスクリプトを組む気がします。まあ、OUのオブジェクトを捕まえてしまえば、Move-ADObjectでわざわざGUIDで指定する必要はなく、オブジェクトそのものを -identityで指定すればいいので、微妙な内容ではありますが。
Import-module ActiveDirectory $ouList = Import-Csv ((Split-Path $myInvocation.MyCommand.path) +"\MoveOU.csv") foreach ($ou in $ouList) { $Name=$ou.New_branch_short_name;$SearchBase=$ou.Old_head_DN $c = Get-ADOrganizationalUnit -filter {name -eq $Name} -searchBase $SearchBase $ou|Add-member -Membertype Noteproperty -name GUID -value $c.objectGUID.GUID Move-ADObject -Identity $ou.GUID -TargetPath $ou.new_Head_DN }
- 編集済み チャブーンMVP, Moderator 2013年7月13日 9:03 文言の修正
- 回答としてマーク 梅崎 2013年7月14日 0:09
すべての返信
-
チャブーンです。
こちらのフォーラムは不特定多数の方がご覧になるため、勝手ながら個人情報と思われる部分について、ひとまず削除させていただきました。
有償レベルのサービスがご要望だった場合は、パートナーフォーラムをご利用ください。詳細は以下をご確認ください。
http://social.technet.microsoft.com/Forums/ja-JP/714402f2-360b-4e5d-a3cf-658636c0b494/
上記が該当しない場合、引き続き本フォーラムをご利用ください。よろしくお願いいたします。
-
チャブーンです。
Move-ADObjectのヘルプを見ると、識別名(DN)またはGUIDでオブジェクト名を指定できるとありますね。なのでGUIDを指定した際にGUIDがオブジェクトに変換できなくてエラーになっている気がします。
> 現在のOU構成をCSVに出力し、変更するOU構成と比較し、更新を行おうとしたのですが
とか、割と作り込みで対応するスクリプトかなということで、「サンプルをくれ」→「スクラッチで(0から)作ってくれ」と同意になりますので、このアピールは難しいのではないでしょうか?差し障りない範囲でのPowerShellスクリプトのサンプル(他の人が試せるレベル)とエラーの結果を見せてもらった方が、回答がつくように思います。
- 編集済み チャブーンMVP, Moderator 2013年7月10日 5:51 文言の修正
-
早速のご回答ありがとうございます。
作成いたしましたスクリプトソースは以下の通りです。
Move-ADObject -Identity $OUGUID -TargetPath $newDNList[$i]
を利用し、$OUGUIDに対象OUの値を入れて、移動させようとしております。
配列に関する知識が不足しているため、以下のような構成で登録を行おうとしております。
アドバイスなど頂けると助かります。
---------スクリプトサンプル---------
##OUMoveスクリプト##
Import-module ActiveDirectory
##スクリプト実行フォルダ上にあるMoveOU.csvファイルのデータをインポート
$ouList = Import-Csv ((Split-Path $myInvocation.MyCommand.path) +"\MoveOU.csv")
##定義
$i=0
$OUGUID = @()
$newDN= @()
## New_branch_short_name:OU名:test
## Old_head_DN:旧DN:OU=User,DN=local,DN=com
## New_head_DN:新DN:OU=User2,DN=local,DN=com
foreach ($ou in $ouList){
##対象OUのDNを作成
$t = ("OU="+$ou.New_branch_short_name+","+$ou.Old_head_DN)
##OUを特定
$c = Get-ADOrganizationalUnit ($t)##GUIDを登録
$OUGUIDList += ,@($c.objectGUID.GUID)##新親部署を登録
$newDNList += ,@($ou.New_head_DN)
}foreach ($OUGUID in $OUGUIDList){
##指定された親部署に対して、対象OUを移動Move-ADObject -Identity $OUGUID -TargetPath $newDNList[$i]
$i=$i+1}
------------------
- 編集済み 梅崎 2013年7月10日 23:52 文言一部修正
-
ご回答ありがとうございます。
私の環境ですと
Move-ADObject -Identity $OUGUID -TargetPath $newDNList[$i]
まで値は入っており、
デバック画面上で以下のコマンドを打つと値が入っていることは確認できました。
PS C:\Script\OU_Change> $OUGUID
893af93e-6a54-4940-a76f-119faa3b7684PS C:\Script\OU_Change> $newDNList[0]
”OU=東日本地区1,OU=本社,OU=OU Users,DC=local,DC=com”コマンドとしても以下のコマンドを実行すると正常に動作します。
Move-ADObject -Identity 893af93e-6a54-4940-a76f-119faa3b7684 -TargetPath ”OU=東日本地区1,OU=本社,OU=OU Users,DC=local,DC=com”
ところが、 Move-ADObject -Identity $OUGUID -TargetPath $newDNList[$i]を実行すると以下のエラーが出力されてしまいあmす。
Move-ADObject : パラメーター 'Identity' で必要とされる型 'Microsoft.ActiveDirectory.Management.ADObject' に 'System.Object[]' を変換できません。指定されたメソッドはサポートされていません。
発生場所 行:1 文字:28最初のご指摘のとおり、GUIDを指定した際にGUIDがオブジェクトに変換できなくてエラーになっているように思われます。
もし何かお分かりになることがあればご教授いただければ助かります。
-
チャブーンです。
Move-ADObject : パラメーター 'Identity' で必要とされる型 'Microsoft.ActiveDirectory.Management.ADObject' に 'System.Object[]' を変換できません。指定されたメソッドはサポートされていません。
発生場所 行:1 文字:28このエラーですが、identityオプションに指定する引数の型がおかしいので、出るのではないでしょうか?
で、ソースを確認してみたところ、中段の変数定義のところがちょっとおかしい気がします。##定義
$i=0
$OUGUID = @()
$newDN= @()ここをしたのように変えてみたらどうでしょうか?
##定義 $i=0 $OUGUIDList = @() $newDNList= @()
今のコードだと、Move-ADObjectを実行するForeachブロックで$OUGUIDが[array]型で認識されてしまっているのが、原因なのかもしれませんね。
今のコードでも動くには動くようですが、$OUListにAdd-MemberでGUIDをメンバに追加してあげれば、Foreachを何度も回したり.New_head_DNを別の変数に置き換えなくてもいいようになるかもしれないですね。
- 編集済み チャブーンMVP, Moderator 2013年7月13日 9:12 文言の修正
-
チャブーンです。
この件ですが、ようやく時間が取れたので簡単にデバッグしました。その結果、やはり引数の問題だったようです。
中段で$OUGUIDListを設定する際、したのような方法で行うと、$OUGUIDList[0]($OUGUID)もArrayとして認識されます(Gettypeすればわかります)。
##GUIDを登録
$OUGUIDList += ,@($c.objectGUID.GUID)##新親部署を登録
$newDNList += ,@($ou.New_head_DN)正しくはしたのように行います。","をつけたことで多重配列として扱われたのでしょう。もう解決しているでしょうが、お暇があれば確認してみてください。
##GUIDを登録 $OUGUIDList += @($c.objectGUID.GUID) ##新親部署を登録 $newDNList += @($ou.New_head_DN)
なお、私であれば、したのようなスクリプトを組む気がします。まあ、OUのオブジェクトを捕まえてしまえば、Move-ADObjectでわざわざGUIDで指定する必要はなく、オブジェクトそのものを -identityで指定すればいいので、微妙な内容ではありますが。
Import-module ActiveDirectory $ouList = Import-Csv ((Split-Path $myInvocation.MyCommand.path) +"\MoveOU.csv") foreach ($ou in $ouList) { $Name=$ou.New_branch_short_name;$SearchBase=$ou.Old_head_DN $c = Get-ADOrganizationalUnit -filter {name -eq $Name} -searchBase $SearchBase $ou|Add-member -Membertype Noteproperty -name GUID -value $c.objectGUID.GUID Move-ADObject -Identity $ou.GUID -TargetPath $ou.new_Head_DN }
- 編集済み チャブーンMVP, Moderator 2013年7月13日 9:03 文言の修正
- 回答としてマーク 梅崎 2013年7月14日 0:09