Timeout bei Zugriff auf Memberlist-Attribut eines LDAP Objec
Hi!
Ich habe ein paar Code-Zeilen, die lesen Informationen aus dem ActiveDirectory per LDAP aus. Hierzu gehört das Erfassen der Mitglieder einer Gruppe. Vereinfacht dargestellt mache ich das so:
Code:
Set objGroup = GetObject("LDAP://" & strDN)
objGroup.GetInfoEx Array("primaryGroupToken"), 0
intGroupToken = objGroup.Get("primaryGroupToken")
Debug.Print "marker 1"
For Each objMember In objGroup.Members
Debug.Print "marker 2"
' hier kommt nun weiterer Code
Next
Debug.print "marker 3"
Mein Problem ist nun, dass bei einem bestimmten (irgendwie seltsamen) Active-Directory bei einem bestimmten AD-Objekt (einer bestimmten Gruppe) "Marker 1" noch ausgegeben wird, "Marker 2" oder "Marker 3" aber nie. Man könnte ja nun denken, dass das einfach nur dauert, weil die Gruppe gerade unheimlich viele Mitglieder hat und Geduld würde das Problem lösen. Das ist aber nicht so. Der Rechner hängt und "Marker 2" wird nie erreicht. Selbst wenn Geduld helfen würde, der Benutzer sieht, dass mein Programm nicht mehr reagiert, weil es hier scheinbar ewig wartet.
Frage: Kann man da irgendwie ein Timeout definieren und dann die Aktion als "failed" deklarieren oder so? Das würde mir schon helfen. Ich hätte lieber die Info, dass ich die Mitglieder einer Gruppe nicht bestimmen kann, als dass mein Programm nicht weiter läuft...
grundsätzlich kann ADSI bei einer LDAP-Verbindung wohl einen Timeout vorgeben, aber es könnte sein, dass das per Skript nicht geht. Jedenfalls habe ich auf die Schnelle nur Hinweise auf C++ gefunden.
Wäre es eine Option, per ADO auf das AD zuzugreifen? Das hat zwar einige Beschränkungen, aber man kann, wie bei jeder ADO-Verbindung, einen Timeout setzen.
grundsätzlich kann ADSI bei einer LDAP-Verbindung wohl einen Timeout vorgeben, aber es könnte sein, dass das per Skript nicht geht.
Ich bin willens, es auszuprobieren! Sag einfach mal, wie man das machen würde. Über objGroup.Properties("Timeout") geht es nicht, das habe ich probiert, das ist irgendwie falsch.
Jedenfalls habe ich auf die Schnelle nur Hinweise auf C++ gefunden.
Das müsste man doch anpassen können... Was hast du denn da gefunden?
Wäre es eine Option, per ADO auf das AD zuzugreifen?
Das weiß ich nicht. Das müsste ich ausprobieren. Der Code oben funktioniert so wie er ist bei allen anderen ADs und ist auch ausreichend schnell. Wie ginge das denn über ADO? Ich könnte das testen...
Aber Achtung: Mit einigen Attributen kann ADO leider nicht ohne Weiteres umgehen, z.B. description (das ist nämlich intern ein Multivalue-Feld und wird nur durch ADSI als Einzelwert zurückgegeben).
Aber Achtung: Mit einigen Attributen kann ADO leider nicht ohne Weiteres umgehen, z.B. description (das ist nämlich intern ein Multivalue-Feld und wird nur durch ADSI als Einzelwert zurückgegeben).
Nach mehreren Stunden des Versuchens krieg ich es nicht hin. Bei mir funktionieren die Scripte aus dieser Abteilung nicht (Provider: Unbekannter Fehler bei "Set objRSAD = objConn.Execute(strSQL)").
Auch alle meine anderen eigenständigen Versuche, über ADO alle Mitglieder einer Gruppe auszulesen, sind bei mir fehlgeschlagen. Wie im OP oben schon beschrieben habe, mit einem einfachen Getobject klappt das prima, außer bei (bisher genau) einer Gruppe, wo ich dann einfach keine Antwort vom AD erhalte und mein Programm dann hängt. Ein Timeout würde helfen, aber ich weiß nicht, wie man das bei einem GetObject einrichtet. Ehrlich gesagt, weiß ich gar nicht genau, welchen Provider genau GetObject benutzt und ob man da nicht doch noch Optionen einstellen kann... Kennt jemand vielleicht einen Link, der mir den Unterschied zwischen ADO und dem, was ein GetObject macht, erklären kann? Wenn ich's verstehen würde, würd's vielleicht helfen.
ist denn an der Gruppe, die du abfragst, irgendwas Besonderes? Auffälligkeiten bei der Ansprache mit anderen Programmen?
Ich denke, man sollte eher das Problem lösen, statt einen Workaround zu schaffen. Zumal ein Skript eben bei sowas schnell überfordert ist - die Scripting-Schnittstellen ermöglichen eben nicht alles, was man mit einer "echten" Programmierung machen kann.
Ich denke, man sollte eher das Problem lösen, statt einen Workaround zu schaffen.
Grundsätzlich gebe ich dir recht, aber eine Anforderung an Programme ist auch Fehlertoleranz. Besonders, wenn man was schreibt, was man nicht ausschließlich selbst benutzt, sondern auch (leider häufig relativ unbedarfte) Anwender. Wenn dann andere Teile Fehler schmeißen, darf es keinen Einfluss auf ein _gutes_ Programm haben, denn der Anwender sieht nur, dass mein Programm hängt und nix mehr tut. Er meint, mein Programm sei ******e, in Wirklichkeit ist es sein doofes AD. Und ich würde gerne _gute_ Programme schreiben. Ich komme also nicht drumrum, ich muss Gruppenmitglieder auslesen und gleichzeitig bei den Abfragen ein Timeout verwenden.
du kannst gern noch fünfmal fragen, aber ich denke nicht, dass jemand mit seinem Wissen hinterm Zaun hält. Wie gesagt: Meine Vermutung ist, dass du das per Skript eben nicht hinbekommst. Jedenfalls ist mir das in Skripten noch nicht über den Weg gelaufen.
Du hast aber auch immer noch nicht beantwortet, was passiert, wenn du mit anderer Clientsoftware dasselbe Objekt abfragst. Hängt das dann auch? Ich habe in manchen Situationen schon auf direkte ADSI-Abfragen per Skript verzichtet und stattdessen einen Shell-Aufruf z.B. von AdFind gemacht, weil dadurch einige Probleme nicht auftraten.
Du, es ist wirklich nicht so, dass ich undankbar klingen will, ich bin durchaus sehr glücklich darüber, dass sich hier jemand meiner annimmt. Worauf ich durch mein ständiges Nachfragen halt hinaus will ist, dass ich nicht denke, dass andere Programme grundsätzlich anders auf das AD zugreifen können, als ich das in meinem VB Programm auch könnte. Egal, ob andere Programme das schaffen, das bringt mich nicht weiter, denn die Antwort auf diese Frage hat keinen Einfluss darauf, was ich in meinem Programm machen muss.
Es ist doch so: Mein Programm kommuniziert mit dem AD, das heißt, es gibt einen Request, und darauf bekommt mein Programm unter Umständen keinen Reply und dann hängt das Programm. Es kann doch nicht sein, dass das "broken by design" ist, oder irre ich da?
Was mir helfen würde, wären konkrete funktionierende Beispiele, wie man per LDAP (mit einstellbarem Timeout) die Mitglieder einer Gruppe ermitteln kann.
Wie gesagt: Meine Vermutung ist, dass du das per Skript eben nicht hinbekommst.
Auch das kann ich nicht nachvollziehen. Ich greife doch in meinem VB6 Programm nicht auf andere Schnittstellen zu, als ein C++ Programm auch...
Jedenfalls trotzdem Danke für die Hilfe. Dann muss ich versuchen andere Quellen anzuzapfen.