2011年8月8日月曜日

◆ActiveDirectory、Set-ADUserに関連付けられていないプロパティの更新

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025

$props = (
 
"msDS-PhoneticDisplayName",    #カナ氏名
  "otherTelephone"        #内線
  )
 

$undef = @()

#部、グループ名、カナ氏名、メールアドレス、内線を設定する
$User | %
{
 
$dn = $_.
DistinguishedName
 
if($emp = $obj104[$_.SamAccountName]
){ 
   
#OUから会社名と部署名を取得
    $ou = Get-ADOrganizationalUnit
 `
     
-Identity $dn.substring($dn.indexof(",")+1
) `
     
-Properties description,displayname
     
   
Set-ADUser  -Identity $_ -Clear $props -PassThru |
      Set-ADUser -EmailAddress $emp.
メールアドレス `
     
-Company $ou.DisplayName -Department $ou.
Description `
     
-EmployeeNumber $emp.
社員番号 `
     
-Add @{$props[0]="$($emp.カナ氏名)";$props[1]="$($emp.内線)"
}
  }
else
{
   
$undef += $_.SamAccountName
  }
}

上記サンプルはスクリプトの一部を切り出したもの。
$obj104は別途管理されている社員情報から、アカウントをキーとしたハッシュテーブルとして組み立てている。
$Userは対象ユーザーを設定済み。

ユーザーの主なプロパティについてはSet-ADUserコマンドレットにて対応するパラメータが用意されているのでそれを使えば問題ない。
問題はパラメータの用意されていないプロパティを更新したい時。
ヘルプによるとその場合はRemove、Add、Replace、Clearの4つのパラメータを使用するとある。
しかし、Remove、Add、Replaceについてはどれも変更前の値を指定する必要があり単純に上書きで更新するわけには行かなそう。(コレクション型のプロパティに対応するためかなぁ・・・)
ClearしてからAddすれば良いのかと思ったが、AddとClearを同時に指定した場合はAddが先に実行されるらしい。
仕方が無いのでとりあえずはステップを分けて、ClearしてからAddすることとしたのが上記サンプルである。
もしかするともう少し直接的な設定方法があるのかもしれない。

また、書いてから気づいたが、上記if条件の書き方は誤解を招きそうな気もするのであまりよろしくないのかもしれない。

0 件のコメント:

コメントを投稿