查询AD使用LotusScript - lastLogon值空(Query AD using L

2019-10-17 10:14发布

亲爱的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

但这是空的,而“name”字段具有正确的值(我知道lastLogon字段是一个64位的日期 - 整数左右)。

例如使用在VBScript中相同的查询接收lastLogon内容很好。

也使用类似的LotusScript代码中查询的SQL给出了同样的空lastLogon值。

没有任何人有一个想法?

提前致谢!

Answer 1:

最后,我已经找到了解决办法。

首先访问所有对象的lastLogon(等种类AD变量)必须被设置,其接收当前AD用户对象:

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

...

然后lastLogon必须被设置为对象,以及:

Set objLastLogon = objUser.Get("lastLogonTimeStamp")

该OLE对象将有一个HighPart和LowPart成员。 使用成员最后一次登录的日期和时间可以计算出来。

此博客条目睁开双眼: http://sgwindowsgroup.org/blogs/badz/archive/2010/03/01/querying-for-the-lastlogontimestamp-attribute-of-all-users-in-an-ou.aspx

这里是一个可以接收特定用户的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


文章来源: Query AD using LotusScript - lastLogon value empty