Mr. Script
Tap the LDAP Provider to Plumb Active Directory
This month, Chris takes a final dive into the depths of ADSI and shows
how it works with LDAP to make Active Directory information easily accessible.
- By Chris Brooke
- 03/01/2001
Whenever possible, I like to SCUBA dive. I particularly like to go to
the Caribbean during winter — there’s nothing quite like coming home to
freezing temperatures with a sunburn and mosquito bites. On a recent excursion
to the Bahamas, my dive buddy had a bit of difficulty downloading the
dives from his dive computer to his Windows dive log software. It seemed
that the new version of the software didn’t like communicating directly
with his computer’s serial port. It wanted another piece of hardware called
a “memo mouse.” Dives can then be transferred from the memo mouse to the
dive log.
In true geek fashion, this got me thinking about my series on ADSI and
how it solved a similar problem that had heretofore plagued NT administrators:
NT always needed a “go-between” for scripting many of its administrative
tasks, and this could be a real pain in the neck! Thanks to ADSI, this
is no longer the case.
To finish up our series on ADSI (for now), we’re going to look at the
LDAP provider and some of the functionality it provides.
Anybody Got a Light?
Rather than monopolize my limited space explaining all the ins and outs
of LDAP and Active Directory (which are better explained in countless
articles in previous issues of this fine publication. See “Additional
Information.”), I thought I’d provide a brief overview and then “dive”
right into explaining how we use LDAP to access information in our ADs
— explaining the sticky points along the way.
LDAP stands for Lightweight Directory Access Protocol and it’s an industry
standard for storing user, organization and application information. This
information can then be accessed via any LDAP-enabled client.
Now, LDAP is not ADSI. It’s simply the protocol used to access AD and
query and modify its contents. Using ADSI and the LDAP provider, we can
access Microsoft Exchange information for creating mailboxes and managing
distribution lists, use ActiveX Data Objects (ADO) to query the LDAP directory,
and much more. In fact, the list is nearly endless. But because we don’t
have that kind of time, let’s start with a bit of user management.
Thank Goodness for Small Favors
The good news is that once you’ve bound to AD using the LDAP provider,
the procedures for adding, removing and modifying users and groups are
similar to the methods previously discussed using the WinNT provider.
'AddADSIUser.vbs
Dim objContainer, clsUser
Set objContainer=GetObject("LDAP://MyDomain.com")
Set clsUser=objContainer.Create("user","CN=chrisb")
clsUser.Put "samAccountName","chrisb"
clsUser.SetInfo
clsUser.AccountDisabled=False
clsUser.SetInfo
Looks familiar, doesn’t it? However, there are a few differences that
bear explaining. First, you’ll notice that I bound to a domain rather
than a specific Domain Controller. Remember that with AD, there are no
PDCs and BDCs — only DCs. If you try to bind to a particular computer
and it happens to be off line, the bind operation will fail and your script
will abort. If you perform a “serverless” binding to a domain, you’ll
always succeed as long as at least one Domain Controller is on line (and
if you don’t have at least one Domain Controller on line, you don’t really
have a domain, do you?). Another issue worth noting is that we wouldn’t
usually add a user to the “root” of a domain. Rather, we’d put him in
an OU (Organizational Unit) — more on this below. You’ll also note that
in line 5 of the script, I created an entry for “samAccountName.” This
allows the user to be “seen” by down-level NT domains. Finally, we “activate”
the account by telling AD that the account is not disabled (kind of backward,
isn’t it?). The first “SetInfo” method creates the account. The second
one “enables” it. Both are required.
We can also bind to a particular user and manipulate any or all of its
properties.
'SetADSIUserProps.vbs
Dim objUser
Set objUser=
GetObject("LDAP://CN=chrisb,DC=MyDomain,DC=com")
objUser.FullName="Chris Brooke"
objUser.AccountDisabled=True
Wscript.Echo objUser.LastLogin
etc.
Now, this part should look really familiar! Once ADSI has bound to an
object, manipulating it is (usually) simple. There are some properties
that are unique to NT domains that the LDAP provider can’t “see,” but
— for the most part — the scripts I wrote when I discussed the WinNT provider
can be substituted here, with only the GetObject operation being different.
I Add ’em, You Delete ’em
Let’s assume we’ve got another “chrisb” in the domain, and he’s a real
troublemaker. We want to go ahead and delete this guy. Since AD is hierarchical
in nature, let’s make sure we’re deleting the right “chrisb” by including
his OU.
'KillTheUser.vbs
Dim objContainer
Set objContainer=
GetObject(
"LDAP://OU=troublemakers,DC=MyDomain,DC=com")
objContainer.Delete "user","CN=chrisb"
Simple, yet effective. But what if you need to delete an entire “branch”
of your AD “tree”? Why would you need to do this? Well, maybe when you
built the domain schema, you expected to have a sales department in both
the Atlanta and Oklahoma City offices. Before you could even start hiring
for these positions, management came down and declared that all sales
would be handled out of Oklahoma City. Good housekeeping requires that
we remove the Atlanta “sales” OU.
'KillAtlantaSales.vbs
Dim objContainer
Set objContainer=
GetObject(
"LDAP://OU=sales,DC=Atlanta,DC=MyDomain,DC=com")
ObjContainer.DeleteObject (0)
All gone.
As with the other ADSI providers, I’ve only scratched the surface of what
you can accomplish using the LDAP provider. Perhaps one day I’ll revisit
this topic and go into further detail.
Until then, be sure to breathe continuously, maintain proper buoyancy
and always control your ascent rate. Oh, wait, those are the SCUBA rules.
I must have been daydreaming. Come to think of it, do we even have rules
for NT administration? Hmm… Oh yeah! Keep ’em secure, keep ’em running,
and don’t touch the boss’ Dilbert calendar.
How’s that for a credo?
About the Author
Chris Brooke, MCSE, is a contributing editor for Redmond magazine and director of enterprise technology for ComponentSource. He specializes in development, integration services and network/Internet administration. Send questions or your favorite scripts to [email protected].