- - PR -
ActiveDirectory に CSVファイルからグループ登録をするスクリプト作成
1|2|3|4
次のページへ»
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-06-18 10:35
Webや手元にある書籍などを参考にしていますが、
どうしても分からないため、 以下に質問内容を記させて頂きます。 なお、私はWindows管理初心者で、 Windowsのバッチファイル・WSH(VBScript)作成経験はほとんどありません。 特に、VBscript の方が分かっていません。 ただし、Linux の bash のスクリプト作成は多少経験があります。 なにかご教授頂ければ幸いです。 何卒宜しくお願い致します。 ■環境 ○ad01 : Win2003ServerR2 SE ドメインコントローラ(以降、DC) SUA による NIS・パスワード同期サーバサービスあり ○ad02 : Win2003ServerR2 SE ドメインコントローラ SUA による NIS・パスワード同期サーバサービスあり ○fs01 : ファイルサーバ SUAによるNFSサーバサービスあり \\\\fs01\\home\\ユーザ名のホームディレクトリ を作成する ■実現したいこと グループ登録用CSVファイルを用意して、 ad01 上で バッチ(or スクリプト)を実行し、グループを登録したい。 ■質問内容(現在分からないこと・できないこと) Q1.下記「groupadd.vbs」のようなスクリプトを作成していますが、 「groupadd.vbs」を実行すると、以下のメッセージが表示され、 「strsAMAccountName」というグループができてしまいます。 >cscript tgrouadd02.vbs tgrouplist-01.csv //nologo strsAMAccountName: testgroup04 strdescription: テストグループ04 strmsSFU30Name: testgroup04 strmsSFU30NisDomain: ad01 strGidNumber: 2004 strsAMAccountName: testgroup05 strdescription: テストグループ05 strmsSFU30Name: testgroup05 strmsSFU30NisDomain: ad01 strGidNumber: 2005 tgrouadd02.vbs(43, 2) (null): オブジェクトは既に存在します。 「objGroup.Put "sAMAccountName", strsAMAccountName」の記述に 問題があると思うのですが、 testgroup04、testgroup05、testgroup06 をグループを作成するためには、 どのような変更を行えばよいのでしょうか。 Q2.以下スクリプトに、CSVファイルに書かれているグループ名・グループIDが すでに ActiveDirectory に存在しているかどうかを 判定する内容を盛り込みたいのですが、 どのような記述をしたらよいか分かりません。 どのようにすればよいのでしょうか。 --- 以下 ---------------------------------------------------------------------- '================================================================ ' groupadd.vbs '================================================================ strDomain = "DC=ad01,DC=local" strNode = "OU=test" strNISDomain = "ad01" Const ForReading = 1 Const ForWriting = 2 Set strArgs = Wscript.Arguments If strArgs.Count = 0 then Wscripts.Quit InputFile = strArgs(0) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFileInput = objFSO.OpenTextFile(InputFile, ForReading) intNume = 0 Do Until objFileInput.AtEndOfLine strData = Split(objFileInput.ReadLine, ",") strsAMAccountName = strData(0) strdescription = strData(1) strmsSFU30Name = strData(2) strmsSFU30NisDomain = strData(3) strGidNumber = strData(4) WScript.Echo("strsAMAccountName: " & strsAMAccountName) WScript.Echo("strdescription: " & strdescription) WScript.Echo("strmsSFU30Name: " & strmsSFU30Name) WScript.Echo("strmsSFU30NisDomain: " & strmsSFU30NisDomain) WScript.Echo("strGidNumber: " & strGidNumber) Set objOU = GetObject("LDAP://OU=test,DC=ad01,DC=local") Set objGroup = objOU.Create("Group", "CN=strsAMAccountName") objGroup.Put "sAMAccountName", strsAMAccountName objGroup.SetInfo objGroup.Put "description", strmsSFU30Name objGroup.Put "msSFU30Name", strmsSFU30Name objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain objGroup.Put "GidNumber", strGidNumber intNum = intNum + 1 Loop WScript.Echo(intNum & " グループが追加されました。") objFileInput.Close Set objFileInput = Nothing Set objFSO = Nothing '================================================================ ■グループ登録用 CSVファイル testgroup04,テストグループ04,testgroup04,ad01,2004 testgroup05,テストグループ05,testgroup05,ad01,2005 testgroup06,テストグループ06,testgroup06,ad01,2006 --- 以上 ---------------------------------------------------------------------- [ メッセージ編集済み 編集者: つぐ 編集日時 2007-06-18 11:21 ] |
|
投稿日時: 2007-06-18 12:54
×Set objGroup = objOU.Create("Group", "CN=strsAMAccountName")
○Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName) |
|
投稿日時: 2007-06-18 13:17
samAccountNameが「test_group」なグループがあるかチェック。
-------------------------------------- strDCName="test_dc_server" strFilter="(&(samAccountName=test_group)(objectClass=group))" strAttribute="distinguishedName" scope="subtree" strUserQuery="<LDAP://" & strDCName & ">;" & strFilter & ";" & strAttribute & ";" & scope set objConnection=CreateObject("ADODB.Connection") objConnection.Provider="ADsDSOObject" objConnection.Open "ADs Provider" set objCommand=CreateObject("ADODB.Command") objCommand.ActiveConnection=objConnection objCommand.Properties("Page Size")=1000 objCommand.CommandText=strUserQuery set objRecordSet=objCommand.Execute(strUserQuery) if objRecordSet.EOF then msgbox("なし") else msgbox("あり") end if msgbox("end") ----------------------------------- |
|
投稿日時: 2007-06-18 14:01
ぴよこ様
早速のご返答ありがとうございます! Q1.に関してご指摘頂いた箇所を含め、以下のようにに変更したところ 登録することができました。 Set objOU = GetObject("LDAP://OU=test,DC=ad01,DC=local") Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName") objGroup.Put "sAMAccountName", strsAMAccountName objGroup.Put "description", strmsSFU30Name objGroup.Put "msSFU30Name", strmsSFU30Name objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain objGroup.Put "GidNumber", strGidNumber objGroup.SetInfo また、この件に関しては実はもう1つ分からないことがあります。 Set objOU = GetObject("LDAP://OU=test,DC=ad01,DC=local") に関してです。 スクリプトの最初で変数に代入している値を利用して上記を記述したく、 以下のようにしたのですが、上手く行きませんでした。 Set objOU = GetObject("LDAP://" & "OU=" & strNode & "," & strDomain) こちらも質問したかったのですが、 まずはグループ登録できるかどうかが問題でしたので、後回しにしていました。 & の使い方が間違っているのでしょうか? それとも根本的に記述が間違っているということでしょうか? 重ね重ね申し訳ありませんが ご教授いただけると幸いです。 |
|
投稿日時: 2007-06-18 15:59
チャブーンです。
---- strDomain = "DC=ad01,DC=local" strNode = "OU=test" strNISDomain = "ad01" < snip > Set objOU = GetObject("LDAP://" & "OU=" & strNode & "," & strDomain) ---- なんですよね?であれば、Set objOU = GetObject("LDAP://OU=OU=test,DC=ad01,DC=local") となってうまくいかないのでしょう。 Set objOU = GetObject("LDAP://" & strNode & "," & strDomain) とすればどうでしょう。 |
|
投稿日時: 2007-06-18 17:02
チャブーン様
ご返答ありがとうございます。 ご指摘通りでした。 Set objOU = GetObject("LDAP://" & strNode & "," & strDomain) Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName) objGroup.Put "sAMAccountName", strsAMAccountName objGroup.Put "description", strdescription objGroup.Put "msSFU30Name", strmsSFU30Name objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain objGroup.Put "GidNumber", strGidNumber objGroup.SetInfo とすることで動作することが確認できました。 あとは、Q2.の方なのですが、 ぴよこ様からご提示頂いたサンプルの内容を理解し、 組み込もうとしています。 宜しくお願い致します。 |
|
投稿日時: 2007-06-18 19:07
ぴよこ様、チャブーン様のおかげで、
以下のようなスクリプトを作成し、グループを登録することができるようになりました。 ありがとうございました。 しかし、さらに分からない点が出てきました。 現状のスクリプトですと、samAccountName が既にある場合は グループ登録されませんが、samAccountName は異なるが、 msSFU30Name、GidNumber は同一である項目が、CSVファイルにある場合、 グループ登録ができてしまいます。 これらも既にADに登録されている場合もグループ登録できないようにしたいのですが、 ぴよこ様からご提示頂いたスクリプトの中身がきちんと理解できていないため、 どのように書き加えていけば良いか分かっておりません。 ご助言頂けると大変助かります。 宜しくお願い致します。 --- 以下 ------------------------------------------------------- ' ' groupadd.vbs ' strDCName = "itsv01.ad01.local" strDomain = "DC=ad01,DC=local" strNode = "OU=test" strNISDomain = "ad01" Const ForReading = 1 intAddNum = 0 intNoAddNum = 0 Set strArgs = Wscript.Arguments If strArgs.Count = 0 then Wscripts.Quit InputFile = strArgs(0) WScript.Echo(Date & " " & Time & " グループ登録開始") WScript.Echo("--------------------------------------------") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFileInput = objFSO.OpenTextFile(InputFile, ForReading) Do Until objFileInput.AtEndOfLine strData = Split(objFileInput.ReadLine, ",") strsAMAccountName = strData(0) strdescription = strData(1) strmsSFU30Name = strData(2) strmsSFU30NisDomain = strData(3) strGidNumber = strData(4) strFilter="(&(samAccountName= "& strsAMAccountName &")(objectClass=group))" strAttribute="distinguishedName" scope="subtree" strUserQuery="<LDAP://" & strDCName & ">;" & strFilter & ";" & strAttribute & ";" & scope Set objConnection=CreateObject("ADODB.Connection") objConnection.Provider="ADsDSOObject" objConnection.Open "ADs Provider" Set objCommand=CreateObject("ADODB.Command") objCommand.ActiveConnection=objConnection objCommand.Properties("Page Size")=1000 objCommand.CommandText=strUserQuery Set objRecordSet=objCommand.Execute(strUserQuery) if objRecordSet.EOF then Set objOU = GetObject("LDAP://" & strNode & "," & strDomain) Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName) objGroup.Put "sAMAccountName", strsAMAccountName objGroup.Put "description", strdescription objGroup.Put "msSFU30Name", strmsSFU30Name objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain objGroup.Put "GidNumber", strGidNumber objGroup.SetInfo WScript.Echo(strsAMAccountName & " グループを登録しました。") intAddNum = intAddNum + 1 else WScript.Echo(strsAMAccountName & " は既に該当グループがあります。") intNoAddNum = intNoAddNum + 1 end if Loop WScript.Echo("--------------------------------------------") WScript.Echo(Date & " " & Time & " グループ登録終了") WScript.Echo("登録グループ : " & intAddNum) WScript.Echo("登録不可グループ : " & intNoAddNum) objConnection.Close objFileInput.Close Set objFileInput = Nothing Set objFSO = Nothing --- 以上 ------------------------------------------------------- |
|
投稿日時: 2007-06-18 20:56
つぐです。
先のスクリプトから、条件分岐を作成すれば判定が可能かと思い、 以下のようにスクリプトを変更しましたが、 以下のエラーが表示され、未だグループ登録されていないグループも、登録できない状況になってしまいました。 解決方法が分からない状況です。 何かご教授頂けると幸いです。 宜しくお願い致します。 > cscript groupadd.vbs tgrouplist-01.csv //nologo 2007/06/18 20:48:49 グループ登録開始 -------------------------------------------- groupadd.vbs(86, 4) (null): エラーを特定できません --- 以下 -------------------------------------------------- ' ' groupadd.vbs ' strDCName = "itsv01.ad01.local" strDomain = "DC=ad01,DC=local" strNode = "OU=test" strNISDomain = "ad01" Const ForReading = 1 'Const ForWriting = 2 intAddNum = 0 'intNoAddNum = 0 Set strArgs = Wscript.Arguments If strArgs.Count = 0 then Wscripts.Quit InputFile = strArgs(0) ' WScript.Echo(Date & " " & Time & " グループ登録開始") WScript.Echo("--------------------------------------------") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFileInput = objFSO.OpenTextFile(InputFile, ForReading) Do Until objFileInput.AtEndOfLine strData = Split(objFileInput.ReadLine, ",") 'strsAMAccountName = strData(0) 'strdescription = strData(1) 'strmsSFU30Name = strData(2) 'strmsSFU30NisDomain = strData(3) 'strGidNumber = strData(4) For i = 0 To 4 Select Case i Case 0 strsAMAccountName = strData(i) strFilter = "(&(sAMAccountName = "& strsAMAccountName &")(objectClass=group))" Case 1 strdescription = strData(i) strFilter = "(&(description = "& strdescription &")(objectClass=group))" Case 2 strmsSFU30Name = strData(i) strFilter = "(&(msSFU30Name = "& strmsSFU30Name &")(objectClass=group))" Case 3 ' strmsSFU30NisDomain = strData(i) ' strFilter = "(&(msSFU30NisDomain = "& strmsSFU30NisDomain &")(objectClass=group))" Case 4 strGidNumber = strData(i) strFilter = "(&(GidNumber = "& strGidNumber &")(objectClass=group))" End Select 'strFilter = "(&(samAccountName = "& strsAMAccountName &")(objectClass=group))" strAttribute = "distinguishedName" scope = "subtree" strUserQuery = "<LDAP://" & strDCName & ">;" & strFilter & ";" & strAttribute & ";" & scope Set objConnection = CreateObject("ADODB.Connection") objConnection.Provider = "ADsDSOObject" objConnection.Open "ADs Provider" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 objCommand.CommandText=strUserQuery Set objRecordSet=objCommand.Execute(strUserQuery) If objRecordSet.EOF Then Set objOU = GetObject("LDAP://" & strNode & "," & strDomain) Set objGroup = objOU.Create("Group", "CN=" & strsAMAccountName) objGroup.Put "sAMAccountName", strsAMAccountName objGroup.Put "description", strdescription objGroup.Put "msSFU30Name", strmsSFU30Name objGroup.Put "msSFU30NisDomain", strmsSFU30NisDomain objGroup.Put "GidNumber", strGidNumber objGroup.SetInfo WScript.Echo(strsAMAccountName & " グループを登録しました。") intAddNum = intAddNum + 1 Else WScript.Echo(strsAMAccountName & " は既に該当グループがあります。") intNoAddNum = intNoAddNum + 1 End If Next Loop WScript.Echo("--------------------------------------------") WScript.Echo(Date & " " & Time & " グループ登録終了") WScript.Echo("登録グループ : " & intAddNum) WScript.Echo("登録不可グループ : " & intNoAddNum) objConnection.Close objFileInput.Close Set objFileInput = Nothing Set objFSO = Nothing --- 以上 -------------------------------------------------- |
1|2|3|4
次のページへ»