I’ve been using this script for years now and was reminded of it by a post on the activedir.org DL the other day. The script does exactly what the name implies – it takes a tab separated input file (supplied as the first argument) and generates Active Directory subnet objects for each line. If the subnet already exists, the associated site and description will be updated. The script targets the forest the user is currently logged in to.
The code is pasted in below, note the format for the input file (TSV). One field I noticed is missing is the canonical location field. You should be able to add this to the script pretty easily if you need this, or if there’s sufficient demand leave a comment and I can do it.
'========================================================================== ' NAME: Import Subnets from Tab Seperated File ' ' AUTHOR: Brian Desmond, brian@briandesmond.com ' ' COMMENT: ' ' TEMPLATE FILE FORMAT (tab delimited): ' Subnet Address Prefix Length Site Name Description '========================================================================== Option Explicit If WScript.Arguments.Count < 1 Then WScript.Echo "Specify an input file name as an argument to this script." WScript.Quit(1) End If Dim fso Set fso = WScript.CreateObject("Scripting.FileSystemObject") Dim importFile importFile = Trim(WScript.Arguments(0)) If Not fso.FileExists(importFile) Then WScript.Echo "Input file not found" WScript.Quit(1) End If Dim configNcDn configNcDn = GetConfigNc() Dim inputReader Set inputReader = fso.OpenTextFile(importFile) Dim line While Not inputReader.AtEndOfStream line = inputReader.ReadLine Dim tokens tokens = Split(line, vbtab) Dim subnetAddress subnetAddress = "" Dim prefixLength prefixLength = "" Dim siteName siteName = "" Dim description description = "" On Error Resume Next subnetAddress = tokens(0) prefixLength = tokens(1) siteName = tokens(2) description = tokens(3) On Error GoTo 0 If subnetAddress = "" Or prefixLength = "" Or siteName = "" Then WScript.Echo "FAIL: " & line Else Dim siteDn siteDn = GetSiteDn(configNcDn, siteName) If siteDn = "" Then WScript.Echo "SITE NOT FOUND: " & line Else Dim subnetCn subnetCn = subnetAddress & "/" & prefixLength 'On Error Resume Next Dim subnetDn subnetDn = "" subnetDn = GetSubnetDn(configNcDn, subnetCn) WScript.Echo subnetDn Dim subnetExists If subnetDn = "" Then subnetExists = False Else subnetExists = True End If 'Err.Clear 'On Error GoTo 0 Dim subnetObj If subnetExists Then WScript.Echo subnetDn Set subnetObj = GetObject("LDAP://" & Replace(subnetDn, "/", "\/")) Else Dim configObj Set configObj = GetObject("LDAP://CN=Subnets,CN=Sites," & configNcDn) Set subnetObj = configObj.Create("subnet", "cn=" & subnetCn) End If subnetObj.Put "siteObject", siteDn If Not Trim(description) = "" Then subnetObj.Put "description", description End If subnetObj.SetInfo WScript.Echo "SUCCEED: " & line Set subnetObj = Nothing End If End If Wend inputReader.Close WScript.Echo "Complete" Function GetConfigNc() Dim rootDse Set rootDse = GetObject("LDAP://RootDSE") Dim configNc configNc = rootDse.get("configurationNamingContext") Set rootDse = Nothing GetConfigNc = configNc End Function Function GetSiteDn(configNc, siteName) Dim cnxn Set cnxn = WScript.CreateObject("ADODB.Connection") cnxn.Provider = "ADsDSOObject" cnxn.Open "Active Directory Provider" Dim cmd Set cmd = WScript.CreateObject("ADODB.Command") cmd.ActiveConnection = cnxn cmd.CommandText = "<LDAP://" & configNc & ">;(&(objectcategory=site)(cn=" & siteName & "));distinguishedName;subtree" cmd.Properties("Page Size") = 100 cmd.Properties("Timeout") = 30 cmd.Properties("Cache Results") = False Dim rs Set rs = cmd.Execute While Not rs.eof GetSiteDn = rs.fields("distinguishedName").Value rs.MoveNext Wend rs.close cnxn.Close Set rs = Nothing Set cmd = Nothing Set cnxn = Nothing End Function Function GetSubnetDn(configNc, subnetName) Dim cnxn Set cnxn = WScript.CreateObject("ADODB.Connection") cnxn.Provider = "ADsDSOObject" cnxn.Open "Active Directory Provider" Dim cmd Set cmd = WScript.CreateObject("ADODB.Command") cmd.ActiveConnection = cnxn cmd.CommandText = "<LDAP://" & configNc & ">;(&(objectcategory=subnet)(cn=" & subnetName & "));distinguishedName;subtree" cmd.Properties("Page Size") = 100 cmd.Properties("Timeout") = 30 cmd.Properties("Cache Results") = False Dim rs Set rs = cmd.Execute While Not rs.eof GetSubnetDn = rs.fields("distinguishedName").Value rs.MoveNext Wend rs.close cnxn.Close Set rs = Nothing Set cmd = Nothing Set cnxn = Nothing End Function