「PowerShell Advent Calendar 2012」向け第二弾!!
すごーく今さらですが、来年はWindows XPにお別れを告げる時期が近づいているのと同様、Server 2003にもそろそろ移行計画がないとダメぽな時期が来ています。そこで、Windows 2008 R2から標準搭載されているActive Directory用のモジュールをおさらいしたいと思います。
さて、PowerShellでは、以前からWMI経由でアクセスできます。たとえば、ChukiTestというユーザーを以前からの手法で取得してみましょう^^
----
$objDS = New-Object System.DirectoryServices.DirectorySearcher
$objDS.Filter = "(sAMAccountName=ChukiTest)"
$objUser = $objDS.FindOne()
$objUser.Properties.Count
実行結果:43
----
この状態で$objUser.Propertiesとやっていただいたら、43このプロパティが表示され、ユーザーに設定されているプロパティーがすべて取得できていることがわかります。
一人分の情報を取得する場合、設定されている情報だけをすべて抜き出せるのはとても便利です。
今回のように一人分のユーザーしかとってこない場合はそんなに問題は起きないのですが、FindAllメソッドなどで大量のユーザーを取得する場合、非常にメモリを圧迫してしまいます。プロパティによっては証明書などの容量の大きなものもあり、これらを設定している環境ではかなりのサイズになってしまいます。また、ユーザーによって登録しているプロパティがまちまちだった場合、取得できているプロパティの数が変わってくるため、結構取得後の扱いが面倒になったります。
また、今回のテスト用環境では43個でしたが、企業で運用しているような場合は相当数設定している場合が珍しくなく、なんとなく不安定になったりしがちでした。また、セキュリティの観点からも必要ではないプロパティーが取得されてくることはあまり望ましくありませんでした。
そこで、、Active Directory用モジュールの出番です。
前述の方法では実質3行でした。Active Direcotry用のモジュールを利用すると実質1行で記述できます
----
Import-Module ActiveDirectory
$ADUser = Get-AdUser "ChukiTest"
$ADUser.PropertyCount
実行結果:10
----
>$ADUser
DistinguishedName : CN=ChukiTest,CN=Users,DC=chukitest,DC=local
Enabled : True
GivenName :
Name : ChukiTest
ObjectClass : user
ObjectGUID : <ちゅき省略>
SamAccountName : ChukiTest
SID : <ちゅき省略>
Surname : ChukiTest
UserPrincipalName : ChukiTest@chukitest.local
----
上記の通り、パイプを通して利用しそうなKey項目しか取得してきません。
ちなみに、従来と同じような書き方もできます。
----
Import-Module ActiveDirectory
$ADUser = Get-AdUser -LDAPFilter "(sAMAccountName=ChukiTest)"
$ADUser.PropertyCount
----
また、PowerShellを愛してやまない方には以下の書き方も可能です。
----
Import-Module ActiveDirectory
$ADUser = Get-ADUser -Filter "sAMAccountName -eq 'ChukiTest'"
$ADUser.PropertyCount
----
さて、お気づきと思いますが、Get-ADUser [-Identity] 表記法があるため、スクリプトを組むときに、いちいち文字連結をせずとも変数がとても扱いやすというメリットも存在します。([]は省略可能を表します。)
例:
----
Import-Module ActiveDirectory
$ADGroupMembers = Get-ADGroupMember "Domain Users"
$ADGroupMembers | ForEach-Object{
$ADUser = Get-ADUser $_ -Properties "Company","Department"
$ADUser | Select-Object "Name","Company","Department"
実行結果
Name Company Department
---- ------- ----------
Administrator
krbtgt
ChukiTest わんくま同盟 大阪
----
この、赤色の部分が以下のように書けることからも、Key項目を意識していると考えられます。(名称が[-Identity]であることからも明らかですね^^)
$ADUser = Get-ADUser $_
$ADUser = Get-ADUser $_.name
$ADUser = Get-ADUser $_.distinguishedName
$ADUser = Get-ADUser $_.SamAccountName
$ADUser = Get-ADUser $_.SID
【結論】
ということで、結構便利になってきています。
Windows XP/Server 2003に引導を渡すと同時に、VBSやBATではなく、今後はPowerShellで記述していくのが常識になっていくものと思います。
と、ここまで書いておいてなんですが、Windows 2003や2008でも使えないくはないんですね。是非インストールして使ってやってください。
#あんまり延命はどうかと思わなくはないですが^^;
「Active Directory用のモジュールについて」
http://social.technet.microsoft.com/Forums/ja-JP/powershellja/thread/c4ef87a1-d076-4f2d-be5b-2170bc787230/