- PR -

ActiveDirectory に CSVファイルからグループ登録をするスクリプト作成

投稿者投稿内容
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-19 22:05
問題を切り分けるために、先のスクリプトの strFilter を以下のようにして
<テスト3>のCSVファイルを投入すると、登録されないことを確認しました。

strFilter = "(&(objectClass=group)(gidNumber="& strgidNumber &"))"

また、gidNumber のみ異なり、それ以外の値は既に登録されているCSVファイル

■例
testgroup04,テストグループ04,testgroup04,ad01,2007
testgroup05,テストグループ05,testgroup05,ad01,2008
testgroup06,テストグループ06,testgroup06,ad01,2009

を投入した場合は、以下のメッセージが表示され、
グループは登録されませんでした。

--- 以下 ---
(null): オブジェクトは既に存在します。
--- 以上 ---

ただし、msSFU30Name が既登録のCSVファイルはグループ登録できてしまいます。

そこで、

strFilter = "(&(gidNumber="& strgidNumber &")(msSFU30Name="& strmsSFU30Name &"))"



strFilter = "(&(objectClass=group)(gidNumber="& strgidNumber &")(msSFU30Name="& strmsSFU30Name &"))"

といったものを試しましたが、上記同様、msSFU30Name が既登録のCSVファイルはグループ登録できてしまいます。

LDAPフィルタの書き方が間違っているのでしょうか?

貴重なお時間を頂き申し訳ありませんが、
宜しくお願い致します。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-20 00:13
ちょっとばかしキツイこと書くようですが。
debug ってやったことありませんか?

今回の場合、とりあえず登録自体の制御は行わずに LDAP query だけを投げてみれば、結果が返ってくるかで判断は可能ですよね?

で、そこが OK なら次に疑うべきは条件分岐。

そんな感じで、一つ一つ問題をつぶしてゆけば最後には問題ないものとなるでしょう。
_________________
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-20 01:47
ちゃっぴ様

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

本格的なデバッグはやったことがありませんが、
今回のような bash のスクリプトなどで 標準出力に表示させたり、
ファイルに出力した結果から問題箇所を見つけ対応したことはあります。

今夏の場合、私自身のWindows経験の未熟さから
1.VBScript がほとんど理解できていない。
2.ActiveDirectoru の LDAPフィルタの書式がわかっていない。
3.Web上で検索をおこなって情報ソースを探しているが、
  私が理解できるような情報ソースが分かっていない
などがあり、皆様のお力をお借りしている状況です。

ご指摘頂いていることは十分承知しております。
その上で何かご助力頂ければ幸いです。
宜しくお願い致します。
ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2007-06-20 13:03
いろいろ試してるみたいですが、
まずは、テスト1のケースについて調査したいので、
フィルタを私が掲示した物に設定した状態で、

「WScript.Echo(strsAMAccountName & " は既に該当グループがあります。") 」
の直前行に、以下のコードを入れてみてください。
フィルタにかかったオブジェクトを表示します。

コード:

Do Until objRecordSet.EOF
set objGroup=GetObject("LDAP://"&Cstr(objRecordSet.Fields(strAttribute)))
msgbox("以下の情報がフィルタにかかりました。objRecordSet.EOF=" & objRecordSet.EOF & vbNewLine _
&"samaccountname=" & objGroup.samaccountname & vbnewLine _
&"msSFU30Name=" & objGroup.msSFU30Name & vbnewline _
&"gidNumber=" & objGroup.gidNumber & vbnewline _
&"distinguishedname=" & objGroup.distinguishedname)
objRecordSet.MoveNext
Loop






[ メッセージ編集済み 編集者: ぴよこ 編集日時 2007-06-20 13:05 ]
つぐ
会議室デビュー日: 2007/05/13
投稿数: 16
投稿日時: 2007-06-20 15:27
ぴよこ様

ご返答頂きありがとうございます。
ご提示頂いたコードを追記した後実行した結果を以下に記します。<テスト1A>

結果から申し上げますと、
問題点が分かり、期待通りの結果を得ることができました。

デバッグ用に頂いたコードから、
testgroup04 グループを追加する際に、
既に登録されている testgroup01 と フィルタにでていました。
そこで、adsi エディットで確認したところ、
確かに msSFU30Name が testgroup04 となっていました。
※testgroup05 もエラー表示内容通りになっていました。

本来ならば、本文下部にあるCSVファイルが登録されていたはずなのですが、
私の方で本件に関していろいろ試しているうちに変えてしまったのだと思います。
原因の切り分けにご助力頂きありがとうございました。
また、私の安易なミスで貴重なお時間を頂いてしまったことをお詫び致します。

そこで、上記を踏まえ、正しい登録済みグループに変更し、
改めて<テスト1>から<テスト3>を行いましたところ、
期待通りの結果を得ることができました。

また、<テスト4>として、samaccountname のみが既登録のCSVファイルを作成し、
実行したところ、期待通り、全てグループ登録されませんでした。

さらに、<テスト7>のようなCSVファイルにて確認を行ったところ、
testgroup12 のみ登録されることを確認しました。

これにより、
「sAMAccountName、msSFU30Nam、GidNumber のうち何れか1つでもマッチすれば グループを作成しない。」
を実現することができました。
これも、ぴよこ様・チャブーン様・ちゃっぴ様のご助力のお陰です。
特にぴよこ様には、再三に渡るご助言・具体的なご提示を頂き、大変感謝しております。
本当にありがとうございました。
次はこれを元に、同様な方法でユーザ登録を行うスクリプトを作成したいと思っております。

最後にもう一つだけ伺わせてください。
今回のスクリプトを作成するに置いて、
ADのLDAPフィルタに関する内容が理解できておりません。
※ご説明頂いた部分は除きます。
そこで、私のような Windows 管理初心者でも
ADのLDAPフィルタを理解できるような
情報元をご存知でしたら教えて頂けないでしょうか。
宜しくお願い致します。


<テスト1A>
==========================================================================================
■CSVファイル
testgroup04,テストグループ04,testgroup04,its,2004
testgroup05,テストグループ05,testgroup05,its,2005
testgroup06,テストグループ06,testgroup06,its,2006

※全項目とも存在しないCSVファイル

■msgBox結果
(&(objectClass=group)(|(samAccountName= testgroup04)(msSFU30Name= testgroup04)(GidNumber=2004)))

上記ウインドウ表示以後、以下表示
------------------------------------------------------------
以下の情報がフィルタにかかりました。objRecordSet.EOF=False
samaccountname=testgroup01
msSFU30Name=testgroup04
gidNumber=2001
distinguishedname=CN=testgroup01,OU=test,DC=ad01,DC=local
--------------------------------------------------------------

(&(objectClass=group)((|(samAccountName= testgroup05)(msSFU30Name= testgroup05)(GidNumber=2005)))

上記ウインドウ表示以後、以下表示
------------------------------------------------------------
以下の情報がフィルタにかかりました。objRecordSet.EOF=False
samaccountname=testgroup02
msSFU30Name=testgroup05
gidNumber=2002
distinguishedname=CN=testgroup02,OU=test,DC=ad01,DC=local
--------------------------------------------------------------

(&(objectClass=group)((|(samAccountName= testgroup06)(msSFU30Name= testgroup06)(GidNumber=2006)))
上記ウインドウ表示以後、ウインドウ表示なし

■実行結果
○testgroup06 のみグループ登録。後は登録されず。
○testgroup06 の msSFU30Name、GidNumber は問題なし。
 上記以外はグループに追加されていないため確認できず。
→ 異常。本来ならば、全グループ登録されなければならない。

■補足
ご提示頂いたスクリプトを追加した際にウインドウに表示された内容ですが、
既に以下のグループが登録されている状態で実行しています。

testgroup01,テストグループ01,testgroup01,its,2001
testgroup02,テストグループ02,testgroup02,its,2002
testgroup03,テストグループ03,testgroup03,its,2003


<テスト4>
==========================================================================================
■CSVファイル
testgroup01,テストグループ07,testgroup07,its,2007
testgroup02,テストグループ08,testgroup08,its,2008
testgroup03,テストグループ09,testgroup09,its,2009

<テスト7>
==========================================================================================
■CSVファイル
testgroup10,テストグループ10,testgroup10,its,2007
testgroup11,テストグループ01,testgroup07,its,2011
testgroup12,テストグループ07,testgroup12,its,2012
testgroup07,テストグループ13,testgroup13,its,2013

ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-21 01:53
引用:
最後にもう一つだけ伺わせてください。
今回のスクリプトを作成するに置いて、
ADのLDAPフィルタに関する内容が理解できておりません。



地道に RFC 2254 読んでくださいとしか。

The String Representation of LDAP Search Filters

難解ですけど。
_________________
チャブーン
大ベテラン
会議室デビュー日: 2006/11/25
投稿数: 149
投稿日時: 2007-06-21 02:02
チャブーンです。

初心者で使うようなサイト、というのはわかりませんが、ちょっと探したら、こういうサイトはありますね。

http://www.rlmueller.net/ADOSearchTips.htm

内容もわりと基本からまとまってますし、MSMVP な人のページなんで、悪くないんじゃないですかね。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-21 02:26
知らないうちに RFC 4515 に置き換わっていた。。。

_________________
ちゃっぴ@わんくま同盟
ちゃっぴの監禁部屋

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2007-06-21 02:26 ]

スキルアップ/キャリアアップ(JOB@IT)