1

親愛なる LotusScript の達人へ

Windows 2003 AD を Lotus Domino ディレクトリ (V 7.0.3 サーバー/クライアント) と同期する Lotus Notes エージェントを開発しています。

ADODB.Connection および ADODB.Command プロセスを使用して接続し、AD ユーザーにクエリを実行しています。

これはコマンド テキストです。

objCommand.CommandText = "<LDAP://ou=DMHU Users,dc=some,dc=kindof,dc=domain>;(&(objectCategory=person)(objectClass=user));name,lastLogon;subTree"

次に、「lastLogon」フィールドのコンテンツにアクセスします。

objRecordSet.Fields("lastLogon").Value

しかし、フィールド「名前」が正しい値を持っている間、これは空です(lastLogonフィールドは64ビットの日付であることがわかっています-整数など)。

たとえば VBScript で同じクエリを使用すると、lastLogon コンテンツを適切に受け取ります。

また、LotusScript コード内で SQL のようなクエリを使用すると、同じ空の lastLogon 値が返されます。

誰かアイデアがありますか?

前もって感謝します!

4

1 に答える 1

3

最後に、解決策を見つけました。

lastLogon (および種類の AD 変数) にアクセスするには、まず、現在の AD ユーザー オブジェクトを受け取るオブジェクトを設定する必要があります。

Set objUser = GetObject(rs.Fields("adspath").Value)

...

次に、lastLogon もオブジェクトとして設定する必要があります。

Set objLastLogon = objUser.Get("lastLogonTimeStamp")

この OLE オブジェクトには、HighPart メンバーと LowPart メンバーがあります。そのメンバーを使用して、最終ログオン日時を計算できます。

このブログ エントリは私の目を開きました

これは、特定のユーザーの CN と lastLogonTimeStamp を受け取ることができる、私が実装した関数です。

Sub getADUserLastLogon(sUser As String)
    Dim workspace As New NotesUIWorkspace
    Dim conn As Variant
    Dim sRoot As String

    sRoot = "LDAP://ou=USERS_OR_WHATEVER,dc=my,dc=domain"

    Set oConn = CreateObject("ADODB.Connection")
    oConn.Provider = "ADSDSOObject"
    oConn.Open "Ads Provider", "USERNAME", "SECRETPWD" ' open connection with specific user credentials

    Dim rs
    Set rs = oConn.Execute("<" & sRoot & ">;(&(objectCategory=person)(objectClass=user)(cn=" & sUser & "));" &_
    "adspath,distinguishedname,sAMAccountName,cn,mail,telephoneNumber,lastLogonTimeStamp;subtree")

    While Not (rs.EOF)
        On Error Resume Next

        Set objUser = GetObject(rs.Fields("adspath").Value)

        'Print "getting user: " & objUser.Get("cn")

        Set objLastLogon = objUser.Get("lastLogonTimeStamp")

        Dim intLastLogonTime As Double

        intLastLogonTime = (objLastLogon.HighPart * (2^32)) + objLastLogon.LowPart ' due to the 64 bit number
        intLastLogonTime = intLastLogonTime / (60 * 10000000) ' convert from 100nanosec to minutes
        intLastLogonTime = intLastLogonTime + 60 ' local timezone
        intLastLogonTime = intLastLogonTime / 1440 ' convert to hours
        intLastLogonTime = intLastLogonTime + Datenumber(1601,1,1)

        Call workspace.CurrentDocument.Document.ReplaceItemValue("txtADResult", _
        workspace.CurrentDocument.FieldGetText("txtADResult") & Chr(13) & _
        rs.Fields("cn").Value & " Last Logon: " & Format$(Cdat(intLastLogonTime), "yyyy.mm.dd. hh:nn:ss"))

        rs.MoveNext
    Wend
End Sub
于 2012-11-20T13:11:48.163 に答える