I support a large Windows Server 2003 Active Directory
(AD) forest that contains several forest trusts that in turn contain other large
forests. Can I use a script to control (enable and disable) routing name suffixes
across my large forest?
Before answering this question, I think it's useful to explain this somewhat
obscure Active Directory Forest trust setting and point you to references for
more information. When a user in an account domain (trusted domain) attempts
to authenticate across a forest trust, AD routes the request to a resource domain
(trusting domain) that's capable of authenticating the user's request. You can
disable or enable this routing graphically from Active Directory Domains and
Trusts, from the command line by using the NetDOM utility (a Windows Support
Tool), or programmatically by using the new System.DirectoryServices. ActiveDirectory
namespace in the .NET Framework 2.0. To see how this functionality works, consider
the two types of canonical names for user account authentication: a Domain DNS
name (e.g., corp.adatum.com) and a NetBIOS name (e.g., CORP).
Assuming both name examples I provide represent a domain named corp.adatum.com
in the adatum.com forest and a user account named john.doe exists in corp.adatum.com,
then john.doe can log on to the local account domain with either of the following
names: john.doe@corp.adatum.com or CORP\john.doe.
If the fabrikam.com forest trusts the adatum.com forest and john.doe has been
given access to a folder on a resource server in the fabrikam.com domain, then
john.doe in the corp .adatum.com domain can authenticate across the forest trust
and access the folder in the fabrikam.com domain.
To block all users in corp.adatum .com (including john.doe) from authenticating
to any resource in the fabrikam.com domain, an enterprise administrator in the
fabrikam.com forest can exclude the corp.adatum.com domain from the forest trust.
Because trust relationships are confusing enough, here's a generalized explanation
of the pattern:
- Forest x trusts forest y. Thus, domains in forest x are resource domains
and domains in forest y are account domains.
- A user account in forest y is assigned access to a resource in forest x.
- The user account in forest y can authenticate across the forest trust to
access the resource in forest x.
- From forest x, exclude the domain in forest y that contains the user account.
- The user account in forest y can no longer authenticate across the forest
trust to access the resource in forest x.
Later in this answer, I describe two ways to complete this name-suffix exclusion
task, one graphically and the other from the command line. If you want to know
how to perform this task from managed code, see my Microsoft white paper "A
Developer's Introduction to System. DirectoryServices.ActiveDirectory." As of
this writing it hasn't yet been published. However, it should be published around
the same time as this article. In addition, you can learn more about name suffix
routing by reading Jan De Clercq's Windows IT Security article "Windows 2003
Forest Trusts " (http://www.windowsitpro.com,
Instant-Doc ID 38436) and the Microsoft article "Accessing Resources Across
Forests" at http://technet2.microsoft.com/WindowsServer/f/?en/library/517b4fa
4-5266-419c-9791-6fb56fabb85e10 33.mspx. You can also refer to the topic
"Routing name suffixes across a forest" in the Windows Server 2003 Active Directory
Help documentation.
Now that you're more familiar with name suffix routing, let's talk about how
to configure this setting from the command line. You can use the Netdom command-line
tool to enable or disable forest-name suffix routing, exclude top-level domain-name
routing, or disable specific name-suffix routing. For a variety of examples
using the Netdom command line, see the Microsoft article "Netdom Examples" at
http://technet2.microsoft.com/WindowsServer/en/library/539c5381-db4f-445f-aac0-2df5448181c11033.mspx?mfr=true.
By using the Netdom commandline tool, you can list and manage the name suffixes allowed for cross-forest authentication. For example, to see the status of all name suffixes between the fabrikam.com forest and the adatum.com forest, type:
netdom trust fabrikam.com
/namesuffixes:adatum.com
Note that you should list name suffixes from the forest that contains the resource domains because you control name-suffix routing from the outgoing side of a forest trust (the trusting forest).
If you created a cross-forest trust between fabrikam.com and adatum .com, and
adatum.com also contained a sub-domain named corp.adatum .com, then you would
see return results similar to those in Table
1. I put the results in table format to make it easier to delineate one
column from the next. Obviously, SID values will differ between one AD implementation
and the next.
By using the NetDOM command's togglesuffix switch, you can disable all of the
numbered items in Table 1 except
for the Domain DNS name types (items 2 and 5). Note that every time you call
the togglesuffix switch, the name suffix order will change. Therefore, always
run the namesuffixes switch before toggling any additional values. For items
2 and 5, you must use the by AddTLNEX and RemoveTLNEX switches to add or remove
the Domain DNS name types from the excluded domain list. To understand what
these switches really do, I created Table
2, which maps each switch with its possible equivalent configuration in
Active Directory Domains and Trusts, and I show the result of throwing each
switch. For example, Table 2 shows
that to disable the *.adatum.com name suffix, you type:
netdom trust fabrikam.com
/namesuffixes:adatum.com
/togglesuffix:1
This command is equivalent to clicking the Disable button from the Name Suffix
Routing tab of the forest Properties dialog box, as Figure
1 shows. You reach this dialog box from the properties of a forest appearing
in the Active Directory Domains and Trusts MMC snap-in. It effectively disables
all name-suffix routing from *.adatum .com and any domains below that, such
as corp.adatum.com.
Although the previous example is important for a general understanding of name-suffix
routing across a forest, more often you'll want to exclude a child domain from
routing across a forest trust. I suggest that this scenario is more common because
if you really don't want anyone from one forest authenticating to resources
in another forest, you probably shouldn't create a forest trust in the first
place.
Before looking for a scripting solution for making system changes, it's useful
to know exactly what's being changed when you use the NetDOM command line tool,
change the values graphically from the Name Suffix Routing tab in the Active
Directory Domains and Trusts MMC snap-in, or click Edit to reach the Edit dialog
box that Figure 2 shows.
The first place to look for AD changes is in the various directory partitions
in an AD implementation. You can accomplish this task by using a tool that searches
AD for changes between two points in time: before a change was made and right
after. You can create a program that uses the DirSync control LDAP server extension
or a program that performs USN queries against a directory. You can read about
these approaches in the Microsoft article "How to poll for object attribute
changes in Active Directory on Windows 2000 and Windows Server 2003" at http://support.microsoft.com/?kbid=891995.
You could write a script that searches all uSNChanged attributes of every object
in a directory, but some important limitations are associated with this approach,
including the length of time it would take for a script to perform this type
of intensive search operation. The Microsoft article also outlines other important
considerations. In addition, I wrote a MSDN Magazine article about leveraging
the DirSync control, "Got Directory Services? New Ways to Manage Active Directory
using the .NET Framework 2.0" (http://msdn.microsoft.com/msdnmag/issues/05/12/DirectoryServices/default.aspx).
You could modify the source code included with that article to perform DirSync
operations against any location in AD.
After exploring how to poll AD for changes, it turns out that enabling or disabling
name suffix routing doesn't change attributes in AD. The next obvious place
to look, then, is in the registry. SysInternals' RegMon tool is a great way
to poll for registry activity such as value modifications. By running RegMon
and enabling or disabling name suffix routing, you'll see that you are actually
making several changes in the registry. When name suffix routing is toggled,
it calls the lsass process to set security policy in the HKEY_LOCAL_MACHINE\SECURITY\Policy\PolMod
registry key and it logs the change in the HKEY_LOCAL _MACHINE\SECURITY\RXACT\Log
registry key. The lsass process (also known as the Local Security Authority
or LSA Shell), manages local security, domain authentication and some aspects
of an AD configuration on domain controllers. Both of these registry keys contain
default values of type REG_NONE and they store binary data. Scripting registry
changes to these keys would be difficult—or even impossible.
Although you could call Netdom from WScript or a batch file, it's not necessary
to do so. The Netdom switches I've explored here let you control routing for
all domains and sub-domains. In addition, such an operation isn't common. You
might run it after you have set up a forest trust or after additional domains
have been added to an existing forest trust. Both activities are relatively
infrequent in most AD implementations. If you do find a good reason to script
this command, you can do so easily from a shell script by simply calling the
Netdom command and passing the domain name or suffix number in as a parameter
on the command line. If you want to accomplish this task in VBScript, read Bob
Wells' Rem article "Running a Command-Line Utility in VBScript" (http://www.windowsitpro.com/windowsscripting,
Instant-Doc ID 25285).