volkers
Goto Top

Fehler bei Zugriff per Script auf externe Domäne

Hallo liebe Community,
per VBA-Code (MS-Access 2013) sollen einige Informationen aus dem AD ausgelesen werden.
So lange sich der Rechner in der eigenen (Home) Domäne (dom1) befindet ist alles keine Problem.
Soll der Zugriff jedoch auf eine externe Domäne (dom2) stattfinden, so kommt folgende Meldung: Eine Referenzauswertung wurde vom Server zurückgesendet.
Anbei der dazugehörige Code:
Function fnGetLastLogon(xDomaene As String, intTyp As DOMAnmeldeTyp, Optional xTAGE As Integer = 90)

    Dim ado                                  As Object
    Dim adoCmd                               As Object
    Dim objList                              As Object
    Dim rst                                  As DAO.Recordset2

    Dim lastWeek                             As Date
    Dim lastWeekValue                        As String
    Dim strFilter                            As String
    Dim arrDom()                             As String
    Dim strPWD                               As String
    Dim xDATE                                As Date
    Dim xObject                              As String

    On Error GoTo Err_Function_fnGetLastLogon

    Dim strModulName                         As String
    Dim varErrLine                           As Variant
    strModulName = "mdlADSI.fnGetLastLogon"  
    DoCmd.Hourglass True
    Select Case intTyp
        Case DOMAnmeldeTyp.DOM_COMPUTER
            xObject = "computer"  
        Case DOMAnmeldeTyp.DOM_USER
            xObject = "person"  
        Case Else
            FormatMsgBox "Fehler@Unbekannter Anmeldetyp (nur Benutzer oder Computer).@", vbExclamation  
            Exit Function
    End Select

    arrDom = Split(xDomaene, ".")  
    If Not UBound(arrDom) = 1 Then
        FormatMsgBox "Fehler@Unbekannte Domäne (nur dom1.local oder dom2.local).@", vbExclamation  
        Exit Function
    End If

    Select Case arrDom(0)
        Case "dom1"  
            strPWD = "xxxxx"  
        Case "dom2"  
            strPWD = "xxxxx"  
        Case Else
            FormatMsgBox "Fehler@Unbekannte Domäne (nur dom1.local oder dom2.local).@", vbExclamation  
            Exit Function
    End Select

    CurrentDb.Execute "DELETE FROM tbl_AD_LastLogon", dbFailOnError + dbSeeChanges  
    'Datum+Zeit von vor einer Woche ermitteln  
    lastWeek = DateAdd("d", xTAGE * -1, Now)  

    'Zeigt den Integer Wert des betreffenden Datums+Uhrzeit...  
    lastWeekValue = DateToLargeIntegerString(lastWeek)

    'Nun eine Liste aller Benutzer ausgeben lassen, die sich seit den vergangenen x-Tagen nicht angemeldet haben:  
    strFilter = "(&(objectCategory=" & xObject & ")(lastLogon<=" & lastWeekValue & "))"  

    'Suche Ausführen!  
    Set ado = CreateObject("ADODB.Connection")        'Neue ADO Connection erzeugen  
    ado.PROVIDER = "ADSDSOObject"                     'Die ADSI-Schnittstelle verwenden  
    ado.Properties("User ID") = "administrator@" & xDomaene    'Credentials angeben - wenn sie diese zwei Zeilen weglassen, ...  
    ado.Properties("Password") = strPWD               '... werden die aktuellen Anmeldedaten verwendet  
    ado.Properties("Encrypt Password") = True  
    ado.Open "ADS-Search"                             'Beliebigen Namen für die Connection vergeben  

    Set adoCmd = CreateObject("ADODB.Command")        'Neues ADO-Kommando erzeugen  
    adoCmd.ActiveConnection = ado                     'Zuordnung zur bestehenden ADO-Connection  
    adoCmd.Properties("Page Size") = 10000            'Parameter für Paged Result Suche auf 1000 setzen (=AD Standard)  
    adoCmd.Properties("Cache Results") = True  
    adoCmd.CommandText = "<LDAP://dc=" & arrDom(0) & ",dc=" & arrDom(1) & ">;" & strFilter & ";distinguishedName,name,lastLogonTimestamp,lastLogon,userAccountControl;subtree"  
    Set rst = CurrentDb.OpenRecordset("tbl_AD_LastLogon")  

    Set objList = adoCmd.Execute                      'Suche durchführen  
    While Not objList.EOF
        rst.AddNew
        rst("Pfad").Value = objList.Fields("distinguishedName").Value  
        rst("COMP_NAME").Value = objList.Fields("name").Value  
        xDATE = LargeIntegerToDate(objList.Fields("lastLogon").Value)  
        If Not xDATE = #1/1/1601# Then
            rst("LAST_LOGON").Value = xDATE  
        End If
        rst("AKTIV").Value = fnAccountIsActive(fnGetUserAccountControl(objList.Fields("userAccountControl")))  
        rst.Update
        objList.MoveNext
    Wend                                              'zum nächsten gefundenen Objekt  
    
    rst.Close

ExitHere:
    On Error Resume Next
    DoCmd.Hourglass False
    Set rst = Nothing
    Set objList = Nothing
    Set adoCmd = Nothing
    Set ado = Nothing
    Exit Function

Der Fehler tritt an der Stelle auf, an der das erste mal auf das Objekt: objList zugegriffen wird (Zeile 74): While Not objList.EOF
Ebenso kann auch per WMI nicht auf Rechnerinformationen zugegriffen werden, die nicht in der Home-Domäne liegen, obwohl die Anmeldeinformationen korrekt übergeben werden.
Die Domänen besitzen die jeweilige Vertrauensstellung untereinander.

Hat denn evtl. jemand einen Ansatz?

Vielen Dank,
Volker

Content-Key: 284353

Url: https://administrator.de/contentid/284353

Printed on: April 19, 2024 at 09:04 o'clock

Member: emeriks
Solution emeriks Oct 01, 2015, updated at Oct 02, 2015 at 04:56:11 (UTC)
Goto Top
Hi,
erweitere mal die Abfrage so, dass Du bei
"<LDAP://dc=" & arrDom(0) & ",dc=" & arrDom(1) & ">;"  
explizit einen DC mit angibst. Oder aber den FQDN der Domäne.
"<LDAP://" & dcname & "."  & arrDom(0) & "." & arrDom(1) & "/dc=" & arrDom(0) & ",dc=" & arrDom(1) & ">;"  

oder (sollte auch reichen)
"<LDAP://arrDom(0) & "." & arrDom(1) & "/dc=" & arrDom(0) & ",dc=" & arrDom(1) & ">;"  


E.
Member: VolkerS
VolkerS Oct 02, 2015 at 04:59:08 (UTC)
Goto Top
Hallo emeriks,
wahrlich, du bist ein Gott.
Es funktioniert!
Du glaubst gar nicht, wie lange ich an diesem Problem schon herumgeknobelt habe.
Vielen Dank!

Volker
Member: emeriks
emeriks Oct 02, 2015 updated at 07:19:32 (UTC)
Goto Top
wahrlich, du bist ein Gott.
Ich darf doch wohl sehr bitte! Ich bin DER Gott! face-wink