windows-nt/Source/XPSP1/NT/printscan/print/spooler/scripts/subnet_op.vbs
2020-09-26 16:20:57 +08:00

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