【IDM】MSMQ を使って確実なユーザー登録を行う その7 ~ キューを移動する


明日23日が休みだってことに、いま気付きました。

MSMQでユーザー登録シリーズです。で、すいません。最終回じゃないです。

今回はエラーとなったメッセージを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 (2)

  1. 匿名 より:

    今年の営業日も残り少なくなってきました。私がいるオフィスも、心なしか人が少ないような…いや確実に少ない。みなさん、年末年始は休めそうですか?私は…うーん…びみょーです。 #これまでの投稿一覧は、この投稿の最下段に掲載してあります。

  2. 匿名 より:

    さてもう一息ですね。第8回です。 #これまでの投稿一覧はこの投稿の最下段に書いておきます。 前回 作成したスクリプトをキューのルールとして登録する前に、MSMQ運用に必要な知識について書いておきます。知識というよりも、クセですね。

Skip to main content