How to Programmatically get the of an internal domain through a VB Script

I'm building a script I want to be able to execute on clients to create an OU in a domain, and create an account in that ou in the domain. This is not a problem.

The challenge is I'm trying to set the UPN property of these accounts. I can easily do this if I know the domain I'm working with, but I don't want to hardcode that into the script. I want the script to be able to figure out what the domain is and put into the proper formate for the attribute ,

The relevant portions of my script
The AD Bind
Set objRootLDAP = GetObject("LDAP://rootDSE")

and the setting the account property
objUser.Put "userPrincipalName", strUser & "@" & objRootLDAP.Get("defaultNamingContext")

Assuming strUser is a varible which contacts the username to go into the UPN this unfortunately sets the UPN to something along the lines username@DC=domain,DC=com

What I need is

I thought maybe I could use WshNetwork and echo the Domain but this only returns Domain, and not

Any thoughts?
Who is Participating?

Improve company productivity with a Business Account.Sign Up

Ignition_HelpdeskConnect With a Mentor Author Commented:
I did some more searching around and found a MS article on how to return the default upn suffix for a domain. script snippet below

Set objRootLDAP = GetObject("LDAP://rootDSE")
strNamingContext = objRootLDAP.Get("defaultNamingContext")
Set oDomain = GetObject("LDAP://" + strNamingContext)
oDomain.GetInfoEx Array ("canonicalName"),0
strCanonical = oDomain.Get("canonicalName")
strDefaultUPNSuffix = Left(strCanonical, Len(strCanonical) - 1) 'clip off "/"
You need to be a bit careful here - a UPN can be different from the actual domain name. For example, if you're hosting a lot of clients in one Active Directory, you could set their UPN names to be their e-mail addresses - and ask them to log in with their e-mail address.  It is also possible for accounts to not have a UPN at all.  Getting the UPN from Active Directory is relatively easy - using this code:

Option Explicit

Dim objADSystemInfo, objUser
Dim upn

Set objADSystemInfo = CreateObject("ADSystemInfo") 

Set objUser = GetObject("LDAP://" & objADSystemInfo.UserName)

upn = objUser.userprincipalname

WScript.echo upn

Open in new window

Something that might be a bit safer - is to get the environment variable USERDNSDOMAIN - it will show the user's domain in the format you'd like.  Something like this would be nice:

Option Explicit

Dim objShell, objUserEnv
Dim Domain

Set objShell = CreateObject( "WScript.Shell" )
Set objUserEnv = objShell.Environment( "PROCESS" )

Domain = objUserEnv("USERDNSDOMAIN")

WScript.Echo Domain

Open in new window

Have fun!
Chris BottomleyCommented:
See the what I think is a similar question here

Basically passing the exchange username to the getsmtpaddress function and it will return the full smtp address that you can then process.

Ignition_HelpdeskAuthor Commented:
some of the answers provided would have worked, but not quite the way I wanted to get the information.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.