none
PowerShellによるOUの移動について RRS feed

  • 質問

  • いつもお世話になっております。

    梅崎です。

    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

    --------------------------------


    2013年7月10日 0:57

回答

  • チャブーンです。

    この件ですが、ようやく時間が取れたので簡単にデバッグしました。その結果、やはり引数の問題だったようです。

    中段で$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
    }


    2013年7月13日 9:02
    モデレータ

すべての返信

  • チャブーンです。

    こちらのフォーラムは不特定多数の方がご覧になるため、勝手ながら個人情報と思われる部分について、ひとまず削除させていただきました。

    有償レベルのサービスがご要望だった場合は、パートナーフォーラムをご利用ください。詳細は以下をご確認ください。

    http://social.technet.microsoft.com/Forums/ja-JP/714402f2-360b-4e5d-a3cf-658636c0b494/

    上記が該当しない場合、引き続き本フォーラムをご利用ください。よろしくお願いいたします。

    2013年7月10日 2:05
    モデレータ
  • チャブーンです。

    Move-ADObjectのヘルプを見ると、識別名(DN)またはGUIDでオブジェクト名を指定できるとありますね。なのでGUIDを指定した際にGUIDがオブジェクトに変換できなくてエラーになっている気がします。

    > 現在のOU構成をCSVに出力し、変更するOU構成と比較し、更新を行おうとしたのですが

    とか、割と作り込みで対応するスクリプトかなということで、「サンプルをくれ」→「スクラッチで(0から)作ってくれ」と同意になりますので、このアピールは難しいのではないでしょうか?差し障りない範囲でのPowerShellスクリプトのサンプル(他の人が試せるレベル)とエラーの結果を見せてもらった方が、回答がつくように思います。


    2013年7月10日 5:49
    モデレータ
  • 早速のご回答ありがとうございます。

    作成いたしましたスクリプトソースは以下の通りです。

    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 文言一部修正
    2013年7月10日 8:19
  • チャブーンです。

    このスクリプトをほぼそのまま実行してみたところ、$CにOUのオブジェクトが入るべきところで、これが見つけられないエラーが出ていました。こちらの環境の問題かもしれませんが、スクリプト内で各変数を表示させるようにして、変数が期待した値かどうか、確認されてみてはどうでしょうか?

    こちらですが、現在時間がなくすぐにはデバッグできません。時間ができたら試してみようと思っています。

    2013年7月11日 1:00
    モデレータ
  • ご回答ありがとうございます。

    私の環境ですと

        Move-ADObject -Identity $OUGUID -TargetPath $newDNList[$i]

    まで値は入っており、

    デバック画面上で以下のコマンドを打つと値が入っていることは確認できました。

    PS C:\Script\OU_Change> $OUGUID
    893af93e-6a54-4940-a76f-119faa3b7684

    PS 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がオブジェクトに変換できなくてエラーになっているように思われます。

    もし何かお分かりになることがあればご教授いただければ助かります。

    2013年7月11日 1:47
  • チャブーンです。

    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を別の変数に置き換えなくてもいいようになるかもしれないですね。

    2013年7月11日 8:29
    モデレータ
  • チャブーンです。

    この件ですが、ようやく時間が取れたので簡単にデバッグしました。その結果、やはり引数の問題だったようです。

    中段で$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
    }


    2013年7月13日 9:02
    モデレータ
  • ご返信ありがとうございます。

    頂いたソースをもとに、コーディングし、オブジェクトの場所を移動させることができました。

    大変助かりました。ありがとうございます。

    2013年7月14日 0:11