Announcement

Collapse
No announcement yet.

ADO und Active Directory

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ADO und Active Directory

    Hallo,<BR>
    ich lese mit ADO (TADOConnection+TADODataSet) Active Directory Daten.
    Hierzu verwende ich folgende Abfrage:<BR>
    SELECT AdsPath, Name FROM 'LDAP://OU=E050,DC=EMEA,DC=CORPDIR,DC=NET'
    WHERE objectClass='organizationalUnit' ORDER BY Name

    Dies funktioniert auch prima ! Jedoch bekomme ich immer auch alle Ebenen<BR> (unterhalb des Startpunkts) angezeigt. Ich möchte jedoch nur eine Ebene.<BR>
    Hierzu habe ich auch schon den Befehl:
    command.Properties("searchscope") = <B>ADS_SCOPE_ONELEVEL</B>
    gefunden ! <BR> Nur leider fängt er nichts mit dem Begriff <searchscope> an !?<BR>
    Denn Umgang mit Properties hat H. Kosch ja schon mehrfach demonstriert<BR>
    (zB.:Properties['Data Source'].Value := OpenDialogMDB.FileName;...)<BR>

    Analog hierzu wollte ich Properties['searchscope'].Value := ADS_SCOPE_ONELEVEL; setzen. Leider funktioniert dies nicht.
    Aber wie komme ich zu ADS_SCOPE_ONELEVEL ??????

  • #2
    Hallo,

    bei derartigen Problemen ist es immer eine gute Idee, die Sache zuerst nur mit den nativen ADO-Objekten (Connection und Command) zu implementieren. Ein Beispiel für das Zuweisen von ADS_SCOPE_ONELEVEL ist in der Hilfeseite des Platform SDK "<i>Searching with ActiveX Data Objects (ADO)</i>" zu finden

    Comment


    • #3
      Die Quelle habe ich gefunden...<BR>
      Dim X as IADs<BR>
      Dim con As New Connection, rs As New Recordset<BR>
      Dim MyUser As IADsUser<BR>

      con.Provider = "ADsDSOObject"<BR>
      con.Open "Active Directory <BR> Provider", "CN=Foobar,CN=Users,DC=ARCADIABAY,DC=COM,O=INTERNE T", "Password"<BR>
      Set rs = con.Execute("<LDAP://MyMachine/DC=MyDomain,DC=ArcadiaBay,DC=com>;(objectClass=Use r);ADsPath;onelevel")<BR>

      While Not rs.EOF<BR>
      ' Bind to the object to make changes<BR>
      ' to it since ADO is currently read-only<BR>
      MyUser = GetObject(rs.Fields(0).Value)<BR>
      MyUser.AccountDisabled = True<BR>
      rs.MoveNext<BR>
      Wend<BR>

      Leider komme ich nicht mal über das Open hinweg (native ist halt nicht so einfach...ausser man heisst Kosch...)<BR>
      Bei Verwendung einer ADOConnection-Komponente funktioniert der Eintrag (ConnectionString):<BR> Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648<BR>

      TADODataSet.Commandtext lautet :<BR>
      SELECT AdsPath, Name FROM 'LDAP://OU=E050,DC=EMEA,DC=CORPDIR,DC=NET'
      WHERE objectClass='organizationalUnit' ORDER BY Name<BR>
      <BR>
      Nur bekomme ich hier nicht den Eintrag "onelevel" hin !!<BR>
      Kann mir hier jemand weiterhelfen ??<BR>

      Comment


      • #4
        Hallo,

        bei mir arbeitet die von Microsoft dokumentierte Eigenschaft <b>searchscope</b> so wie erwartet - allerdings muss man von Hand einen Delphi-Bug fixen, der beim Import der ADO-Typbibliothek für Ärger sorgt. Aus diesem Grund geht der Aufruf über ADO Express (dbGo) auch in die Irre.
        <pre>
        uses ComObj, ADOInt, ActiveDs_TLB;

        procedure TForm1.Button1Click(Sender: TObject);
        var
        aCon : _Connection;
        aCommand : _Command;
        aRS : _RecordSet;
        vRows : OleVariant;
        begin
        aCon := CoConnection.Create;
        aCon.Provider := 'ADsDSOObject';
        OleVariant(aCon).Open;
        aCommand := CoCommand.Create;
        aCommand.Set_ActiveConnection(aCon);
        aCommand.CommandText :='SELECT AdsPath,Name FROM ''LDAP://DC=OssiSoft,DC=local''' ;
        // Delphi-Bug korrigieren
        OleVariant(aCommand).Properties['searchscope'] := ADS_SCOPE_ONELEVEL;
        aRS := aCommand.Execute(vRows, EmptyParam, 0);
        ADODataSet1.Recordset := aRS;
        DataSource1.DataSet := ADODataSet1;
        DBGrid1.DataSource := DataSource1;
        ShowMessage('Fertig');
        end;
        </pre>
        Über die harte Typumwandlung via OleVariant tausche ich den Interface-Zeiger für das Dual Interface gegenn einen Interface-Zeiger für IDispatch aus - so dass ich den Wert in die Eigenschaft schreiben kann. Wenn ich mir über die nativen ADO-Objekte das gefüllte Recordset-Objekt besorgt habe, hänge ich es an eine TADODataSet (die im Objektinspektor <b>nicht</b> konfiguriert wird). Wenn TADODataSet die Daten so untergeschoben bekommt, kann ich via TDataSource das TDBGrid wie gehabt verwenden. ADO Express ist hier nur für die Darstellung zuständig - die Daten sammeln die nativen ADO-Objekte ein

        Comment


        • #5
          Vielen Dank!
          Super Tricki, aber gut...

          PS: Ich vermisse hier im Forum etwas das Thema ADSI bzw ADO in Richtung Active Directory !? Leider gibt es gerade zu ADSI keine vernünftige Komponenten bzw. Doku (Delphi-Code). Es ist immer sehr mühsam einen VBS-Dreizeiler in Delphi abzubilden (Wobei mein Fundus hier auch von Tag zu Tag wächst). Wäre das nicht mal ein interessantes Thema für ein Buch...

          Comment


          • #6
            Hallo,

            &gt;Wäre das nicht mal ein interessantes Thema für ein Buch....

            die Anzahl der interessanten Themen ist weit höher als die Anzahl der verfügbaren Zeiteinheiten :-)

            Beim Thema ADSI decken 2 meiner Bücher die Grundlagen ab: <br>
            a) <i>COM/DCOM/COM+ mit Delphi</i> kümmert sich um COM-Grundlagen und stellt einige ADSI-Beispiele vor<br>
            b) <i>ADO und Delphi</i> geht u.a. auch auf die nativen ADO-Objekte ein<br>

            Demnächst entschärft sich das Dokumentations-Problem, denn mit <i>Delphi for .NET</i> passen die Microsoft-Beispiele 1:1, so dass man zu einem beliebigen .NET-Buch zu diesem Thema greifen kann (unabhängig von der Sprache). Und auch im Fall eines Delphi-Bugs kann man die entsprechende Stelle ersatzweise in VB.NET oder C# schreiben (ein .NET-Programm darf als Mix in mehreren Sprachen geschrieben werden)

            Comment


            • #7
              Danke für den Buchhinweis...
              COM/DCOM/COM+, ADO und Delphi,Win32 stehen schon lange im Regal
              Delphi for .NET ist bestellt :-)

              Comment

              Working...
              X