Activedirectoryで苦労したので,ちょっとまとめてみることにしました.

まず,XPでの検索方法について.XPでは,[スタート]→[検索]→[プリンタ,コンピュータまたは人]→[アドレス帳内の人]とやると検索画面がでてきますが,非常にめんどくさいです.で,色々ぐぐった結果見つけた方法がこれになります.

%windir%\system32\rundll32.exe dsquery.dll,OpenQueryWindow

[スタート]→[ファイル名を指定して実行]で,これを使うと検索画面が起動します.とまあ余談はおいておいて,本線のActivedirectoryの操作方法について書いてみることにします.ここではwindows2003のActivedirectoryを対象としています.ActiveDirectoryは基本的にLDAPですが,LDAPについての説明は省きました.使い方の例を書くために,example.co.jpというドメインで,電話番号が012-345-6789,idがuser1である湯沢一郎さんが,エンジニア部門に所属している場合を考えてみましょう.ここで,エンジニア部門のidはengineerです.

ユーザオブジェクトを作成するには以下のようにコマンドします.

dsadd user cn=user1,cn=users,dc=example,dc=co,dc=jp
  -ln "湯沢" -fn "一郎" -display "湯沢 一郎" -tel "012-345-6789"
  -email "user1@example.co.jp" -dept "エンジニア部門"

ホントは一行です.これでオブジェクトができました.で,パスワード設定とアカウントを有効にする方法は以下のようになります.

dsquery user -name user1 | dsmod user -pwd PASSWORD -disabled no

"dsquery user -name user1"というコマンドはuser1のDNを出力します.これをパイプでつないでdsmodで使っているんです.パイプを使わなければこんな感じになります.

dsmod user cn=user1,cn=users,dc=example,dc=co,dc=jp -pwd PASSWORD -disabled no

次にグループオブジェクトを作ります.

dsadd group cn=engineer,cn=users,dc=example,dc=co,dc=jp -desc "エンジニア部門"

これでグループオブジェクトができたので,グループのメンバとして湯沢さんを登録します.

dsmod group "cn=engineer,cn=users,dc=example,dc=co,dc=jp"
  -addmbr "cn=user1,cn=users,dc=example,dc=co,dc=jp"

これで一通りの作業ができました.ちなみに,Activedirectory内にある全ユーザオブジェクト一覧を見るためには,

dsquery user cn=users,dc=example,dc=co,dc=jp

とします.さらに,このドメインの中で使っているグループ一覧を見るには,

dsquery group cn=users,dc=example,dc=co,dc=jp

グループを削除するのは,

dsrm cn=engineer,cn=users,dc=example,dc=co,dc=jp

となります.dsコマンドを使って作業自体はやってしまったのですが,ActivedirectoryはLDAPなんだからNet::LDAPを使おうと思って作ってみたのが以下のスクリプトです.

use Net::LDAP;
use Encode qw(from_to);
use strict;

my ($server, $uname, $pass);
my ($ldap, $mesg, $entry, @attr);

$server = "ad.example.co.jp";
$uname  = "user1\@example.co.jp";
$pass   = "PASSWORD";

@attr   = ('sn', 'givenName', 'displayName',
  'telephoneNumber', 'mail', 'department',
  'physicalDeliveryOfficeName');
$ldap = Net::LDAP->new($server) or die "Could not connect";
$ldap->bind($uname, password => $pass);
$mesg = $ldap->search(
	base => 'cn=user1,cn=users,dc=example,dc=co,dc=jp',
	scope => 'base',
	filter => "(&(objectclass=user)(!(objectclass=computer)))");

$entry = $mesg->entry(0);
for my $attr (@attr){
	my $str = $entry->get_value($attr);
	from_to($str, "utf8", "shiftjis");
	printf "%s:%s\n", $attr, $str;
}

$ldap->unbind;

参考にしたのは,ldapenumldapenum download | SourceForge.net です.このスクリプトで,注意しないといけないのは,

$uname  = "user1\@example.co.jp";

のところです.この形式でないとユーザー認証が通りません.