Solved

Delete of AD account

Posted on 2010-09-08
15
855 Views
Last Modified: 2012-06-27
Could someone help me with a litle wierd problem.

I try to bind a ad account in line 16. If it succeed it should proceed to line 18, but no matter of what, if the ad account is available or not it proceed to line 18.

If it could bind the account it should proceed to line 18 and if it couldn't it should proceed to line 29, right.

I get an error:

First chance exception at $7C812AFB. Exception class EOleException with message 'There is no such object on the server'. Process Project1.exe (15856)

And then my application just close.
procedure TForm1.DeleteAccount;

var

  strlocation : string;

  User : IAdsUser;

  Container : IADsContainer;

begin

  if ADOQuery1.FieldByName('Employee').AsString <> 'NA' then

  begin

    if ADOQuery1.FieldByName('PreWindowsEmploy').AsString <> '' then

    begin

      if pos('S',ADOQuery1.FieldByName('PreWindowsEmploy').AsString) <> 0 then

        strlocation := ',OU=USERS,OU=ANOTHERSITE,OU=COUNTRY,OU=FIRMNAME,DC=AD,DC=FIRMNAME,DC=ORG';

      if pos('D',ADOQuery1.FieldByName('PreWindowsEmploy').AsString) <> 0 then

        strlocation := ',OU=USERS,OU=SITE,OU=COUNTRY,OU=FIRMNAME,DC=AD,DC=ALFALAVAL,DC=ORG';

      try

        if SUCCEEDED(ADsGetObject('LDAP://CN=' + ADOQuery1.FieldByName('Employee').AsString + strlocation,IADsUser, User)) then

        begin

          if User.AccountDisabled then

          begin

            try

              ADsGetObject('LDAP://OU=USERS,OU=SITE,OU=COUNTRY,OU=FIRMNAME

,DC=AD,DC=FIRMNAME,DC=ORG', IADsContainer, Container);

              Container.Delete('User','cn=' + ADOQuery1.FieldByName('Employee').AsString);

              Container._Release;

            except on E:Exception do

            end;

            User := nil;

          end;

        end;

      except on E:Exception do

      end;

    end

    else

      strlocation := ',OU=USERS,OU=SITE,OU=COUNTRY,OU=FIRMNAME,DC=AD,DC=FIRMNAME,DC=ORG';

  end;

end;

Open in new window

0
Comment
Question by:QC20N
  • 7
  • 5
  • 3
15 Comments
 
LVL 14

Expert Comment

by:systan
Comment Utility
Why are you deleting those accounts?  I doubt your trying something different.  Whats the name of your application?
0
 

Author Comment

by:QC20N
Comment Utility
Well, it is a part of a daily procedure I have in company when employee stops. Then I need to delete the account in our AD.
0
 
LVL 14

Expert Comment

by:systan
Comment Utility
Oh, can't you use the server applications to delete users from AD?   Why build one.
0
 
LVL 5

Expert Comment

by:briangochnauer
Comment Utility
Use an LDAP statement like ;

LDAP://domain/CN=...

replacing domain with your NT4 domain name aka. logon domain.
0
 

Author Comment

by:QC20N
Comment Utility
Just for the record. This procedure work IF the user exists.

What my problem is that if the user dosen't exists then my program crash and give me the error.

Systan:
There is no fun to do this manually. The deletingpart is just a small job I have to do when I employee stops in our company.
0
 
LVL 14

Expert Comment

by:systan
Comment Utility
Ok;
Did you manage to disable a user from this open post?
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_24713232.html

I don't know why you build tools like this, while you can use the AD application software, but for the record, I know you can do it.
0
 
LVL 5

Expert Comment

by:briangochnauer
Comment Utility
Put a try..except end; around it. or use AD Search Object
I use  Marc Scheuner's TADSISearch object in ADSISearch.pas
http://adsi.mvps.org/adsi/Delphi/index.html  

...
slTemp := ADSISearch1.GetFirstRow();
    if Assigned(slTemp) then //success
....
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

Author Comment

by:QC20N
Comment Utility
Guys:

My procedure works IF the user exists in AD, but if user dosen't exists my application crash.

Systan:
The link you have entered is a question I have created. And the question isen't about to disabled a user, but to disable a computer.

And yes, I know how to disable an account in AD.

Brianqochnauer:

Please, could you give a litle more details?
0
 
LVL 5

Expert Comment

by:briangochnauer
Comment Utility
It's simple; getting an EOLEException when trying to bind to a non-existent object is expected and accepted behavior.

Either trap the exception with a Try Except (I assume you know how to do this)
or make sure the object exists before trying to bind to it,
 by using an AD search for the object.

I use the search method, if found, bind to the object else ignore;
I use  Marc Scheuner's TADSISearch object in ADSISearch.pas
http://adsi.mvps.org/adsi/Delphi/index.html   ('download' link on the page)
 Download this library and study it.

 
0
 

Author Comment

by:QC20N
Comment Utility
But shouldn't the SUCCEEDED do the trick to handle if the user dosen't exists?
0
 
LVL 5

Expert Comment

by:briangochnauer
Comment Utility
No, it never gets to SUCCEEDED because the exception is thrown.
0
 
LVL 5

Expert Comment

by:briangochnauer
Comment Utility
It may work if you write it like this;
...
      try
        if OLECheck(ADsGetObject('LDAP://CN=' + ADOQuery1.FieldByName('Employee').AsString + strlocation,IADsUser, User)) then
        begin
          if User.AccountDisabled then
          begin
            try
              OleCheck(ADsGetObject('LDAP://OU=USERS,OU=SITE,OU=COUNTRY,OU=FIRMNAME
,DC=AD,DC=FIRMNAME,DC=ORG', IADsContainer, Container);
              Container.Delete('User','cn=' + ADOQuery1.FieldByName('Employee').AsString));
              Container._Release;
            except on E:Exception do
               begin
                   ShowMessage(e.message)
                end;

            end;
            User := nil;
          end;
        end;
                on E:Exception do
                begin
                  ShowMessage(e.message)
               end;

      end;
 
...
0
 

Author Comment

by:QC20N
Comment Utility
When I do want you wrote I get this:
[DCC Error] Unit1.pas(484): E2012 Type of expression must be BOOLEAN

in the:

if OLECheck(ADsGetObject('LDAP://CN=' + ADOQuery1.FieldByName('Employee').AsString + strlocation,IADsUser, User)) then

0
 
LVL 5

Expert Comment

by:briangochnauer
Comment Utility
Don't you think it would be a good learning experience to figure out that by yourself?
 Both OLECheck (borland) and ADsGetObject (microsoft) documented those calls well.
0
 
LVL 5

Accepted Solution

by:
briangochnauer earned 125 total points
Comment Utility
if OLECheck(ADsGetObject('LDAP://CN=' + ADOQuery1.FieldByName('Employee').AsString + strlocation,IADsUser, User)=S_OK) then
0

Featured Post

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now