Files

524 lines
18 KiB
Plaintext

' // ***************************************************************************
' //
' // Copyright (c) Microsoft Corporation. All rights reserved.
' //
' // Microsoft Deployment Toolkit Solution Accelerator
' //
' // File: ZTINicUtility.wsf
' //
' // Version: 6.3.8456.1000
' //
' // Purpose: Utility functions For NIC COnfiguration
' //
' // Usage: <script language="VBScript" src="ZTINicUtility.vbs"/>
' //
' // ***************************************************************************
' Properties In Use:
'
' OSDDiskIndex
' OSDDiskType
' OSDDiskType
' Dim OSDAdapterCount
'
' For each Adapter: OSDAdapter(N)
'
' Dim Index
' Dim Name
' Dim MacAddress
'
' Dim EnableDHCP ' ALLWAYS FALSE, otherwise assume DHCP
'
' Dim IpAddressList()
' Dim SubnetMask()
' Dim Gateways()
' Dim GatewayCostMetric
'
' Dim DNSServerList()
' Dim DNSSuffix
' Dim EnableDNSRegistration ' T/F
' Dim EnableFullDNSRegistration ' T/F
'
' Dim EnableWINS ' T/F
' Dim WINSServerList()
' Dim EnableLMHOSTS ' T/F
'
' Dim TCPIPNetBiosOptions ' T/F
'
' Dim EnableTCPIPFiltering
' Dim TCPFilterPortList()
' Dim UDPFilterPortList()
' Dim IPProtocolFilterList()
'
Option Explicit
Dim g_ObjNetworkAdapters
'
' Given a Network Adatper from Win32_NetworkAdatperConfiguration, and an integer,
' this rountine will extract the relevant settings from the NIC and save them to the environment.
'
Sub SaveNetworkAdapterSettings ( oAdapter, AdapterIndex, SaveWithMACAddress )
Dim IPAddress, SubnetMask
Dim i
oLogging.CreateEntry "Save Network Adapter(" & AdapterIndex & ") MAC = " & SaveWithMACAddress & " " & oAdapter.Description , LogTypeInfo
SaveAdapterSetting AdapterIndex, "EnableDHCP", "False"
SaveAdapterSetting AdapterIndex, "Name", GetNicName ( oAdapter )
If SaveWithMACAddress then
SaveAdapterSetting AdapterIndex, "MacAddress", oAdapter.MACAddress
Else
SaveAdapterSetting AdapterIndex, "MacAddress", ""
End if
IPAddress = oAdapter.IPAddress
SubnetMask = oAdapter.IPSubnet
' Filter out IPv6 Addresses, Link Local address common in Windows Vista.
i = LBound(IPAddress)
While i <= ubound(IPAddress)
If isIPV6Address(IPAddress(i)) then
RemoveElementFromArray IPAddress,i
RemoveElementFromArray SubnetMask,i
Else
i = i + 1
End if
Wend
' Description is not part of the spec, but we save it anyways For reference.
SaveAdapterSetting AdapterIndex, "Description", oAdapter.Description
SaveAdapterSetting AdapterIndex, "IpAddressList", IPAddress
SaveAdapterSetting AdapterIndex, "SubnetMask", SubnetMask
SaveAdapterSetting AdapterIndex, "Gateways", oAdapter.DefaultIPGateway
' Bug: 7879 - WMI does not support "Automatic" Gateway Cost Metric. Disable.
' SaveAdapterSetting AdapterIndex, "GatewayCostMetric", oAdapter.GatewayCostMetric
SaveAdapterSetting AdapterIndex, "DNSServerList", oAdapter.DNSServerSearchOrder
SaveAdapterSetting AdapterIndex, "DNSSuffix", oAdapter.DNSDomain
SaveAdapterSetting AdapterIndex, "EnableDNSRegistration", oAdapter.DomainDNSRegistrationEnabled
SaveAdapterSetting AdapterIndex, "EnableFullDNSRegistration", oAdapter.FullDNSRegistrationEnabled
SaveAdapterSetting AdapterIndex, "EnableLMHOSTS", oAdapter.WINSEnableLMHostsLookup
SaveAdapterSetting AdapterIndex, "TCPIPNetBiosOptions", oAdapter.TcpipNetbiosOptions
If not isnull(oAdapter.WINSPrimaryServer) and not isnull(oAdapter.WINSSecondaryServer) then
SaveAdapterSetting AdapterIndex, "EnableWINS", "True"
SaveAdapterSetting AdapterIndex, "WINSServerList", oAdapter.WINSPrimaryServer & "," & oAdapter.WINSSecondaryServer
ElseIf not isnull(oAdapter.WINSPrimaryServer) then
SaveAdapterSetting AdapterIndex, "EnableWINS", "True"
SaveAdapterSetting AdapterIndex, "WINSServerList", oAdapter.WINSPrimaryServer
ElseIf not isnull(oAdapter.WINSSecondaryServer) then
SaveAdapterSetting AdapterIndex, "EnableWINS", "True"
SaveAdapterSetting AdapterIndex, "WINSServerList", oAdapter.WINSSecondaryServer
Else
SaveAdapterSetting AdapterIndex, "EnableWINS", "False"
End if
If oAdapter.IPFilterSecurityEnabled then
SaveAdapterSetting AdapterIndex, "EnableIPProtocolFiltering", "True"
SaveAdapterSetting AdapterIndex, "TCPFilterPortList", oAdapter.IPSecPermitTCPPorts
SaveAdapterSetting AdapterIndex, "UDPFilterPortList", oAdapter.IPSecPermitUDPPorts
SaveAdapterSetting AdapterIndex, "IPProtocolFilterList", oAdapter.IPSecPermitIPProtocols
Else
SaveAdapterSetting AdapterIndex, "EnableIPProtocolFiltering", "False"
SaveAdapterSetting AdapterIndex, "TCPFilterPortList", ""
SaveAdapterSetting AdapterIndex, "UDPFilterPortList", ""
SaveAdapterSetting AdapterIndex, "IPProtocolFilterList", ""
End if
End Sub
'//----------------------------------------------------------------------------
Function LoadNetworkAdapterSettings ( oAdapter, AdapterIndex )
' Returns
oLogging.CreateEntry "Load Network Adapter(" & AdapterIndex & ") = " & oAdapter.Description , LogTypeInfo
Dim i
Dim Item
Dim iResult
Dim sErrorString
Dim sCostMetric
' -----------------------------------------------------
' Release any acquired DHCP address
If oAdapter.DHCPEnabled then
If oAdapter.DHCPServer <> NULL then
If oAdapter.DHCPServer <> "255.255.255.255" then
oAdapter.ReleaseDHCPLeaseAll()
End if
End if
End if
' -----------------------------------------------------
' IP Addresses and associated SubNet Masks (REQUIRED)
Dim IPAddress, SubnetMask
If LoadAdapterSetting( AdapterIndex, "IpAddressList" ) <> "" and LoadAdapterSetting( AdapterIndex, "SubnetMask" ) <> "" then
IPAddress = LoadAdapterSettingAsArray( AdapterIndex, "IpAddressList" )
SubnetMask = LoadAdapterSettingAsArray( AdapterIndex, "SubnetMask" )
' Filter out IPv6 Addresses
For i = lbound(IPAddress) to ubound(IPAddress)
If isIPV6Address(IPAddress(i)) then
RemoveElementFromArray IPAddress,i
RemoveElementFromArray SubnetMask,i
End if
next
' Set Static Addresses
oLogging.CreateEntry "Action: oAdapter.EnableStatic(IPAddress,SubnetMask)", LogTypeInfo
iResult = oAdapter.EnableStatic(IPAddress,SubnetMask)
CheckForErrorsEx iResult, sErrorString,"EnableStatic(IPAddress,SubnetMask)", false
End if
' -----------------------------------------------------
' Gateway Address and associated Cost Metrics (REQUIRED)
oLogging.CreateEntry "Action: oAdapter.SetGateways(Gateway, GatewayMetric)", LogTypeInfo
sCostMetric = LoadAdapterSetting( AdapterIndex, "GatewayCostMetric" )
If instr(1,sCostMetric,"automatic",vbTextCompare) <> 0 then
' There is no way to explicitly set the gateway cost metric to "automatic" within WMI.
' Setting to NULL should produce the nearest results.
sCostMetric= ""
End if
If LoadAdapterSetting( AdapterIndex, "Gateways" ) <> "" and sCostMetric <> "" then
iResult = oAdapter.SetGateways( LoadAdapterSettingAsArray( AdapterIndex, "Gateways" ), LoadAdapterSettingAsIntArray( AdapterIndex, "GatewayCostMetric" ) )
CheckForErrorsEx iResult, sErrorString,"SetGateways(Gateway, GatewayMetric)", false
ElseIf LoadAdapterSetting( AdapterIndex, "Gateways" ) <> "" then
iResult = oAdapter.SetGateways( LoadAdapterSettingAsArray( AdapterIndex, "Gateways" ), NULL )
CheckForErrorsEx iResult, sErrorString,"SetGateways(Gateway, GatewayMetric)", false
End if
' -----------------------------------------------------
oLogging.CreateEntry "Action: oAdapter.SetTcpipNetbios", LogTypeInfo
Item = ucase(trim(LoadAdapterSetting( AdapterIndex, "TCPIPNetBiosOptions" )))
If Item <> "" then
Select case(Item)
case "FALSE", "DHCP"
iResult = oAdapter.SetTcpipNetbios(0)
case "TRUE"
iResult = oAdapter.SetTcpipNetbios(1)
case "DISABLE"
iResult = oAdapter.SetTcpipNetbios(2)
case "0","1","2"
iResult = oAdapter.SetTcpipNetbios(Item)
case else
oLogging.CreateEntry "OSDAdapter" & AdapterIndex & "TCPIPNetBiosOptions value unknown: [" & Item & "]", LogTypeInfo
End Select
CheckForErrors iResult, sErrorString,"SetTcpipNetbios"
End if
' -----------------------------------------------------
oLogging.CreateEntry "Action: oAdapter.SetWINSServer(1,2)", LogTypeInfo
Item = LoadAdapterSettingAsArray( AdapterIndex, "WINSServerList" )
If ubound(Item) >= 1 then
If Item(0) <> "" and Item(1) <> "" then
iResult = oAdapter.SetWINSServer( Item(0), Item(1))
CheckForErrors iResult, sErrorString,"SetWINSServer"
End if
ElseIf ubound(Item) >= 0 then
If Item(0) <> "" then
iResult = oAdapter.SetWINSServer( Item(0), "")
CheckForErrors iResult, sErrorString,"SetWINSServer"
End if
End if
' -----------------------------------------------------
oLogging.CreateEntry "Action: oAdapter.SetDNSServerSearchOrder()", LogTypeInfo
If LoadAdapterSetting ( AdapterIndex, "DNSServerList" ) <> "" then
iResult = oAdapter.SetDNSServerSearchOrder ( LoadAdapterSettingAsArray ( AdapterIndex, "DNSServerList" ) )
CheckForErrors iResult, sErrorString,"SetDNSServerSearchOrder"
End if
' -----------------------------------------------------
oLogging.CreateEntry "Action: oAdapter.SetDNSDomain()", LogTypeInfo
If LoadAdapterSetting ( AdapterIndex, "DNSSuffix" ) <> "" then
iResult = oAdapter.SetDNSDomain ( LoadAdapterSetting ( AdapterIndex, "DNSSuffix" ) )
CheckForErrors iResult, sErrorString,"SetDNSDomain()"
End if
' -----------------------------------------------------
Dim EnableDNS
Dim EnableFullDNS
oLogging.CreateEntry "Action: oAdapter.SetDynamicDNSRegistration(...)", LogTypeInfo
EnableDNS = oAdapter.DomainDNSRegistrationEnabled
EnableFullDNS = oAdapter.FullDNSRegistrationEnabled
If LoadAdapterSetting( AdapterIndex, "EnableDNSRegistration" ) <> "" then
EnableDNS = cBool(LoadAdapterSetting( AdapterIndex, "EnableDNSRegistration" ))
End if
If LoadAdapterSetting( AdapterIndex, "EnableFullDNSRegistration" ) <> "" then
EnableFullDNS = cBool(LoadAdapterSetting( AdapterIndex, "EnableFullDNSRegistration" ))
End if
If LoadAdapterSetting( AdapterIndex, "EnableDNSRegistration" ) <> "" or LoadAdapterSetting( AdapterIndex, "EnableFullDNSRegistration" ) <> "" then
iResult = oAdapter.SetDynamicDNSRegistration(EnableFullDNS, EnableDNS)
CheckForErrors iResult, sErrorString,"SetDynamicDNSRegistration"
End if
' -----------------------------------------------------
oLogging.CreateEntry "Action: oAdapter.EnableIPFilterSec(...) " , LogTypeInfo
If LoadAdapterSetting( AdapterIndex, "EnableIPProtocolFiltering" ) <> "" then
If oAdapter.IPFilterSecurityEnabled <> cBOOL(LoadAdapterSetting( AdapterIndex, "EnableIPProtocolFiltering" )) then
oLogging.CreateEntry oAdapter.IPFilterSecurityEnabled & " <> " & cBOOL(LoadAdapterSetting( AdapterIndex, "EnableIPProtocolFiltering" )) , LogTypeInfo
' on error resume next
iResult = oAdapter.EnableIPFilterSec(not oAdapter.IPFilterSecurityEnabled)
' on error goto 0
CheckForErrors iResult, sErrorString,"EnableIPFilterSec"
End if
If oAdapter.IPFilterSecurityEnabled then
iResult = oAdapter.EnableIPSec( LoadAdapterSettingAsArray( AdapterIndex, "TCPFilterPortList" ), _
LoadAdapterSettingAsArray( AdapterIndex, "UDPFilterPortList" ), _
LoadAdapterSettingAsArray( AdapterIndex, "IPProtocolFilterList" ) )
CheckForErrors iResult, sErrorString,"EnableIPSec"
End if
End if
' -----------------------------------------------------
oLogging.CreateEntry "Action: oAdapter.Name(...) " , LogTypeInfo
If LoadAdapterSetting( AdapterIndex, "Name" ) <> "" then
RenameNic GetNicName( oAdapter ) , LoadAdapterSetting( AdapterIndex, "Name" )
End if
LoadNetworkAdapterSettings = sErrorString
End Function
'//----------------------------------------------------------------------------
const NETWORK_CONNECTIONS = &H31&
Function RenameNic ( sOldName , sNewName )
Dim IRetVal
Dim sCmd
oLogging.CreateEntry vbTab & "Change [" & sOldName & "] to [" & sNewName & "]", LogTypeInfo
sCmd = "cmd.exe /c netsh.exe interface set interface name=""" & sOldName & """ newname=""" & sNewName & """ 1>> %LogPath%\NetSh.log 2>>&1"
sCmd = oEnvironment.Substitute(sCmd)
If uCase(sOldName) <> uCase(sNewName) and oEnv("SystemDrive") <> "X:" then
iRetVal = oUtility.RunWithHeartbeat ( sCmd )
TestAndLog iRetVal, "Change: " & sCmd
End if
End function
Function GetNicName ( oNicCfg )
' Given an instance of the WMI Win32_NetworkAdapterConfiguration class, will return it's Net Connection ID
Dim oNic
For Each oNic in objWMI.ExecQUery("ASSOCIATORS OF {" & oNicCfg.Path_ & "} WHERE AssocClass = Win32_NetworkAdapterSetting ")
GetNicName = oNic.NetConnectionID
Exit for
Next
End function
Sub CheckForErrors( iResult, byref ErrorString, sDescription )
CheckForErrorsEx iResult, ErrorString, sDescription, true
End sub
Sub CheckForErrorsEx( iResult, byref ErrorString, sDescription, bSilentMessages )
If iResult = 0 then
oLogging.CreateEntry "WMI Function: Adapter." & sDescription & " Success!", LogTypeInfo
ElseIf iResult = 96 then ' DNS notification errors are OK
oLogging.CreateEntry "WMI Function: Adapter." & sDescription & " IGNORING: " & iResult & " " & GetWMINetworkErrorMessage( iResult ), LogTypeInfo
Else
If bSilentMessages then
oLogging.CreateEntry "WMI Function: Adapter." & sDescription & " FAILURE: " & iResult & " " & GetWMINetworkErrorMessage( iResult ), LogTypeInfo
Else
oLogging.CreateEntry "WMI Function: Adapter." & sDescription & " FAILURE: " & iResult & " " & GetWMINetworkErrorMessage( iResult ), LogTypeWarning
ENd if
If not isempty(ErrorString) then
ErrorString = ErrorString & vbNewLine
End if
ErrorString = ErrorString & sDescription & " Failure: " & GetWMINetworkErrorMessage( iResult )
End if
End sub
Function LoadAdapterSetting( sAdapterIndex, sName )
LoadAdapterSetting = oEnvironment.Item( "OSDAdapter" & sAdapterIndex & sName )
End Function
Function LoadAdapterSettingAsArray( sAdapterIndex, sName )
LoadAdapterSettingAsArray = LoadAdapterSetting( sAdapterIndex , sName )
If LoadAdapterSettingAsArray = "" then
LoadAdapterSettingAsArray = array ("")
Else
LoadAdapterSettingAsArray = split ( LoadAdapterSettingAsArray, ",")
End if
End Function
Function LoadAdapterSettingAsIntArray( sAdapterIndex, sName )
Dim i
Dim StringArray
Dim IntArray
StringArray = LoadAdapterSettingAsArray( sAdapterIndex, sName )
ReDim IntArray(ubound(StringArray))
For i = 0 to uBound(StringArray)
IntArray(i) = cint(StringArray(i))
Next
LoadAdapterSettingAsIntArray = IntArray
End Function
Sub CleanNetworkSettings(Index)
Dim oItem
Const IPVariables = "Index Name MacAddress IpAddressList SubnetMask Gateways GatewayCostMetric DNSServerList DNSSuffix EnableDNSRegistration EnableFullDNSRegistration EnableWINS WINSServerList EnableLMHOSTS TCPIPNetBiosOptions EnableTCPIPFiltering TCPFilterPortList UDPFilterPortList IPProtocolFilterList"
For each oItem in split(IPVariables," ")
SaveAdapterSetting Index, oItem, ""
Next
End sub
Sub SaveAdapterSetting( sAdapterIndex, sName, Value )
If oEnvironment.Item( "OSDAdapter" & sAdapterIndex & sName ) = "" then
If isArray(Value) then
If ubound(Value) <= 1 and Value(0) = "" then
Exit sub
End if
ElseIf IsNull(Value) then
Exit sub
ElseIf Value = "" then
Exit sub
End if
End if
If IsArray(Value) then
' Combine Arrays into comma delimited strings
oEnvironment.Item( "OSDAdapter" & sAdapterIndex & sName ) = join( Value, "," )
ElseIf IsNull(Value) then
oEnvironment.Item( "OSDAdapter" & sAdapterIndex & sName ) = ""
Else
oEnvironment.Item( "OSDAdapter" & sAdapterIndex & sName ) = Value
End if
End Sub
Function isIPV6Address ( sAddress )
isIPV6Address = instr(1,sAddress,":",vbTextCompare)
End function
Function ObjNetworkAdapters
If isempty(g_ObjNetworkAdapters) then
oLogging.CreateEntry "Query networking adapters...", LogTypeInfo
Set g_ObjNetworkAdapters = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 1")
oLogging.CreateEntry "Networking Adapters found! Count = " & g_ObjNetworkAdapters.Count, LogTypeInfo
End if
Set ObjNetworkAdapters = g_ObjNetworkAdapters
End Function
Sub RemoveElementFromArray( byref Arr, Index )
Dim i
For i = Index to ubound(Arr)-1
Arr(i) = Arr(i+1)
Next
Redim preserve Arr(ubound(Arr)-1)
End sub
Function GetWMINetworkErrorMessage( iRetVal )
Dim sErrMsg
Select case (iRetVal)
Case 1 sErrMsg = "Successful completion, reboot required."
Case 64 sErrMsg = "Method not supported on this platform."
Case 65 sErrMsg = "Unknown failure."
Case 66 sErrMsg = "Invalid subnet mask."
Case 67 sErrMsg = "An error occurred while processing an instance that was returned."
Case 68 sErrMsg = "Invalid input parameter."
Case 69 sErrMsg = "More than five gateways specified."
Case 70 sErrMsg = "Invalid IP address."
Case 71 sErrMsg = "Invalid gateway IP address."
Case 72 sErrMsg = "An error occurred while accessing the registry For the requested information."
Case 73 sErrMsg = "Invalid domain name."
Case 74 sErrMsg = "Invalid host name."
Case 75 sErrMsg = "No primary/secondary WINS server defined."
Case 76 sErrMsg = "Invalid file."
Case 77 sErrMsg = "Invalid system path."
Case 78 sErrMsg = "File copy failed."
Case 79 sErrMsg = "Invalid security parameter."
Case 80 sErrMsg = "Unable to configure TCP/IP service."
Case 81 sErrMsg = "Unable to configure DHCP service."
Case 82 sErrMsg = "Unable to renew DHCP lease."
Case 83 sErrMsg = "Unable to release DHCP lease."
Case 84 sErrMsg = "IP not enabled on adapter."
Case 85 sErrMsg = "IPX not enabled on adapter."
Case 86 sErrMsg = "Frame/network number bounds error."
Case 87 sErrMsg = "Invalid frame type."
Case 88 sErrMsg = "Invalid network number."
Case 89 sErrMsg = "Duplicate network number."
Case 90 sErrMsg = "Parameter out of bounds."
Case 91 sErrMsg = "Access denied."
Case 92 sErrMsg = "Out of memory."
Case 93 sErrMsg = "Already exists."
Case 94 sErrMsg = "Path, file, or object not found."
Case 95 sErrMsg = "Unable to notify service."
Case 96 sErrMsg = "Unable to notify DNS service."
Case 97 sErrMsg = "Interface not configurable."
Case 98 sErrMsg = "Not all DHCP leases could be released/renewed."
Case 100 sErrMsg = "DHCP not enabled on adapter."
case Else sErrMsg = "Unknown Error: " & iRetVal
End select
GetWMINetworkErrorMessage = sErrMsg
End function