【IDM】MSMQ を使って確実なユーザー登録を行う その7 ~ キューを移動する
明日23日が休みだってことに、いま気付きました。
MSMQでユーザー登録シリーズです。で、すいません。最終回じゃないです。
- 【IDM】MSMQ を使って確実なユーザー登録を行う その1 ~ MSMQ って何してくれるの?
- 【IDM】MSMQ を使って確実なユーザー登録を行う その2 ~ MSMQ のインストール(Windows Server 2008)
- 【IDM】MSMQ を使って確実なユーザー登録を行う その3 ~ MSMQ の環境設定
- 【IDM】MSMQ を使って確実なユーザー登録を行う その4 ~ メッセージの送信
- 【IDM】MSMQ を使って確実なユーザー登録を行う その5 ~ メッセージの中身を読み取る
- 【IDM】MSMQ を使って確実なユーザー登録を行う その6 ~ ADにユーザーを登録する
今回はエラーとなったメッセージをErrorキューに移動します。
これは非常に簡単です。
単に、Send で Errorキューに送るだけです。InputにSendしたときとまったく同じですね。
以下の赤く示した部分が、前回から追記したコードで、メッセージをSendしているのが94行目です。今回は、特に難しいところは無いはずです。
アレンジするとすれば、キューの移動部分でしょうか。今回は、エラーが発生したメッセージを一律 再実行を想定して Errorキュー に移動していますが、エラーの種類によってキューを分けるのも良いかもしれません。
たとえば、「登録に失敗したユーザーについては即効で対応する必要がある」ということで、登録失敗専用のキューを作成しておき、キューにメッセージが投稿されたらその都度メールを送信するなどといった処理が考えられます。
ということで、ひとまず、AD登録用スクリプトについては、これで完成です。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
Err.Clear Const MQ_RECEIVE_ACCESS = 1 Const MQ_SEND_ACCESS = 2 Const MQ_PEEK_ACCESS = 32 Const MQ_ADMIN_ACCESS = 128 Const MQ_DENY_NONE = 0 Const MQ_DENY_RECEIVE_SHARE = 1 Set objRootDSE = GetObject("LDAP://RootDSE") strDomainPath = objRootDSE.Get("DefaultNamingContext") strContainerADsPath = "LDAP://" & "CN=Users," & strDomainPath Set objContainer = GetObject(strContainerADsPath) Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection set objQueueInfo_Input = CreateObject("MSMQ.MSMQQueueInfo") set objQueueInfo_Error = CreateObject("MSMQ.MSMQQueueInfo") set objMsgQueue_Src = CreateObject("MSMQ.MSMQQueue") set objMsgQueue_Dst = CreateObject("MSMQ.MSMQQueue") set objMessage = CreateObject("MSMQ.MSMQMessage") set objManagement = CreateObject("MSMQ.MSMQManagement") objManagement.Init "Junichia03",,"DIRECT=OS:junichia03\private$\Input" objQueueInfo_Input.Formatname = "DIRECT=OS:junichia03\private$\Input" objQueueInfo_Error.Formatname = "DIRECT=OS:junichia03\private$\Error" Set objMsgQueue_Src = objQueueInfo_Input.Open(MQ_Receive_ACCESS ,MQ_DENY_NONE) Set objMsgQueue_Dst = objQueueInfo_Error.Open(MQ_SEND_ACCESS ,MQ_DENY_NONE) If objManagement.MessageCount > 0 then On Error Resume Next wscript.echo objManagement.MessageCount & " 件のメッセージがあります" Set objMessage = objMsgQueue_Src.Receive() arrBody = Split(objMessage.Body,",") strUserName = Trim(arrBody(0)) strPassword = Trim(arrBody(1)) strHomeDir = Trim(arrBody(2)) Wscript.Echo "ユーザー名:" & strUserName Wscript.Echo "パスワード:" & strPassword Wscript.Echo "ホームパス:" & strHomeDir objCommand.CommandText = _ "<LDAP://" & strDomainPath & ">;" & _ "(&(objectCategory=person)(objectClass=user)" & _ "(sAMAccountName=" & strUserName & "));" & _ "DistinguishedName, sAMAccountName;" & _ "subtree" Set objRecordSet = objCommand.Execute If NOT objRecordSet.EOF then Set objNewUser = GetObject("LDAP://" & objRecordSet.Fields("DistinguishedName")) Else Set objNewUser = objContainer.Create("user", "CN=" & strUserName) objNewUser.Put "sAMAccountName", strUserName objNewUser.SetInfo() End If Call ErrorHandle(1,err.Number, err.Description) objNewUser.HomeDirectory = strHomeDir objNewUser.SetInfo() Call ErrorHandle(2, err.Number, err.Description) objNewUser.SetPassword(strPassword) Call ErrorHandle(3, err.Number, err.Description) Else Wscript.echo "メッセージがありません" End If Sub ErrorHandle(errPosition, errNumber, errDescription) Select Case errNumber Case 0 Case Else objMessage.Send(objMsgQueue_Dst) Wscript.Echo errPosition & "," & errNumber & "," & errDescription Wscript.Quit(1) End Select End Sub |
さて、このスクリプトをキューのルールとして登録するのですが、その前にMSMQ トリガーの大切な性質(クセ) について解説しておかなければなりません。
これについては次回に(ひきのばしているわけではないのです。すいません。)。
Comments
Anonymous
January 01, 2003
今年の営業日も残り少なくなってきました。私がいるオフィスも、心なしか人が少ないような...いや確実に少ない。みなさん、年末年始は休めそうですか?私は...うーん...びみょーです。 #これまでの投稿一覧は、この投稿の最下段に掲載してあります。Anonymous
January 01, 2003
The comment has been removed