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";
のところです.この形式でないとユーザー認証が通りません.