電子書籍の厳選無料作品が豊富!

perlスクリプトを使いactive directoryにユーザを登録したいと思っております。

perlもactive directoryも初めてで理解していませんが
仕事でどうしてもやらなくてはならないためどなたかわかる方教えて頂けますと助かります。

環境:
windows server 2008R2
active directory 2008
centos 6

やりたいことは、perlを使いactive directoryにユーザ登録をしたいのですが
どうやっても登録することができません。
必要なperlモジュールはインストールしてるつもりです。

以下がスクリプトとなります。
=================ここから==================
#!/usr/bin/perl

use strict;
use Net::LDAP;

my $ldap_host = 'xxx.xxx.xxx.xxx';
my $bind_dn = 'cn=admin,o=example,c=com';
my $bind_pw = 'password';

my $ldap = Net::LDAP->new( $ldap_host ) or die "$@ $!";
$ldap->bind( $bind_dn, password => $bind_pw ) or die "$@ $!";

$uid = "localuser";
$suffix = ",ou=People,dc=example,dc=com";
$dn = "uid=" . $uid . $suffix;
$addResult = $ldap->add( $dn,
attr => [
'cn' => $uid,
'sn' => $uid,
'mail' => $uid . '@example.com',
'uid' => $uid,
'objectClass' => [
'top',
'person',
'organizationalPerson'
],
]
);

if ( $addResult->code == 0 ) {
print "added $dn\n";
} else {
$ldap->unbind;
warn "failed to add entry: ", $addResult->error, "\n";
exit( $addResult->code );
}
=================ここまで===================
上記を実行すると以下のエラーコードが返ってきます。
comment:AcceptSecurityContext error,

このエラーについてとあるサイトをみると
「ユーザーは次回ログオン時にパスワード変更が必要」にチェックをいれていると
出力されてしまうとかかれていたのでチェックを外しているのですが結果は同じです。

上記のスクリプトは以下のサイトを参考にして作ったのですが
わからない部分があります。
http://d.hatena.ne.jp/askadna/20080326
http://www.knowd.co.jp/yamazaki/index.php?q=node …

$ldap->addのメソッド?に$dnとattr~~というパラメータを与えているのですが
配列の階層が異なっていますがaddメソッドはこれを認識することはできるのでしょうか。

例えば、 $ldap->addを部分を消して
$addResult = ( $dn,
attr => [
'cn' => $uid,
 ~以下省略~

以下のようにprintで表示すると配列の階層はバラバラです。
これでaddは正常に階層をみて動作するのでしょうかということです。
print $addResult[0]・・・・uid=localuser,ou=People,dc=example,dc=com
print $addResult[1]・・・・attr
print $addResult[1]->[0]・・・・cn
print $addResult[1]->[1]・・・・localuser
print $addResult[1]->[2]・・・・sn
~~省略~~~

ちなみに、searchメソッドでldapの情報の取得はできています。

少し気になるのはActive directoryに必須項目があり
それをattrに格納させていないことが原因だったりするのでしょうか。
Active Directoryの必須項目というのがわかりませんが基本的に例えばSIDなどは
システム自動で入れてくれるとおもっていますが・・・

上記のスクリプトでADにバインドできていることがAD側のログで確認できております。
addでこけているみたいなのですが、どうかよろしくお願い致します。

A 回答 (4件)

> $userpassをutf16にする関数の使い方はあってますか?


本家では
> my $newUniPW = $charmap->tou('"'.$newPW.'"')->byteswap()->utf16();
となっています。
よく考えたら私はActivePerlで動かしていたので、
Linux環境ではbyteswap()がないとダメとか、
どこかでチラ見した記憶が・・・曖昧ですみません。

http://search.cpan.org/~gbarr/perl-ldap/lib/Net/ …

この回答への補足

追記してみましたが結果は同じでした。

ありがとうございます。

なんとか頑張ってみます。

補足日時:2011/10/17 13:13
    • good
    • 0
この回答へのお礼

解決しました。

dnを指定する際に、uidを入れているのがいけなかったようです。
cnとouとdcのみで登録することができました。

お礼日時:2011/10/25 00:08

> failed to add entry: 00002081: NameErr: DSID-03050C42, problem 2003 (BAD_ATT_SYNTAX), data 0, best match of:



これはaddの中のattrが悪いんでしょうね。項目の区切り(,)が抜けてるとか、私はよくやりますが。
ところでattrに
> 'uid' => $uid,
ってありますが、ActiveDirectory内における所謂UIDは、
sAMAccountNameがそれに該当していたかと思います。
これもSyntaxエラーを出すかも。

この回答への補足

ADのADSIエディターを確認すると
uidとsAMAccountNameは属性として別の項目にあったので
別ものなのかなとはおもいましたが、念のため
削除し実行しましたがダメでした。

やはりattrの中身がよくなさそうですね。

ちなみに変更もできることを確認しました。

ADへのアクセスは問題なく、さらに
検索、変更、削除ができることからやはりaddの中の
属性のパラメータがおかしいかなっとおもってます。

AD2008R2だとこの属性はいれないとだめっていうのがやはり
あるんですかね?

もう少し格闘してみます。

因みに前回の補足に記載させて頂きましたが
$userpassをutf16にする関数の使い方はあってますか?

補足日時:2011/10/15 10:18
    • good
    • 0

my $mesg = $ldap->bind(


  'cn=Administrator, cn=Users, dc=mydomain, dc=local',
   password => 'dom_admin_pass'
);

肝はこの辺りじゃないかなぁと思います。
上の例なら、ドメイン'mydomain.local'の
'Users'コンテナ内のユーザー'Administrator'が
Domain Adminsグループのメンバーでなければ、権限がないのでエラーになるでしょうし。

この回答への補足

ありがとうございます。

bindしているユーザは、Domain Adminsグループに所属しているためその辺りは問題ないようです。
実際にAD上でユーザ作成、OU作成など問題なくできます。

さらに進捗があり削除することはできました。

怪しいところは$ldap->add のパラメータに問題があるような気がします。
それかkuroizellさんがおっしゃるようにパスワードがutf16でないことが原因なのかもしれません。
ちなみに、$charmap->tou('"' . $userpass . '"')->utf16le();の $userpass は
ここでは書かれていませんがパスワードを変数に代入しておいて使うんですよね?

現状、私は以下のようにしてみました。
my $userpass = 'abcd1234';
my $charmap = Unicode::Map8->new('latin1') or die;
my $unicodePwd = $charmap->tou('"' . $userpass . '"')->utf16le();

確認ですが、printで$unicodePwdを表示させたのですが
abcd1234と表示されました。
utf16leをして代入するとprintが変わったりするのでしょうか?

また、エラーの表示内容が変わりました。
failed to add entry: 00002081: NameErr: DSID-03050C42, problem 2003 (BAD_ATT_SYNTAX), data 0, best match of:

修正した内容は$ldap->addの括弧からattrの間のパラメータをダブルクウォートからシングルクウォートに変更したら
上記のようなエラーに変わりました。

補足日時:2011/10/14 15:56
    • good
    • 0

ユーザーパスワードがutf16じゃないとダメとか、


そんなんで引っかかった記憶があります。

とりあえず動いているものを。
CentOS4.9
Perl5.8.5
Active Directory 2003

use Net::LDAP;
use Unicode::Map8;
use Unicode::String qw(utf16);

my $ldap = Net::LDAP->new( 'ldaps://hostname.mydomain.local' ) or die "$@";
my $mesg = $ldap->bind(
  'cn=Administrator, cn=Users, dc=mydomain, dc=local',
   password => 'dom_admin_pass'
);
  
$mesg->code && die $mesg->error;
  
my $charmap  = Unicode::Map8->new('latin1') or die;
my $unicodePwd = $charmap->tou('"' . $userpass . '"')->utf16le();

my $result = $ldap->add(
  "cn=$full_name, ou=$subgroup, ou=$group, dc=mydomain, dc=local",
  attr => [
    'cn'         => $full_name,
    'sn'         => $family_name,
    'givenName'     => $given_name,
    'displayName'    => $full_name,
    'objectclass'    => ['top', 'person', 'organizationalPerson', 'user' ],
    'userPrincipalName' => $uid . 'mydomain.local',
    'sAMAccountName'   => $uid,
    'userAccountControl' => '66048',
    'unicodePwd'     => $unicodePwd,
  ]
);

$result->code && warn "failed to add entry: ", $result->error ;
my $mesg = $ldap->unbind;

この回答への補足

返信ありがとうございます。

頂いたスクリプトの内容を元に変更してみたところエラーの内容が変わりました。

problem 5003 (WILL_NOT_PERFORM), data 0

といったエラーになりました。

Active Directoryに登録する際に権限がないといったことが書かれているサイトが
あったのでADに登録するユーザをフルコントロールで対象OUのプロパティに追加しましたが結果は同じでした。

msのサイトではレプリケーションの際に動作がうまくいっていないといったことが書かれてましたが
いまいちよくわからない状況です。

補足日時:2011/10/14 11:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!