torstenv 10 Geschrieben 1. Oktober 2008 Melden Teilen Geschrieben 1. Oktober 2008 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: 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... Vielen Dank im voraus! Gruß, T. Zitieren Link zu diesem Kommentar
NilsK 2.961 Geschrieben 1. Oktober 2008 Melden Teilen Geschrieben 1. Oktober 2008 Moin, 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. Gruß, Nils Zitieren Link zu diesem Kommentar
torstenv 10 Geschrieben 1. Oktober 2008 Autor Melden Teilen Geschrieben 1. Oktober 2008 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... Freue mich über Hilfe! Gruß, T. Zitieren Link zu diesem Kommentar
NilsK 2.961 Geschrieben 1. Oktober 2008 Melden Teilen Geschrieben 1. Oktober 2008 Moin, Das müsste man doch anpassen können... Was hast du denn da gefunden? naja, ich habe gegoogelt nach "ADSI LDAP bind timeout". Wie ginge das denn über ADO? Ich könnte das testen... Guck's dir hier ab: faq-o-matic.net Mailadresse gezielt suchen 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). Gruß, Nils Zitieren Link zu diesem Kommentar
torstenv 10 Geschrieben 7. Oktober 2008 Autor Melden Teilen Geschrieben 7. Oktober 2008 Guck's dir hier ab: faq-o-matic.net Mailadresse gezielt suchen 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. Zitieren Link zu diesem Kommentar
NilsK 2.961 Geschrieben 7. Oktober 2008 Melden Teilen Geschrieben 7. Oktober 2008 Moin, 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. Gruß, Nils Zitieren Link zu diesem Kommentar
torstenv 10 Geschrieben 7. Oktober 2008 Autor Melden Teilen Geschrieben 7. Oktober 2008 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. Keine Tipps zur Sache? Zitieren Link zu diesem Kommentar
NilsK 2.961 Geschrieben 7. Oktober 2008 Melden Teilen Geschrieben 7. Oktober 2008 Moin, Keine Tipps zur Sache? 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. Gruß, Nils Zitieren Link zu diesem Kommentar
torstenv 10 Geschrieben 8. Oktober 2008 Autor Melden Teilen Geschrieben 8. Oktober 2008 du kannst gern noch fünfmal fragen 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. Gruß, T. Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 9. Oktober 2008 Melden Teilen Geschrieben 9. Oktober 2008 kann es sein, dass an dem Usernamen/ Displaynamen, bei dem das Programm hängen bleibt, Sonderzeichen oder Umlaute vorkommen? cu blub Zitieren Link zu diesem Kommentar
NilsK 2.961 Geschrieben 9. Oktober 2008 Melden Teilen Geschrieben 9. Oktober 2008 Moin, 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. doch, so etwas gibt es durchaus. Es gibt z.B. Schnittstellen, die nur über bestimmte Wege angesprochen werden können und nicht über COM zur Verfügung stehen. 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. Darum geht es doch gar nicht. Es geht mir hier um Diagnose: Haben andere Programme dasselbe Problem oder vergleichbare Schwierigkeiten? Wenn ja, deutet das auf was Grundsätzliches hin, wenn nein, ist das ein Hinweis, dass es an der Art der Ansprache liegt. Es kann doch nicht sein, dass das "broken by design" ist, oder irre ich da? Eben das können wir bislang ja noch nicht einschätzen. Was mir helfen würde, wären konkrete funktionierende Beispiele, wie man per LDAP (mit einstellbarem Timeout) die Mitglieder einer Gruppe ermitteln kann. Das habe ich durchaus verstanden. Was ich ja versuche dir klarzumachen, ist, dass es mit ziemlicher Wahrscheinlichkeit per COM nicht geht. Jedenfalls bietet keiner der mir bekannten COM-Aufrufe einen Parameter dafür. Nun bin ich allerdings auch kein Entwickler. Auch das kann ich nicht nachvollziehen. Ich greife doch in meinem VB6 Programm nicht auf andere Schnittstellen zu, als ein C++ Programm auch... Doch. Siehe oben. Zwecks Eingrenzung der Probleme könntest du - neben einem Zugriffsversuch mit anderen Programmen wie AdFind - auch mal die Kommunikation mit dem AD tracen: AdInsight Gruß, Nils Zitieren Link zu diesem Kommentar
torstenv 10 Geschrieben 9. Oktober 2008 Autor Melden Teilen Geschrieben 9. Oktober 2008 kann es sein, dass an dem Usernamen/ Displaynamen, bei dem das Programm hängen bleibt, Sonderzeichen oder Umlaute vorkommen? Nee, nicht wirklich: CN=Exchange Enterprise Servers,CN=Users,DC=Domainname,DC=de Klar, Leerzeichen kann man auch Sonderzeichen nennen, aber das hat auch bei anderen Gruppen problemlos funktioniert (z.B. "Gruppe 34"). – mit anderen Programmen wie AdFind Nils, Danke für deine Geduld und Erklärung. Ich werde mal versuchen das rauszubekommen. Dazu muss ich aber erst wieder Zugriff auf das betreffende AD haben, und das kann noch etwas dauern. Ich melde mich, sobald ich Neuigkeiten habe, darauf kannst du dich verlassen! ;) Gruß, T. Zitieren Link zu diesem Kommentar
torstenv 10 Geschrieben 15. Oktober 2008 Autor Melden Teilen Geschrieben 15. Oktober 2008 So, ich habe jetzt beim Kunden ins AD schauen dürfen und die Aktion mit ADFind.exe versucht nachzuvollziehen. Doch zunächst einmal zu dem, was ich in meinem Code genau mache. In meinem Tool frage ich nach der Primärgruppen-ID: strDN = strADSPath Set objGroup = GetObject("LDAP://" & strDN) objGroup.GetInfoEx Array("primaryGroupToken"), 0 intGroupToken = objGroup.Get("primaryGroupToken") Ich bekomme bei der betroffenen Gruppe einen Token zurück, nämlich "1433". Dann frage ich das AD nach der Primärgruppe: <LDAP://DC=XX,DC=de>;(primaryGroupID=1433);sAMAccountName,objectCategory;subtree Das bleibt in diesem Falle leer, das heißt, ich bekomme keinen Datensatz zurück (was durchaus OK sein kann, denke ich). Um dann noch die anderen (nicht-primären) Gruppen auszulesen, frage ich noch die .Members ab: For Each objMember In objGroup.Members Da hängt dann mein Programm. Jetzt, was ich ausprobiert habe: adfind -b "DC=XXDomainXX,DC=de" -f "primaryGroupID=1433" Returnt nichts, also NULL. ADFind auf das konkrete Objekt bezogen adfind -b "CN=Exchange Enterprise Servers,CN=Users,DC=XX,DC=de" -f "objectclass=group" liefert aber durchaus Members. Also ADFind ist in der Lage, Mitglieder auszulesen. Die Frage ist: was sagt mir das nun? Zitieren Link zu diesem Kommentar
NilsK 2.961 Geschrieben 15. Oktober 2008 Melden Teilen Geschrieben 15. Oktober 2008 Wie viele Mitglieder hat denn die Gruppe? Klappt es, wenn du z.B. mal ein "join(objGroup.Members)" ausgibst? Und noch eine Idee: Mit ADInsight könntest du mal den Datenverkehr zwischen Client und AD analysieren. Vielleicht gibt das Aufschluss. http://technet.microsoft.com/en-us/sysinternals/bb897539.aspx Gruß, Nils Zitieren Link zu diesem Kommentar
torstenv 10 Geschrieben 16. Oktober 2008 Autor Melden Teilen Geschrieben 16. Oktober 2008 Wie viele Mitglieder hat denn die Gruppe?[/Quote]Nicht sehr viele. Vielleicht 15 oder 20. Klappt es, wenn du z.B. mal ein "join(objGroup.Members)" ausgibst? Ohne zu verstehen, wieso du das fragst, habe ich es einfach mal ausprobiert: "error nr. 13, Type mismatch" Ich werde jetzt mal ADInsight ausprobieren. Mal sehen, das Tool klingt jedenfalls nicht schlecht. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.