![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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でこけているみたいなのですが、どうかよろしくお願い致します。
No.4ベストアンサー
- 回答日時:
> $userpassをutf16にする関数の使い方はあってますか?
本家では
> my $newUniPW = $charmap->tou('"'.$newPW.'"')->byteswap()->utf16();
となっています。
よく考えたら私はActivePerlで動かしていたので、
Linux環境ではbyteswap()がないとダメとか、
どこかでチラ見した記憶が・・・曖昧ですみません。
http://search.cpan.org/~gbarr/perl-ldap/lib/Net/ …
解決しました。
dnを指定する際に、uidを入れているのがいけなかったようです。
cnとouとdcのみで登録することができました。
No.3
- 回答日時:
> 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にする関数の使い方はあってますか?
No.2
- 回答日時:
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の間のパラメータをダブルクウォートからシングルクウォートに変更したら
上記のようなエラーに変わりました。
No.1
- 回答日時:
ユーザーパスワードが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のサイトではレプリケーションの際に動作がうまくいっていないといったことが書かれてましたが
いまいちよくわからない状況です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ネットワーク Active Directoryの管理者パスワードが過去に変更されたか否かはわかるのでしょうか 1 2023/04/15 18:50
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- その他(パソコン・周辺機器) チャレンジタッチ3 改造 アプリインストールできない 1 2022/07/01 14:43
- サーバー active directory のユーザをローカルで使いたい 1 2023/07/22 07:40
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- オンラインゲーム 原神のフレンド申請について 原神を友達とやりたくてフレンド申請を送ろうとしましたが、フレンド検索画面 2 2023/06/13 19:17
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォームから送られてきた文字...
-
何時間後を求める。
-
例外処理のフローチャートの記...
-
ユーザー定義関数に#NAME?が返...
-
モジュールとクラスの違いって...
-
「デバイスは PRN を初期化でき...
-
エクセルVBAでシートモジュール...
-
現在アクティブなフォーム名を...
-
VBAでoutlook365が起動しません。
-
VBSがコンパイルエラーになりま...
-
VBAで旧字体を異字体に一括で変...
-
VBAのバージョン管理
-
モジュールとは何ですか
-
NET::POP3の代用できるスクリプト
-
perlスクリプトのブラウザURLか...
-
モジュールからフォームのボタ...
-
【vba】フォームに書いてあ...
-
Pythonプログラミングでエラー
-
LCD ディスプレイを Raspberry ...
-
クラスモジュールについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラー
-
XML::XPathで日本語検索するには
-
perlスクリプト s/^\\s+//; ...
-
PerlでIPアドレスを取得する方法
-
「CGIプログラムエラー」って何...
-
perl+shiftjisで5c文字化けの対...
-
実行時パラメータを使用するとE...
-
正規表現でのエラー
-
フォームから送られてきた文字...
-
何時間後を求める。
-
windowsXP上で動作する最新版の...
-
UTF8でperlスクリプトを書くと...
-
ActivePerl 1行入力で 'と"が...
-
Perl 教えてください。
-
メールフォームから大きめの添...
-
perlでactive directoryに登録
-
ローカルテストOKのPerl サー...
-
Perlで長音
-
syntax OKなのに・・・
-
Perlでのルート計算で、小数点...
おすすめ情報