AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi HomeDirectory mit IADsUser wird nicht verbunden
Thema durchsuchen
Ansicht
Themen-Optionen

HomeDirectory mit IADsUser wird nicht verbunden

Ein Thema von mikelpahl · begonnen am 6. Nov 2009 · letzter Beitrag vom 9. Nov 2009
Antwort Antwort
mikelpahl

Registriert seit: 28. Jun 2004
Ort: Karlsruhe
12 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

HomeDirectory mit IADsUser wird nicht verbunden

  Alt 6. Nov 2009, 16:41
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;
Michael Pahl
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: HomeDirectory mit IADsUser wird nicht verbunden

  Alt 6. Nov 2009, 17:07
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
  Mit Zitat antworten Zitat
mikelpahl

Registriert seit: 28. Jun 2004
Ort: Karlsruhe
12 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: HomeDirectory mit IADsUser wird nicht verbunden

  Alt 6. Nov 2009, 17:43
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
Michael Pahl
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: HomeDirectory mit IADsUser wird nicht verbunden

  Alt 6. Nov 2009, 19:25
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
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#5

Re: HomeDirectory mit IADsUser wird nicht verbunden

  Alt 6. Nov 2009, 20:23
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.
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
mikelpahl

Registriert seit: 28. Jun 2004
Ort: Karlsruhe
12 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Jetzt gehts

  Alt 9. Nov 2009, 15:43
Hallo,

es war der Doppelpunkt !!

kaum ist die Zeile korriegiert:
(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
Angehängte Dateien
Dateityp: zip user_ad_116.zip (2,78 MB, 21x aufgerufen)
Michael Pahl
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz