Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi HomeDirectory mit IADsUser wird nicht verbunden (https://www.delphipraxis.net/142955-homedirectory-mit-iadsuser-wird-nicht-verbunden.html)

mikelpahl 6. Nov 2009 16:41


HomeDirectory mit IADsUser wird nicht verbunden
 
Hallo,

ich habe ein Programm zusammengebastelt um unsere Studierenden automatisiert im ActiveDirectory anzulegen.
Die User werden mittlerweile scheinbar gut angelegt incl. dem Homedirectory und die entsprechende Berechtigung.
Seit einigen Wochen mach ich damit rum, dass zwar alles gut aussieht aber das Homerdir nicht beim Anmelden am AD automatisch mit dem vorgegeben Laufwerksbuchstaben verbunden wird.
Geht mann mit der MMC in das user Objekt trägt den Pfad fürs Homedir aus, speichert und ändert den Pfad wieder auf den ursprünglichen Wert dann gehts.

Ich bin im Moment ratlos.

Vielleicht liegt es auch einfach daran, dass ich nicht die aktuelle ActiveDS_TLB verwende. Wo gib es die ?
Da ich die jwscl von Christian Wimmer verwendet habe sind ist die unit (hoffentlich) immer mit angegeben.
Delphi 2007 auf Client Vista an reine Windows Server 2008 ADS.



Gruss

Michael

Delphi-Quellcode:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, StdCtrls, Buttons, ActiveDs_TLB, oleauto,
  adshlp ,
  JwaWindows,
  JwsclSid,
  JwsclToken,
  JwsclAcl,
  JwsclDescriptor,
  JwsclSecureObjects,
  JwsclKnownSid, JwsclTypes,
  Grids, strutils, dateutils;

type
  TADsObject = class (TObject)
    FName,FDesc,FPath : string;
    constructor Create (AName,ADesc,Apath : string);
    end;

....

Const
  FDomain='dh-karlsruhe.de';
  HomeDirBase='\\dh-karlsruhe.de\homes\';

....

procedure TForm1.BtnADdirektClick(Sender: TObject);
var
  Context: string;
  root        : ActiveDs_TLB.IADs;
  DNSName, ap,
  ou1, ou2 : string;
  erg : boolean;
  User    : IDispatch;
  ADsCont : ActiveDs_TLB.IADsContainer;
  Grp     : ActiveDs_TLB.IAdsGroup;
  bind    : widestring;
  i, Anzahl       : integer;
  StudFullname, StudKontoName, StudFirstName,
  StudLastName, StudEmail, StudMatnr, StudHomedir: string;

begin
  erg:=true;
  Anzahl:=0;
  ou1:=trim(StringGrid1.Cells[7,1]);
  ou2:=trim(StringGrid1.Cells[8,1]);
  bind:='LDAP://'+FDomain;
  try
    adshlp.ADsGetObject(bind,IADs,root);
    Context:=root.Get('distinguishedName');
    DNSName:=ToPrincipal(Context);
  except
    on e: EOleException do
    begin
      ErrorDialog('Fehler "'+e.Message+'" bei Verbindung zu '+FDomain);
      erg:=false;
    end
    else
    begin
      ErrorDialog('Error connecting zu '+FDomain);
      erg:=false;
    end
  end; // try
  if erg then
  begin
   //    MessageDlg('Verbunden mit'+chr(13)+'DNSName: '+dnsName+chr(13)+
  //             'Context: '+Context, mtInformation,[mbOK],0);
    form1.caption:='UserNeu '+Version+' Verbunden mit: '+DNSName;
    for i := 1 to StringGrid1.RowCount-1  do
    begin
      StudMatnr:=trim(StringGrid1.Cells[0,i]);
      StudEmail:=trim(StringGrid1.Cells[2,i]);
      StudFirstName:=trim(StringGrid1.Cells[3,i]);
      StudLastName:=trim(StringGrid1.Cells[4,i]);
      StudKontoName:=trim(StringGrid1.Cells[5,i]);
      StudHomedir:=trim(StringGrid1.Cells[6,i]);
      StudFullname:=StudFirstName+' '+StudLastName;

      begin // schon vorhanden ??
        ap:=SearchUser (StudKontoName);
        if length(ap)>0 then
        begin
          adshlp.ADsGetObject(ap,IID_IADsUser,user);
          (user as IADsUser).GetInfo;
          ErrorDialog('"'+(user as IADsUser).FullName+'" gibt es bereits'+sLineBreak+
                      (user as IADsUser).ADsPath+sLineBreak+
                       StudKontoName+'@'+FDomain);

          erg:=false;
          StudKontoName:=StudKontoName+'1';
        end
      end;

      if erg and (MessageDlg(StudKontoName+' anlegen',mtConfirmation,[mbYes,mbNo],0)=mrYes) then
      begin
        bind:='LDAP://ou='+ou2+',ou='+ou1+',ou=Studenten,'+Context;
        adshlp.ADsGetObject(bind,ActiveDs_TLB.IADsContainer,ADsCont);
        User:=ADsCont.Create('user','CN='+ReplaceSpecChar(StudFullname));
        (User as ActiveDs_TLB.IADsUser).Put('sAMAccountName',StudKontoName);
        (User as ActiveDs_TLB.IADsUser).FullName:=ReplaceSpecChar(StudFullname);
        if length(StudFirstName)>0 then
          (User as ActiveDs_TLB.IADsUser).FirstName:=StudFirstName;
        (User as ActiveDs_TLB.IADsUser).LastName:=StudLastName;
        (User as ActiveDs_TLB.IADsUser).HomeDirectory:=StudHomedir;
        (User as ActiveDs_TLB.IADsUser).Put('homeDrive','H');
        (User as ActiveDs_TLB.IADsUser).Profile:=StudHomedir+'\profil';
        (User as ActiveDs_TLB.IADsUser).Put('userPrincipalName',StudKontoName+'@'+DNSName);
        try
          (User as ActiveDs_TLB.IADsUser).SetInfo;      // Speichern
        except
          on e: EOleException do
          begin
            ErrorDialog('Fehler "'+e.Message+'" bei Speichern der Accounts '+StudKontoName);
            erg:=false;
          end
          else
          begin
            ErrorDialog('Fehler bei Speichern der Accounts '+StudKontoName);
            erg:=false;
          end
        end; // try
      // additional attributes
        if erg then
        begin
          try
            (User as ActiveDs_TLB.IADsUser).SetPassword(StudMatnr);
          except
            on e: EOleException do
            begin
              ErrorDialog('Fehler "'+e.Message+'" bei Setzen des Passworts'+StudKontoName);
              erg:=false;
            end
            else
            begin
              ErrorDialog('Fehler bei Speichern der Accounts'+StudKontoName);
              erg:=false;
            end
          end;
        end;
        if erg then
        begin
          try
            if StudEmail<>'' then
              (User as ActiveDs_TLB.IADsUser).EmailAddress:=StudEmail;
            (User as ActiveDs_TLB.IADsUser).AccountDisabled:=false;
            (User as ActiveDs_TLB.IADsUser).Put('pwdLastSet',0);
            (User as ActiveDs_TLB.IADsUser).SetInfo;      // Speichern
          except
            on e: EOleException do
            begin
              ErrorDialog('Fehler "'+e.Message+'" bei Speichern zusätzlicher Infos für den Account '+StudKontoName);
              erg:=false;
            end
            else
            begin
              ErrorDialog('Fehler bei Speichern usätzlicher Infos für Accounts'+StudKontoName);
              erg:=false;
            end
          end; // try
        end;
        if erg then     // Arbeitsgruppen zuordnen
        begin
          bind:=(User as ActiveDs_TLB.IADsUser).ADsPath;
          try
            adshlp.AdsGetObject('LDAP://cn='+kurs+',ou=Gruppen,'+Context, IADsGroup, grp);
            grp.Add ((user as ActiveDs_TLB.IAdsUser).ADsPath);
          except
            on e: EOleException do
            begin
              ErrorDialog('Fehler "'+e.Message+'" Lesen der Gruppe '+Kurs);
              erg:=false;
            end
            else
            begin
              ErrorDialog('Fehler bei Lesen der Gruppe '+Kurs);
              erg:=false;
            end
          end; // try
          grp := nil;
        end;
        if erg then     // Homedir anlegen
        begin
          erg:=createdir(StudHomedir);
          if not erg then
            ErrorDialog('Fehler beim Anlegen des Verzeichnisses "'+StudHomedir+'"');
        end;
        if erg then     // Homedir anlegen
          erg:=SetDACL_Dir(StudHomedir,StudKontoName,FDomain);
        if erg then // Erfolg
        begin
          MessageDlg('Student '+StudKontoName+' wurde angelegt',mtInformation,[mbOK],0);
          inc(Anzahl);
          lblads.Caption:=inttostr(Anzahl);
        end;
        user:=nil;
      end;
    end; // for
  end;
  ADsCont:=nil;
end;

Alter Mann 6. Nov 2009 17:07

Re: HomeDirectory mit IADsUser wird nicht verbunden
 
Hi,

bin 'leider' zu Hause und auf meinem Win 7 noch kein VMWare laufen, daher auch kein Zugriff auf eine ADS.

Lege zu erst die Verzeichnisse an und weise sie anschließend dem User zu.

Gruß

Alter Mann

mikelpahl 6. Nov 2009 17:43

Re: HomeDirectory mit IADsUser wird nicht verbunden
 
Hallo,

Verzeichnis wird jetzt als erstes angelegt.
Hilft leider nix.
Die Berechtigung kann ich ja erst setzen wenn der user existiert.

Noch ein Hinweis: Das Home wird über ein DFS-Stamm angesprochen. Habe es aber schon ohne probiert.

Bemerkenswert finde ich, dass das beim Profilpfad klappt. Die Profile werden beim Abmelden unter dem Home in ./profil auf dem Server gespeichert

Gruss

Michael

Alter Mann 6. Nov 2009 19:25

Re: HomeDirectory mit IADsUser wird nicht verbunden
 
Hallo


Zitat:

Die Berechtigung kann ich ja erst setzen wenn der user existiert.

Sicherlich bekommst du Probleme wenn du Verzeichnisse erstellst und nicht exestierende
Benutzer oder Benutzer mit deaktivierten Konto auf dieses Verzeichnis berechtigen willst.

Aber was hindert dich daran den Benutzer mit einem 'internen' Passowrd zuversehen,
die Verzeichnisse anzulegen und im Anschluss das Password neu zu setzen?

Und mit DFS hat das ganze nichts zu tun, da DFS vollkommen Transparent ist.

Allerdings gibt es da womöglich Einschränkungen bzgl. W2K8, aber soweit bin ich 'fauler' Mensch
noch nicht in eingestiegen, da W2K8 keine Option war; Erst 'W2K8 R2' (Die Zeit fehlt).

Hast Du dir schon Alternativen angesehen(C#, VB, C++ in VS2K8)?
Ist in Bezug auf ADS irre Einfach und es gibt div. gute Beispiele auf CodeProject.

Viele Grüße

Alter Mann

Remko 6. Nov 2009 20:23

Re: HomeDirectory mit IADsUser wird nicht verbunden
 
I think you should specify the homedrive with a double colon, eg H:
When creating a user programmatically I advise to create the home- and user directories directly afterwards and set the correct NTFS permissions. Be sure to use the SID and not the username for settings the permissions because the Fileserver might not know the user yet because changes are not yet replicated.
Also when creating a user make sure you bind to a specific domain controller (eg the one with the PDC emulator role) and perform all operations on the same dc to avoid similar replication issues.

mikelpahl 9. Nov 2009 15:43

Jetzt gehts
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

es war der Doppelpunkt !!

kaum ist die Zeile korriegiert:
Delphi-Quellcode:
(User as ActiveDs_TLB.IADsUser).Put('homeDrive','H:');

Danke an alle die mitgesucht haben.
Im Anhang das ganze Projekt.

Bleibt noch die Frage wo es die aktuelle ActiveDS_TLB gibt ?


Gruss

Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz