ActiveDirectoryで管理しているユーザーについて、phpを使ってユーザー名を取得してみたかったのでやってみた
今回は氏名(name)とユーザー名(samaccountname)を取得して表示させる
php-ldapのインストール
yum install php-ldap
実行したコード
<?php
// ADサーバー接続
$ldapconn = ldap_connect('ldap://xxx.xxx.xxx.xxx/'); ←IPアドレス
// ADに登録されているアカウント(管理者権限じゃなくても良い)
$user = 'xxxxxxx'; ←ユーザー名
$passwd = 'xxxxxx'; ←パスワード
// ベースのDN
$base_dn = 'ou=ラーメンビル,ou=Users,ou=Ramen,dc=ramen,dc=local'; ←検索を開始したい場所(ActiveDirectory ユーザーとコンピューターのツリー構造みるとわかりやすい)
// フィルター
$filter = '(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; ←(!(userAccountControl:1.2.840.113556.1.4.803:=2)は無効ユーザーは除くの意
// LDAPオプションを設定
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
if($ldapconn){
// ldapサーバーにバインドする
if (ldap_bind($ldapconn, $user, $passwd)) {
// 情報を取得する
$sr = ldap_list($ldapconn, $base_dn, $filter, array('name', 'samaccountname')); ←arrayに取得したい情報の属性を指定。すべて小文字にしないとエラーになるので注意。
$info = ldap_get_entries($ldapconn, $sr);
// 検索のヒット件数を取得
$count = $info['count'];
// 取得した情報を表示する
for ($i = 0; $i < $count; $i++) {
$ent = $info[$i];
$name = $ent['name'][0];
$username = $ent['samaccountname'][0];
echo "$name<br>\n";
echo "$username<br>\n";
}
// ADサーバー接続解除
ldap_unbind($ldapconn);
}
}
?>
ポイント
ADに登録されているアカウントを使用して、ldap_bindすること
ユーザーやパスワード情報を使用しない匿名ユーザーでもADに接続はできるようだが、ldap_list箇所でエラーが出てしまうため情報取得のためにはADに登録されているユーザーでのログインが必要
ActiveDirectory ユーザーとコンピューターの画面と照らし合わせながらパラメーターを確認
ベースDN、フィルター、arrayあたりで指定する属性の確認方法は下記の通り
・ActiveDirectoryユーザーとコンピューターを開く
・ユーザーのプロパティを開き、属性エディターから確認
参考
https://qiita.com/mindwood/items/782f828d6a769f4aef66
https://php.plus-server.net/function.ldap-get-entries.html
https://php.plus-server.net/function.ldap-bind.html
http://phpdoc.m-takagi.org/function.ldap-get-entries.html

コメント