725 lines
16 KiB
Plaintext
725 lines
16 KiB
Plaintext
'----------------------------------------------------------------------
|
|
'
|
|
' Copyright (c) Microsoft Corporation 1998-1999
|
|
' All Rights Reserved
|
|
'
|
|
' Abstract:
|
|
'
|
|
' subnet_op.vbs - subnet operation script for Windows 2000 DS
|
|
'
|
|
' Usage:
|
|
'
|
|
' subnet_op [-adl?] [-n subnet-name] [-s site-name] [-p location]
|
|
' [-i ip address] [-m subnet mask]
|
|
'
|
|
'----------------------------------------------------------------------
|
|
|
|
option explicit
|
|
|
|
'
|
|
' Debugging trace flags.
|
|
'
|
|
const kDebugTrace = 1
|
|
const kDebugError = 2
|
|
|
|
dim gDebugFlag
|
|
|
|
'
|
|
' To enable debug output trace message
|
|
' Change the following variable to True.
|
|
'
|
|
gDebugFlag = False
|
|
|
|
'
|
|
' Messages to be displayed if the scripting host is not cscript
|
|
'
|
|
const kMessage1 = "Please run this script using CScript."
|
|
const kMessage2 = "This can be achieved by"
|
|
const kMessage3 = "1. Using ""CScript script.vbs arguments"" or"
|
|
const kMessage4 = "2. Changing the default Windows Scripting Host to CScript"
|
|
const kMessage5 = " using ""CScript //H:CScript //S"" and running the script "
|
|
const kMessage6 = " ""script.vbs arguments""."
|
|
|
|
'
|
|
' Operation action values.
|
|
'
|
|
const kActionAdd = 0
|
|
const kActionDelete = 1
|
|
const kActionList = 2
|
|
const kActionCalculate = 3
|
|
const kActionUnknown = 4
|
|
|
|
main
|
|
|
|
'
|
|
' Main execution start here
|
|
'
|
|
sub main
|
|
|
|
on error resume next
|
|
|
|
dim strSubnet
|
|
dim strSite
|
|
dim strLocation
|
|
dim strIpAddress
|
|
dim strSubnetMask
|
|
dim iAction
|
|
dim oSubnet
|
|
dim iRetval
|
|
dim oArgs
|
|
|
|
'
|
|
' Abort if the host is not cscript
|
|
'
|
|
if not IsHostCscript() then
|
|
|
|
call wscript.echo(kMessage1 & vbCRLF & kMessage2 & vbCRLF & _
|
|
kMessage3 & vbCRLF & kMessage4 & vbCRLF & _
|
|
kMessage5 & vbCRLF & kMessage6 & vbCRLF)
|
|
|
|
wscript.quit
|
|
|
|
end if
|
|
|
|
iAction = kActionUnknown
|
|
|
|
iRetval = ParseCommandLine( iAction, strSubnet, strSite, strLocation, strIpAddress, strSubnetMask )
|
|
|
|
if iRetval = 0 then
|
|
|
|
select case iAction
|
|
|
|
case kActionAdd
|
|
iRetval = CreateSubnetObject( oSubnet, strSubnet, strSite, strLocation )
|
|
|
|
case kActionDelete
|
|
if strSubnet = "all" then
|
|
iRetval = DeleteAllSubnetObjects( )
|
|
else
|
|
iRetval = DeleteSubnetObject( strSubnet )
|
|
end if
|
|
|
|
case kActionList
|
|
iRetval = ListSubnetObjects( )
|
|
|
|
case kActionCalculate
|
|
iRetval = CalculateSubnetObject( strIpAddress, strSubnetMask )
|
|
|
|
case else
|
|
Usage( True )
|
|
exit sub
|
|
|
|
end select
|
|
|
|
end if
|
|
|
|
end sub
|
|
|
|
|
|
'
|
|
' Calculate the subnet object name an IP address and a subnet mask
|
|
'
|
|
function CalculateSubnetObject( ByRef strIpAddress, ByRef strSubnetMask )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the CalculateSubnetObject"
|
|
|
|
Dim aIpAddressOctetArray(4)
|
|
Dim aSubnetMaskOctetArray(4)
|
|
Dim strSubnetObjectName
|
|
|
|
if CreateValueFromOctetString( strIpAddress, aIpAddressOctetArray ) = False then
|
|
|
|
wscript.echo "Invalid IP Address, must be of the form ddd.ddd.ddd.ddd, e.g. 157.41.50.2"
|
|
|
|
CalculateSubnetObject = False
|
|
|
|
exit function
|
|
|
|
end if
|
|
|
|
if CreateValueFromOctetString( strSubnetMask, aSubnetMaskOctetArray ) = False then
|
|
|
|
wscript.echo "Invalid Subnet mask, must be of the form ddd.ddd.ddd.ddd, e.g. 255.255.252.0"
|
|
|
|
CalculateSubnetObject = False
|
|
|
|
exit function
|
|
|
|
end if
|
|
|
|
DebugPrint kDebugTrace, "Ip Octet Value " & aIpAddressOctetArray(0) & "." & aIpAddressOctetArray(1) & "." & aIpAddressOctetArray(2) & "." & aIpAddressOctetArray(3)
|
|
DebugPrint kDebugTrace, "Mask Octet Value " & aSubnetMaskOctetArray(0) & "." & aSubnetMaskOctetArray(1) & "." & aSubnetMaskOctetArray(2) & "." & aSubnetMaskOctetArray(3)
|
|
|
|
if ConvertToSubnetName( aIpAddressOctetArray, aSubnetMaskOctetArray, strSubnetObjectName ) = True then
|
|
|
|
wscript.echo "Subnet Object Name:", strSubnetObjectName
|
|
|
|
CalculateSubnetObject = True
|
|
|
|
else
|
|
|
|
wscript.echo "Unable to convert IP address and subnet mask to subnet object name"
|
|
|
|
CalculateSubnetObject = False
|
|
|
|
end if
|
|
|
|
end function
|
|
|
|
'
|
|
' Convert the given ip address and subnet mask to a DS object name.
|
|
' The algorithm is to take the ip address and it with the subnet mask
|
|
' this is the subnet then tack on a slash and place the number of bits
|
|
' in the subnet mask at the end. For example ip address of 157.59.16.2
|
|
' subnet mask 255.255.252.0 results in a subnet object name of 157.59.0.0/22
|
|
'
|
|
function ConvertToSubnetName( ByRef aIpOctetArray, ByRef aSubnetOctetArray, ByRef strSubnet )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the ConvertToSubnetObject"
|
|
|
|
Dim iVal0
|
|
Dim iVal1
|
|
Dim iVal2
|
|
Dim iVal3
|
|
Dim iBits
|
|
Dim i
|
|
Dim j
|
|
|
|
iVal0 = aIpOctetArray(0) and aSubnetOctetArray(0)
|
|
iVal1 = aIpOctetArray(1) and aSubnetOctetArray(1)
|
|
iVal2 = aIpOctetArray(2) and aSubnetOctetArray(2)
|
|
iVal3 = aIpOctetArray(3) and aSubnetOctetArray(3)
|
|
|
|
for i = 0 to 3
|
|
|
|
for j = 0 to 7
|
|
|
|
if (aSubnetOctetArray(i) and (2 ^ j)) <> 0 then
|
|
|
|
iBits = iBits + 1
|
|
|
|
end if
|
|
|
|
next
|
|
|
|
next
|
|
|
|
strSubnet = iVal0 & "." & iVal1 & "." & iVal2 & "." & iVal3 & "/" & iBits
|
|
|
|
ConvertToSubnetName = True
|
|
|
|
end function
|
|
|
|
'
|
|
' Converts an octet string to an array of octet values. For example
|
|
' this function when given string 157.59.161.2 will return an array with
|
|
' the followin values. A(0) = 157, A(1) = 59, A(2) = 161, A(3) = 2
|
|
'
|
|
function CreateValueFromOctetString( ByRef strOctet, ByRef aOctetArray )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the CreateValueFromOctetString"
|
|
|
|
Dim i
|
|
Dim iDotCount
|
|
Dim cValue
|
|
Dim iValue
|
|
|
|
for i = 0 to 32
|
|
|
|
cValue = Mid( strOctet, i, 1 )
|
|
|
|
if IsNumeric( cValue ) then
|
|
|
|
iValue = iValue * 10 + cValue
|
|
|
|
elseif cValue = "." or cValue = "" then
|
|
|
|
if iValue < 0 or iValue > 255 then
|
|
|
|
DebugPrint kDebugTrace, "Value out of range " & iValue
|
|
|
|
exit for
|
|
|
|
end if
|
|
|
|
aOctetArray(iDotCount) = iValue
|
|
|
|
iDotCount = iDotCount + 1
|
|
|
|
iValue = 0
|
|
|
|
if cValue = "" then
|
|
|
|
exit for
|
|
|
|
end if
|
|
|
|
else
|
|
|
|
DebugPrint kDebugTrace, "Invalid character found " & cValue
|
|
|
|
end if
|
|
|
|
next
|
|
|
|
CreateValueFromOctetString = iDotCount = 4
|
|
|
|
end function
|
|
|
|
|
|
'
|
|
' List subnet objects.
|
|
'
|
|
function ListSubnetObjects( )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the ListSubnetObject"
|
|
|
|
dim oConfigurationContainer
|
|
dim oSite
|
|
dim oSites
|
|
dim oSubnet
|
|
dim strSiteName
|
|
dim strSubnet
|
|
|
|
call GetConfigurationContainer( oConfigurationContainer )
|
|
|
|
DebugPrint kDebugError, "GetConfigurationContainer"
|
|
|
|
for each oSites In oConfigurationContainer
|
|
|
|
if oSites.name = "CN=Sites" then
|
|
|
|
for each oSite in oSites
|
|
|
|
if oSite.name = "CN=Subnets" then
|
|
|
|
for each oSubnet in oSite
|
|
|
|
call GetSiteObjectName( strSiteName, oSubnet.siteObject )
|
|
|
|
strSubnet = StripCNFromName( oSubnet.name )
|
|
|
|
wscript.echo "Name:", strSubnet, vbTab, "Location:", oSubnet.location, "Site:", strSiteName
|
|
|
|
next
|
|
|
|
end if
|
|
|
|
next
|
|
|
|
end if
|
|
|
|
next
|
|
|
|
ListSubnetObjects = Err <> 0
|
|
|
|
end function
|
|
|
|
'
|
|
' Get the site name from a site object name, basically return
|
|
' the CN of the site for the give Site DN
|
|
'
|
|
sub GetSiteObjectName( ByRef strSiteName, ByRef strSiteObject )
|
|
|
|
on error resume next
|
|
|
|
dim oSiteObject
|
|
|
|
set oSiteObject = GetObject( "LDAP://" & strSiteObject )
|
|
|
|
strSiteName = StripCNFromName( oSiteObject.name )
|
|
|
|
end sub
|
|
|
|
|
|
'
|
|
' Function to strip the CN prefix from the given name
|
|
'
|
|
function StripCNFromName( ByRef strNameWithCN )
|
|
|
|
StripCNFromName = Mid( strNameWithCN, 4 )
|
|
|
|
end function
|
|
|
|
'
|
|
' Delete subnet object.
|
|
'
|
|
function DeleteSubnetObject( ByRef strSubnetName )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the DeleteSubnetObject"
|
|
|
|
dim oConfigurationContainer
|
|
dim oSubnets
|
|
|
|
call GetConfigurationContainer( oConfigurationContainer )
|
|
|
|
DebugPrint kDebugError, "GetConfigurationContainer"
|
|
|
|
set oSubnets = oConfigurationContainer.GetObject("subnetContainer", "CN=Subnets,CN=Sites")
|
|
|
|
DebugPrint kDebugError, "GetSubnetContainer"
|
|
|
|
oSubnets.Delete "subnet", "CN=" & strSubnetName
|
|
|
|
DebugPrint kDebugError, "Delete subnet"
|
|
|
|
if Err <> 0 then
|
|
wscript.echo "Failure - deleting subnet " & strSubnetName & " error code " & hex(err)
|
|
else
|
|
wscript.echo "Success - deleting subnet " & strSubnetName & ""
|
|
end if
|
|
|
|
DeleteSubnetObject = Err <> 0
|
|
|
|
end function
|
|
|
|
|
|
'
|
|
' Delete subnet object.
|
|
'
|
|
function DeleteAllSubnetObjects( )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the DeleteAllSubnetObjects"
|
|
|
|
dim oConfigurationContainer
|
|
dim oSite
|
|
dim oSites
|
|
dim oSubnet
|
|
|
|
call GetConfigurationContainer( oConfigurationContainer )
|
|
|
|
DebugPrint kDebugError, "GetConfigurationContainer"
|
|
|
|
for each oSites In oConfigurationContainer
|
|
|
|
if oSites.name = "CN=Sites" then
|
|
|
|
for each oSite in oSites
|
|
|
|
if oSite.name = "CN=Subnets" then
|
|
|
|
for each oSubnet in oSite
|
|
|
|
DeleteSubnetObject( StripCNFromName( oSubnet.name ) )
|
|
|
|
next
|
|
|
|
end if
|
|
|
|
next
|
|
|
|
end if
|
|
|
|
next
|
|
|
|
DeleteAllSubnetObects = True
|
|
|
|
end function
|
|
|
|
|
|
'
|
|
' Creates a subnet object in the current domain.
|
|
'
|
|
function CreateSubnetObject( ByRef oSubnet, ByRef strSubnetName, ByRef strSiteName, ByRef strLocationName )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the CreateSubnetObject"
|
|
DebugPrint kDebugTrace, "Subnet: " & strSubnetName & " Site: " & strSiteName & " Location: " & strLocationName
|
|
|
|
dim oConfigurationContainer
|
|
dim oSubnets
|
|
dim strFullSiteName
|
|
|
|
call GetConfigurationContainer( oConfigurationContainer )
|
|
|
|
DebugPrint kDebugError, "GetConfigurationContainer"
|
|
|
|
set oSubnets = oConfigurationContainer.GetObject( "subnetContainer", "CN=Subnets,CN=Sites" )
|
|
|
|
DebugPrint kDebugError, "Get Subnet Containter"
|
|
|
|
set oSubnet = oSubnets.Create("subnet", "cn=" & strSubnetName )
|
|
|
|
DebugPrint kDebugError, "Create Subnet Object"
|
|
|
|
if strSiteName <> Empty then
|
|
|
|
if CreateFullSiteName( strSiteName, strFullSiteName ) = True then
|
|
|
|
DebugPrint kDebugTrace, "Site Name " & strFullSiteName
|
|
|
|
oSubnet.put "siteObject", strFullSiteName
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
if strLocationName <> Empty then
|
|
|
|
oSubnet.put "location", strLocationName
|
|
|
|
end if
|
|
|
|
oSubnet.SetInfo
|
|
|
|
DebugPrint kDebugError, "Setinfo on Subnet Object"
|
|
|
|
if Err <> 0 then
|
|
wscript.echo "Failure - adding subnet " & strSubnetName & " error code " & hex(err)
|
|
else
|
|
wscript.echo "Success - adding subnet " & strSubnetName & ""
|
|
end if
|
|
|
|
CreateSubnetObject = Err <> 0
|
|
|
|
end function
|
|
|
|
'
|
|
' Create the fully qualified site name of the site name does not have a cn= prefix.
|
|
'
|
|
function CreateFullSiteName( ByRef strSiteName, ByRef strFullSiteName )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the CreateFullSiteName"
|
|
|
|
if UCase( Left( strSiteName, 3 ) ) <> "CN=" then
|
|
|
|
dim RootDSE
|
|
|
|
set RootDSE = GetObject("LDAP://RootDSE")
|
|
|
|
if Err = 0 then
|
|
|
|
strFullSiteName = "CN=" & strSiteName & ",CN=Sites," & RootDSE.get("configurationNamingContext")
|
|
|
|
end if
|
|
|
|
else
|
|
|
|
strFullSiteName = strSiteName
|
|
|
|
end if
|
|
|
|
CreateFullSiteName = strFullSiteName <> Empty
|
|
|
|
end function
|
|
|
|
|
|
|
|
'
|
|
' Get the configuration container object
|
|
'
|
|
function GetConfigurationContainer( ByRef oConfigurationContainer )
|
|
|
|
on error resume next
|
|
|
|
DebugPrint kDebugTrace, "In the GetConfigurationContainer"
|
|
|
|
dim RootDSE
|
|
dim strConfigurationContainer
|
|
|
|
set RootDSE = GetObject("LDAP://RootDSE")
|
|
|
|
DebugPrint kDebugError, "GetObject of RootDSE failed with "
|
|
|
|
set oConfigurationContainer = GetObject("LDAP://" & RootDSE.get("configurationNamingContext"))
|
|
|
|
DebugPrint kDebugError, "GetConfigurationContainer"
|
|
|
|
GetConfigurationContainer = Err <> 0
|
|
|
|
end function
|
|
|
|
'
|
|
' Debug dispaly helper fuction
|
|
'
|
|
sub DebugPrint( ByVal Flags, ByRef String )
|
|
|
|
if gDebugFlag = True then
|
|
|
|
if Flags = kDebugTrace then
|
|
|
|
WScript.echo String
|
|
|
|
end if
|
|
|
|
if Flags = kDebugError then
|
|
|
|
if Err <> 0 then
|
|
|
|
WScript.echo String & " Failed with " & Hex( Err )
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
end sub
|
|
|
|
'
|
|
' Parse the command line into it's components
|
|
'
|
|
function ParseCommandLine( ByRef iAction, ByRef strSubnet, ByRef strSite, ByRef strLocation, ByRef strIpAddress, ByRef strSubnetMask )
|
|
|
|
DebugPrint kDebugTrace, "In the ParseCommandLine"
|
|
|
|
dim oArgs
|
|
dim strArg
|
|
dim i
|
|
|
|
set oArgs = Wscript.Arguments
|
|
|
|
while i < oArgs.Count
|
|
|
|
select case oArgs(i)
|
|
|
|
Case "-a"
|
|
iAction = kActionAdd
|
|
|
|
Case "-d"
|
|
iAction = kActionDelete
|
|
|
|
Case "-l"
|
|
iAction = kActionList
|
|
|
|
Case "-c"
|
|
iAction = kActionCalculate
|
|
|
|
Case "-n"
|
|
i = i + 1
|
|
strSubnet = oArgs(i)
|
|
|
|
Case "-s"
|
|
i = i + 1
|
|
strSite = oArgs(i)
|
|
|
|
Case "-p"
|
|
i = i + 1
|
|
strLocation = oArgs(i)
|
|
|
|
Case "-i"
|
|
i = i + 1
|
|
strIpAddress = oArgs(i)
|
|
|
|
Case "-m"
|
|
i = i + 1
|
|
strSubnetMask = oArgs(i)
|
|
|
|
Case "-?"
|
|
Usage( True )
|
|
exit function
|
|
|
|
Case Else
|
|
Usage( True )
|
|
exit function
|
|
|
|
End Select
|
|
|
|
i = i + 1
|
|
|
|
wend
|
|
|
|
DebugPrint kDebugTrace, "ParseCommandLine Result: " & iAction & " " & strSubnet & " " & strSite & " " & strLocation
|
|
|
|
ParseCommandLine = 0
|
|
|
|
end function
|
|
|
|
|
|
'
|
|
' Display command usage.
|
|
'
|
|
sub Usage( ByVal bExit )
|
|
|
|
wscript.echo "Usage: subnet_op [-acdl?] [-n subnet-name] [-s site-name] [-p location]"
|
|
wscript.echo " [-i ip address] [-m subnet mask]"
|
|
wscript.echo "Arguments:"
|
|
wscript.echo "-a - add the specfied subnet object"
|
|
wscript.echo "-c - calculate subnet object name from ip address and subnet mask"
|
|
wscript.echo "-d - delete the specified subnet object, use 'all' to deleted all subnets"
|
|
wscript.echo "-i - specifies the ip address"
|
|
wscript.echo "-l - list all the subnet objects"
|
|
wscript.echo "-m - specifies the subnet mask"
|
|
wscript.echo "-n - specifies the subnet name"
|
|
wscript.echo "-p - specifies the location string for subnet object"
|
|
wscript.echo "-s - specifies the site for the subnet object"
|
|
wscript.echo "-? - display command usage"
|
|
wscript.echo ""
|
|
wscript.echo "Examples:"
|
|
wscript.echo "subnet_op -l"
|
|
wscript.echo "subnet_op -a -n 1.0.0.0/8"
|
|
wscript.echo "subnet_op -a -n 1.0.0.0/8 -p USA/RED/27N"
|
|
wscript.echo "subnet_op -a -n 1.0.0.0/8 -p USA/RED/27N -s Default-First-Site-Name"
|
|
wscript.echo "subnet_op -d -n 1.0.0.0/8"
|
|
wscript.echo "subnet_op -d -n all"
|
|
wscript.echo "subnet_op -c -i 157.59.16.32 -m 255.255.252.0"
|
|
|
|
if bExit <> 0 then
|
|
wscript.quit(1)
|
|
end if
|
|
|
|
end sub
|
|
|
|
'
|
|
' Determines which program is used to run this script.
|
|
' Returns true if the script host is cscript.exe
|
|
'
|
|
function IsHostCscript()
|
|
|
|
on error resume next
|
|
|
|
dim strFullName
|
|
dim strCommand
|
|
dim i, j
|
|
dim bReturn
|
|
|
|
bReturn = false
|
|
|
|
strFullName = WScript.FullName
|
|
|
|
i = InStr(1, strFullName, ".exe", 1)
|
|
|
|
if i <> 0 then
|
|
|
|
j = InStrRev(strFullName, "\", i, 1)
|
|
|
|
if j <> 0 then
|
|
|
|
strCommand = Mid(strFullName, j+1, i-j-1)
|
|
|
|
if LCase(strCommand) = "cscript" then
|
|
|
|
bReturn = true
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
if Err <> 0 then
|
|
|
|
call wscript.echo("Error 0x" & hex(Err.Number) & " occurred. " & Err.Description _
|
|
& ". " & vbCRLF & "The scripting host could not be determined.")
|
|
|
|
end if
|
|
|
|
IsHostCscript = bReturn
|
|
|
|
end function
|