I wrote this script when I was frequently deploying replication topologies for large geographies. Rather than manually creating them one at a time, I would set everything up in a spreadsheet and then import the spreadsheet. There are a few assumptions made in this script. You may need to modify it a bit if the assumptions don’t work for you.
- Site links only contain two sites
- The replication schedule will be copied from another site link
The input file is expected to be in tab separated format which you can export from Excel (it’s one of the options under File>Save As). The order of the fields is documented at the top of the script. The Hub Site and Spoke Site fields should contain the common name (CN) of the relevant site objects. The Schedule field should contain the common name (CN) of the site link to duplicate the schedule from.
'==========================================================================
' NAME: Import Site Links from TSV
'
' AUTHOR: Brian Desmond, brian@briandesmond.com
' DATE : 3/13/2008
'
' COMMENT:
'
' TEMPLATE FILE FORMAT (tab delimited):
' Hub Site Spoke Site Cost Frequency Schedule
'==========================================================================
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 hubSite
Dim spokeSite
Dim cost
cost = -1
Dim frequency
frequency = -1
Dim templateSchedule
hubSite = tokens(0)
spokeSite = tokens(1)
cost = tokens(2)
frequency = tokens(3)
templateSchedule = tokens(4)
Dim hubSiteDn
Dim spokeSiteDn
hubSiteDn = GetSiteDn(configNcDn, hubSite)
spokeSiteDn = GetSiteDn(configNcDn, spokeSite)
If hubSiteDn = "" Or spokeSiteDn = "" Or templateSchedule = "" Or cost = -1 Or frequency = -1 Then
WScript.Echo "FAIL: " & line
Else
Dim siteLinkName
siteLinkName = hubSite & " - " & spokeSite
On Error Resume Next
Dim siteLinkObj
Set siteLinkObj = GetObject("LDAP://" & GetSiteLinkDn(configNcDn, siteLinkName))
Dim siteLinkExists
If Err.Number <> 0 Then
siteLinkExists = False
Err.Clear
Else
siteLinkExists = True
End If
On Error GoTo 0
On Error Resume Next
Dim templateLinkObj
Set templateLinkObj = GetObject("LDAP://" & GetSiteLinkDn(configNcDn, templateSchedule))
Dim schedule
If Err.Number <> 0 Then
WScript.Echo "Template " & templateSchedule & " not found"
Err.Clear
On Error GoTo 0
Else
On Error GoTo 0
schedule = templateLinkObj.get("schedule")
End If
If siteLinkExists = False Then ' we are making a new one not updating an existing one
Dim transports
Set transports = GetObject("LDAP://CN=IP,CN=Inter-Site Transports,CN=Sites," & configNcDn)
Dim newObj
Set newObj = transports.Create("siteLink", "cn=" & siteLinkName)
newObj.Put "cost", cost
newObj.Put "replInterval", frequency
newObj.PutEx 2, "siteList", Array(hubSiteDn, spokeSiteDn)
newObj.put "schedule", schedule
newObj.SetInfo
WScript.Echo "SUCCEED: " & siteLinkName
Else
siteLinkObj.Put "cost", cost
siteLinkObj.Put "replInterval", frequency
siteLinkObj.PutEx 2, "siteList", Array(hubSiteDn, spokeSiteDn)
siteLinkObj.put "schedule", schedule
siteLinkObj.SetInfo
WScript.Echo "SUCCEED: " & siteLinkName
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 GetSiteLinkDn(configNc, siteLinkName)
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=siteLink)(cn=" & siteLinkName & "));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
GetSiteLinkDn = rs.fields("distinguishedName").Value
rs.MoveNext
Wend
rs.close
cnxn.Close
Set rs = Nothing
Set cmd = Nothing
Set cnxn = Nothing
End Function