That's an excellent question, Dave.
 
The reason I want to use Delphi is that I already use it to perform a great 
number of admin tasks here at the company.
 
I regularly provide reports (data gathered and compiled using a Delphi app) for 
statistics like days-since-reboot, OU name, hardware models, free disk space, 
etc.
 
In this particular case, we have a 120 day threshold for which, if machines 
have not logged in to the domain, we move them to an OU from which the accounts 
will be deleted.
 
I plan to use Delphi to track communications/warnings sent to the user, etc. so 
I can know when it's safe (and I'm officially allowed) to delete machines from 
the domain or at least move the accounts to diferent OUs.
 
That's why I want to move them in Delphi.
 
I already GET OU information by using the code below (posted in case anyone 
else needs to get AD info usign Delphi).
 
By the way, if you're trying to access AD information using ADO, you HAVE to 
use the TADODataSet.
 
That's the only way to get past the 1000 record limit of ODBC's AD connection 
(by passing the Page Size property, which you can't do using a TADOTable or 
TADOQuery).
 
      ADODataSet := TADODataSet.Create(nil);      ADOCommand := 
TADOCommand.Create(nil);      ADOCommand.Connection := ADOConnection3;      
ADOCommand.CommandText := 'SELECT CN,ADsPath from ' + 
QuotedStr('LDAP://DC=NA,DC=XXX,DC=Int') + ' WHERE objectClass = ' + 
QuotedStr('computer') + ' ORDER BY CN';      ADOCommand.Properties.Item['Page 
Size'].Value := 10;      ADODataSet.Recordset := ADOCommand.Execute;      
ADODataSet.First;
      while NOT ADODataSet.Eof do        begin
          Application.ProcessMessages;          If StopFlag          then Break;
          //Update status bar          Application.ProcessMessages;          
ProgressBar1.Position := Trunc(ADODataSet.RecNo / ADODataSet.RecordCount * 
100);          StatusBar1.Update;
          ComputerName := ADODataSet.FieldByName('CN').AsString;          
DataSource := 'A';          UserName := '';          ScanDate := '';          
LocationName := '';          TimeZone := '';          LastBootDate := '';       
   DeviceDescription := '';          VendorName := '';          VendorModel := 
'';          VendorSerial := '';          AssetTag := '';          ImageVersion 
:= '';          ADsPath := ADODataSet.FieldByName('AdsPath').AsString;          
OU := SimplifyOUName(ADsPath);          OperatingSystem := '';          
Processor := '';          RamSize := '';          HardDriveSize := '';          
DriveSpaceFree := '';          NetworkAdapter := '';          MacAddress := ''; 
         IPAddress := '';          SubnetMask := '';          VideoAdapter := 
'';          OpticalDrive := '';          PointingDevice := '';          
SoundDevice := '';          Modem := '';          Monitor := '';          
Keyboard := '';          BiosVersion := '';
          Application.ProcessMessages;
          if Pos('accounts - computers',LowerCase(OU)) > 0          then 
UpdateDataSource(ComputerName,                       DataSource,                
       UserName,                       ScanDate,                       
LocationName,                       TimeZone,                       
LastBootDate,                       DeviceDescription,                       
VendorName,                       VendorModel,                       
VendorSerial,                       AssetTag,                       
ImageVersion,                       OU,                       OperatingSystem,  
                     Processor,                       RamSize,                  
     HardDriveSize,                       DriveSpaceFree,                       
NetworkAdapter,                       MacAddress,                       
IPAddress,                       SubnetMask,                       
VideoAdapter,                       OpticalDrive,                       
PointingDevice,                       SoundDevice,                       Modem, 
                      Monitor,                       Keyboard,                  
     BiosVersion,                       ADsPath);
          ADODataSet.Next;      end;
      if Assigned(ADOCommand) then FreeAndnIl(ADOCommand);      if 
Assigned(ADODataSet) then FreeAndnil(ADODataSet);XFX nForce 680i LT SLI Socket 
775 | Intel Core 2 Duo E6750 OC:1600 FSB @ 3.2 MHz | 2 x OCZ SLI 1024MB PC6400 
DDR2 800MHz| XION 600w PSU | CM Stacker 200 ATX/BTX Case | EVGA GeForce 8800 
GTS 512 | WD SATA 74 GB Raptor (boot,system), WD SATA 500 GB (storage) | 
Windows XP Pro, SP2 | Patient and supportive significant other


To: [EMAIL PROTECTED]: [EMAIL PROTECTED]: Fri, 11 Apr 2008 08:18:54 
-0700Subject: Re: [advanced_delphi] Moving machine accounts in Active Directory




   I'm just curious: Why wouldn't you use the supplied Microsoft tools for 
accomplishing this? That sounds like an unbelievably trivial operation to 
accomplish  using NWAdmin in Novell's NDS.   Search for some components that 
encapsulate the API, or I think JEDI has a unit that encapsulates that 
functionality.     I found Colin Wilson's units for Active Directory in the few 
minutes I spent searching. JEDI is rather poorly documented 
(still!):http://www.wilsonc.demon.co.uk/delphi.htmDaveSean Roberts <[EMAIL 
PROTECTED]> wrote: 


Greetings to all!I've been working with Delphi for quite a while, but I've 
never had to use it to access Active Directory.Part of my job as a Desktop 
Administrator is to move machine accounts around in our AD OU structure.Does 
anyone have code for how to move a machine account from one OU to another?If 
someone can point me in the right direction, I would be very 
appreciative.Thanks in advance,- Sean [EMAIL PROTECTED]
__________________________________________________Do You Yahoo!?Tired of spam? 
Yahoo! Mail has the best spam protection around http://mail.yahoo.com  






_________________________________________________________________
Get in touch in an instant. Get Windows Live Messenger now.
http://www.windowslive.com/messenger/overview.html?ocid=TXT_TAGLM_WL_Refresh_getintouch_042008

Reply via email to