Announcement

Collapse
No announcement yet.

ADSI, Benutzer, Gruppen, OUs anlegen

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

  • ADSI, Benutzer, Gruppen, OUs anlegen

    Hallo!

    Ich habe die ganze Zeit nur mit den Beispielien von Herrn Kosch rum gespielt. Aber sobald ich etwas ausprobiere, klappt nichts mehr.

    Auslesen des Active Directorys kann ich mittlerweile mit SQL Befehlen. Jeddoch weiss ich nciht wie ich OUs, Gruppen oder gar User anlege. Ich hab's schon mit INSERT Befehlen probiert, aber die gingen irgendwie nicht.

    Später kommt noch die Frage. Welcher User ist in welcher OU und in welcher Gruppe. Und welche Gruppe in welcher Gruppe und/oder OU.

    Ich bin verzweifelt. Ist das nciht alles irgendwo schonmal nieder geschrieben? In einer Entwickler Ausgabe evtl.?

    -John

  • #2
    Hallo,

    auf der DVD der <i>MSDN Library </i> ist die sehr umfangreiche Dokumentation im Zweig <b>Networking and Directory Services | Active Directory, ADSI and Directory Services</b> zu finden. Unter anderen taucht dort auch der Zweig <i>Technical Articles</i> auf, im dem das Papier <i>Using ADSI, LDAP, and Network Management Functions With Active Directory</i> Beispiele für die o.g. Aufgaben enthält.

    &gt;..In einer Entwickler Ausgabe evtl.? ...

    Das müsste dann schon eine sehr dicke Ausgabe sein, denn nur für dieses eine Thema würden einige Hundert Seiten benötigt, wenn man den Inhalt der MSDN-Dokumentation vollständig und in voller Funktionsbreite des Active Directory nochmals in Papierform unter die Entwickler bringen wollte :-

    Comment


    • #3
      Ok, danke. Ich werd mich in die MSDN einarbeiten. Jeddoch finde ich dort schliesslich nur Beispiele für VBS...

      Gehen Sie in Ihrem Buch "ADO und Delphi. Fachwissen für Programmierer." auch auf das ADSI ein?

      -Joh

      Comment


      • #4
        Hallo,

        das Buch hat nur 510 Seiten, sogar ADOX, JRO und RDS kommen dort zu kurz weg. Für ADSI war da kein Platz

        Comment


        • #5
          Heute hab ich viel gelernt. Ich weiss jetzt worauf ADSI aufsetzt. Wie man Benutzereigenschaften ändert etc.

          Leider habe ich Probleme beim anlegen von Benutzern. Ich erstelle zunächst einen Connect

          <pre>
          private
          { Private declarations }
          FADSCont : IADsContainer;
          .
          .
          .

          var
          swObj : WideString;
          begin
          swObj := EditObj.Text;
          OleCheck(ADsGetObject(PWideChar(swObj), IID_IADsContainer, FADSCont));
          </pre>

          Dann jeddoch beim Versuch einen Benutzer anzulegen...

          <pre>
          var
          aADSUser : IADsUser;
          begin
          aADSUser := FADSCont.Create('user', 'cn=test2') as IADsUser;
          //aADSUser.Set_Description(swDescription);
          //aADSUser.Description := 'blatest';
          aADSUser.SetInfo;
          </pre>

          stoppt der Code bei aADSUser.SetInfo und es kommt diese Meldung:
          "Es ist eine Beschränkungsverletzung aufgetreten"

          Ich habe jeddoch Adminrechte auf der Domäne.

          Was könnte es sein?

          -Joh

          Comment


          • #6
            Hallo,

            das folgende Beispiel demonstriert, wie neue Benutzer angelegt werden können. Die Methode <b>Create</b> des Interfaces IADsContainer erwartet als zweiten Parameter nur den neuen (eindeutigen) Benutzernamen:
            <pre>
            <font color="#003399"><i>{ ************************************************** *******************
            Autor : Andreas Kosch
            Compiler : Delphi 5 UpdatePack#1
            Betriebssystem : Windows 2000
            Datum : 11.08.2000
            Beschreibung : ADSI mit Delphi 5: Benutzer auslesen/anlegen
            ************************************************** ******************** }</i></font>

            <b>unit</b> ADSI_5Frm;

            <b>interface</b>

            <b>uses</b>
            Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
            StdCtrls, ComCtrls, ActiveDS_TLB;

            <b>type</b>
            TForm1 = <b>class</b>(TForm)
            StatusBar1: TStatusBar;
            GroupBox1: TGroupBox;
            EditObj: TEdit;
            ButtonConnect: TButton;
            GroupBox2: TGroupBox;
            ListBoxUser: TListBox;
            ButtonRefresh: TButton;
            ButtonAddUser: TButton;
            EditNewUser: TEdit;
            <b>procedure</b> ButtonConnectClick(Sender: TObject);
            <b>procedure</b> ButtonRefreshClick(Sender: TObject);
            <b>procedure</b> ButtonAddUserClick(Sender: TObject);
            <b>private</b>
            <font color="#003399"><i>{ Private-Deklarationen }</i></font>
            FADSCont : IADsContainer;
            <b>public</b>
            <font color="#003399"><i>{ Public-Deklarationen }</i></font>
            <b>end</b>;

            <b>var</b>
            Form1: TForm1;

            <b>implementation</b>

            <font color="#003399"><i>{$R *.DFM}</i></font>

            <b>uses</b> ComObj, ActiveX;

            <font color="#003399"><i>// ADSI-Hilfsfunktion als Ersatz für die VBScript-Funktion GetObject</i></font>
            <b>function</b> ADsGetObject(lpszPathName: PWideChar;
            <b>const</b> riid: TIID;
            out obj): HResult; <b>stdcall</b>; <b>external</b> <font color="#9933CC">'activeds.dll'</font>;

            <b>procedure</b> TForm1.ButtonConnectClick(Sender: TObject);
            <b>var</b>
            swObj : WideString;
            <b>begin</b>
            swObj := EditObj.Text;
            OleCheck(ADsGetObject(PWideChar(swObj), IID_IADsContainer, FADSCont));
            StatusBar1.SimpleText := <font color="#9933CC">'ADsGetObject war erfolgreich.'</font>;
            ButtonRefresh.Enabled := True;
            ButtonAddUser.Enabled := True;
            <b>end</b>;

            <b>procedure</b> TForm1.ButtonRefreshClick(Sender: TObject);
            <b>var</b>
            sUser : <b>String</b>;
            aEnum : IEnumVariant;
            vObj : OLEVariant;
            aADs : IAds;
            aADSUser : IADsUser;
            iCelt : LongWord;
            <b>begin</b>
            ListBoxUser.Items.Clear;
            aEnum := FADSCont._NewEnum <b>as</b> IEnumVariant;
            <b>while</b> (aEnum.Next(1, vObj, iCelt) = S_OK) <b>do</b>
            <b>begin</b>
            aADs := IUnknown(vObj) <b>as</b> IAds;
            <b>if</b> aADs.Class_ = <font color="#9933CC">'User'</font> <b>then</b>
            <b>begin</b>
            aADSUser := aADs <b>as</b> IAdsUser;
            sUser := Format(<font color="#9933CC">'%s (%s)'</font>, [aADSUser.Name + Chr(9),
            aADSUser.Description]);
            ListBoxUser.Items.Add(sUser);
            <b>end</b>;
            <b>end</b>;
            <b>end</b>;

            <b>procedure</b> TForm1.ButtonAddUserClick(Sender: TObject);
            <b>var</b>
            swNewUserName : WideString;
            swDescription : WideString;
            aADSUser : IADsUser;
            <b>begin</b>
            swNewUserName := EditNewUser.Text;
            swDescription := <font color="#9933CC">'Benutzer wurde von ADSI_5.EXE anlegt.'</font>;
            aADSUser := FADSCont.Create(<font color="#9933CC">'user'</font>, swNewUserName) <b>as</b> IADsUser;
            aADSUser.Set_Description(swDescription);
            aADSUser.SetInfo;
            ButtonRefreshClick(self);
            <b>end</b>;

            <b>end</b>.
            </pre>
            DFM:
            <pre>
            <b>object</b> Form1: TForm1
            Left = 192
            Top = 107
            Width = 623
            Height = 298
            Caption = <font color="#9933CC">'Delphi 5 und ADSI - Benutzer auslesen/anlegen'</font>
            Color = clBtnFace
            Font.Charset = DEFAULT_CHARSET
            Font.Color = clWindowText
            Font.Height = -11
            Font.Name = <font color="#9933CC">'MS Sans Serif'</font>
            Font.Style = []
            OldCreateOrder = False
            PixelsPerInch = 96
            TextHeight = 13
            <b>object</b> StatusBar1: TStatusBar
            Left = 0
            Top = 250
            Width = 613
            Height = 19
            Panels = &lt;&gt;
            SimplePanel = True
            <b>end</b>
            <b>object</b> GroupBox1: TGroupBox
            Left = 8
            Top = 8
            Width = 225
            Height = 57
            Caption = <font color="#9933CC">' Domäne '</font>
            TabOrder = 1
            <b>object</b> EditObj: TEdit
            Left = 16
            Top = 20
            Width = 121
            Height = 21
            TabOrder = 0
            Text = <font color="#9933CC">'WinNT://D7-700'</font>
            <b>end</b>
            <b>object</b> ButtonConnect: TButton
            Left = 142
            Top = 19
            Width = 75
            Height = 25
            Caption = <font color="#9933CC">'Connect'</font>
            TabOrder = 1
            OnClick = ButtonConnectClick
            <b>end</b>
            <b>end</b>
            <b>object</b> GroupBox2: TGroupBox
            Left = 8
            Top = 80
            Width = 601
            Height = 169
            Caption = <font color="#9933CC">' Benutzer '</font>
            TabOrder = 2
            <b>object</b> ListBoxUser: TListBox
            Left = 12
            Top = 17
            Width = 581
            Height = 105
            ItemHeight = 13
            TabOrder = 0
            TabWidth = 100
            <b>end</b>
            <b>object</b> ButtonRefresh: TButton
            Left = 16
            Top = 128
            Width = 75
            Height = 25
            Caption = <font color="#9933CC">'Refresh'</font>
            Enabled = False
            TabOrder = 1
            OnClick = ButtonRefreshClick
            <b>end</b>
            <b>object</b> ButtonAddUser: TButton
            Left = 520
            Top = 128
            Width = 75
            Height = 25
            Caption = <font color="#9933CC">'Add User'</font>
            Enabled = False
            TabOrder = 2
            OnClick = ButtonAddUserClick
            <b>end</b>
            <b>object</b> EditNewUser: TEdit
            Left = 392
            Top = 128
            Width = 121
            Height = 21
            TabOrder = 3
            Text = <font color="#9933CC">'NeuerBenutzer'</font>
            <b>end</b>
            <b>end</b>
            <b>end</b>
            </pre&gt

            Comment


            • #7
              Also nicht 'cn=NeuerBenutzer' sondern nur 'NeuerBenutzer'?

              Leider tritt dann die Fehlermeldung auf: "Der Server kann die Anforderung nicht ausführen".

              Ebenso, wenn ich versuche

              <pre>
              aADSUser.Set_Description(swDescription);
              </pre>

              zu setzten. Es kommt dann die Meldung das es diese Prozedur nicht gibt.

              Ich habe Delphi 6. Das Beispiel stammt ja anscheinend aus D5.

              Muss ich Benutzerangaben irgendwie übergeben damit ich ins ADS schreiben kann

              Comment


              • #8
                Nein, ich habe mich beim Set_Description geirrt. Es geht. Das andere Problem besteht weitrhin.

                Bleibt bei SetInfo stehen

                Comment


                • #9
                  Hat den keiner eine Ahnung

                  Comment


                  • #10
                    Ich habe das Problem selbst gelöst. Ich musste diese Prozeduren mit ausführen. Hier heisst das Benutzer Objekt usr, statt aADSUser

                    <pre>
                    usr.Put('sAMAccountName', 'test4');
                    usr.Put('userPrincipalName', '[email protected]');
                    usr.Put('title', 'Marketing Manager');
                    </pre>

                    Das steht in der MSDN.

                    "When creating a new user, you must specify a sAMAccountName. This is a mandatory attribute for the user class. Before an instance of an object can be created, all mandatory attributes must be set. The user sAMAccountName is used to log on from computers running versions of Windows earlier than Windows 2000. Computers running Windows 2000 continue to understand the sAMAccountName. Beginning with Windows Server 2003, the sAMAccountName will automatically be generated if one is not specified for a new user." [MSDN]

                    Das wird wohl auch der Grund sein das es im Beispiel von Herrn Kosch nicht vorkommt und bei mir nciht mehr funktioniert hat.

                    Jetzt geh ich erstmal einen trinken

                    Comment


                    • #11
                      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


                      • #12
                        Hast Du es mitleiweile geschafft?

                        Kannst Du mir evtl sogar ein kleines Beispielprogramm zukommen lassen? Ich hänge jetzt beim gleichem Thema...

                        Gruß

                        Thomas

                        .

                        Comment


                        • #13
                          Hi Thomas,<br>
                          lade Dir mal ADSI Sample von AGNISOFT.<br>
                          <a href="http://www.agnisoft.com/downloads/adsicode.zip" target=_NEW>Download Sample</a><br>Ansonsten gibt's bei AGNISOFT auch was zu lesen ;-)
                          <a href="http://www.agnisoft.com/white_papers/active_directory.asp" target=_NEW>AGNISOFT ADSI HELP</a><br>
                          Da sind einige Beispiele, mit denen ich auch angefangen habe auf diesem Gebiet zu lernen.<br>Ich habe nicht's mit AGNISOFT zu tun, ich finde nur deren Samples und Beschreibung sehr gut!<br>cu Michae

                          Comment


                          • #14
                            Hallo,

                            Mit aUser.Get('userflags') kann ich die Konstante der ADS_USER_FLAG aus der ActiveDS_TLB auslesen. Ich krieg es aber nicht hin noch andere Werte auszulesen, wie die ADS_RIGHT_... . Im MSDN verwendet man IADSSecurityDescriptor und IADSAccessControlEntry. In allen Delphi-Beispielen, die ich gefunden habe, wird aUser.Get('ntSecurityDescriptor') verwendet, dabei tritt aber jedes mal der Fehler "Die Verzeichniseigenschaften wurde nicht im Cache gefunden" auf, egal was ich damit mache.
                            Hat da jemand eine Idee, wie ich sonst den SecurityDescriptor auslesen kann?


                            Originally posted by MrXL View Post
                            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
                            Da tritt auch der Fehler "Die Verzeichniseigenschaften wurde nicht im Cache gefunden" auf. Beim googlen hab ich nur gefunden, dass man es mit on error resume bzw. try except lösen soll. Gibt es da keine andere Möglichen die Eigenschaften auszulesen oder abzufragen, ob sie leer sind?

                            Comment

                            Working...
                            X