Announcement

Collapse
No announcement yet.

ADSI mit Delphi

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

  • ADSI mit Delphi

    Ich möchte mit Delphi ein Programm zur Verwaltung einer NT-Domäne schreiben und mittels ADSI auf Benutzer, Gruppen ... zugreifen.

    Mit VBScript kann mann z.B. über
    (GetObject("WinNT://" & DomainString & "/" & GroupString)
    auf WinNT Gruppen zugreifen.

    Wer kann mir helfen?

  • #2
    Hallo,

    das folgende Beispiel demonstriert den Aufruf:

    <pre>
    var
    aDomain : IAdsContainer;
    aUsers : IEnumVariant;
    aUser : IADsUser;
    V : OleVariant;
    w : DWord;
    VA : Variant;
    begin
    // Interface für die Domäne anfordern
    aDomain := GetObject('WinNT://' + DomainName) as IAdsContainer;
    VA := VarArrayCreate([ 0, 0 ], varVariant);
    VA[0] := 'user'
    aDomain.Filter := VA;
    aUsers := (aDomain._NewEnum) as IEnumVariant;
    while aUsers.Next(1, V, w) = S_OK do
    begin
    aUser := IDispatch(V) as IAdsUser;
    ShowMessage(aUser.Name)
    end;
    end;
    </pre&gt

    Comment


    • #3
      Vielen Dank an Andreas Kosch für das Beispiel.
      Leider fehlt mir jetzt noch die Unit in der die Variablen und Typen (z.B. IAdsContainer, IADsUser) deklariert sind.
      Wo kann ich diese Unit finden

      Comment


      • #4
        Hallo,

        dazu muss nur die Typbibliothek von ADSI in Delphi importiert werden - Delphi legt die Unit xxxTLB.pas dann automatisch an

        Comment


        • #5
          Hallo Andreas Kosch.

          Das importieren der Typbibliothek von ADSI in Delphi und das Anlegen der Unit ActiveDs_TLB.pas hat gut funktioniert.

          Beim Kompilieren des Beispiels bekomme ich in der Zeile
          " aDomain := GetObject('WinNT://' + DomainName) as IAdsContainer; "
          die Fehlermeldung Inkompatible Typen: 'HGDIOBJ' und 'String'.

          Bei der Hilfe von Delphi 5 zu GetObject geht es um Grafiken.

          Wie muss ich die Funktion GetObject aufrufen

          Comment


          • #6
            Hallo,

            um sicherzugehen, das keine sonstigen Fehlerquellen in die Quere kommen, sollte das folgende Minimal-Beispiel ausprobiert werden. Dieses Beispiel meldet sich mit dem Benutzernamen/Passwort an und liefert den Rechnernamen zurück:
            <pre>
            uses ActiveDs_TLB, ActiveX, ComObj;

            function GetObject(const Name : String): IDispatch;
            var
            Moniker : IMoniker;
            Eaten : Integer;
            BindContext : IBindCtx;
            Dispatch : IDispatch;
            begin
            OleCheck(CreateBindCtx(0, BindContext));
            OleCheck(MkParseDisplayName(BindContext, PWideChar(WideString(Name)), Eaten, Moniker));
            OleCheck(Moniker.BindToObject(BindContext, NIL, IDispatch, Dispatch));
            Result := Dispatch;
            end;
            //
            //
            //
            procedure TForm1.Button2Click(Sender: TObject);
            var
            aADsODSObj : IADsOpenDSObject;
            sADSPath : String;
            aDsp : OleVariant;
            begin
            aADsODSObj := GetObject('WinNT:') as IADsOpenDSObject;
            sADSPath := 'WinNT://' + EditDomain.Text + '/' + EditPC.Text;
            Memo1.Lines.Add(sADSPath);
            Memo1.Lines.Add('---');
            aDsp := aADsODSObj.OpenDSObject(sADSPath,
            EditUser.Text,
            EditPasswd.Text,
            ADS_SECURE_AUTHENTICATION);
            Memo1.Lines.Add('OpenDSObject war erfolgreich');
            Memo1.lines.Add(aDsp.Name);
            end;
            </pre>

            Im Beispiel erhalte ich die folgenden Zeilen im Memo:

            <i>
            WinNT://OssiSoft/W2KP5-133<br>
            ---<br>
            OpenDSObject war erfolgreich<br>
            W2KP5-133
            </i&gt

            Comment


            • #7
              Jetzt funktioniert es.

              Hallo Andreas Kosch.

              Vielen Dank für deine Hilfe.
              Das Beispiel hat mir weitergeholfen, vor allem die Funktion GetObject war sehr wichtig

              Comment


              • #8
                will man auf die Felder aUser.Department bzw. TelephoneNumber, EMailAddres etc. zugreifen bekommt man einen Fehler.

                Was kann man da tun

                Comment


                • #9
                  Hallo!

                  Ich habe ein bischen mit dieser ActiveDs_TLB Komponente rumgespielt und bin auf folgendes Problem gestossen:

                  Memo1.lines.Add(aDsp.Name); funktioniert und es wird richtig ausgelesen.

                  aber in der Komponete gibt es Elemente Wie z.B Memo1.lines.Add(aDsp.mailadress); und diese werden nicht ausgelesen.

                  Woran kann das liegen? Und wie kann ich die Komponente anpassen das alle Elemente die die Komponente bietet auch funktionieren?

                  Wer kann mir helfen?

                  Arbeite mit delphi

                  Comment

                  Working...
                  X