Intel NICTeaming, PowerShell: IntelNetCmdlets

Het configureren van NIC Teaming is met Windows Server 2008 R2 sinds kort een stuk gemakkelijker dankzij de PowerShell module IntelNetCmdlets die in de laatste versies van de software “Intel Network Connections” is opgenomen.

 

Software installeren

Windows PowerShell 3.0

Het lijkt erop dat minimaal Windows PowerShell 3.0 geïnstalleerd moet zijn om de PowerShell module geïnstalleerd te krijgen. Deze kun je hier downloaden en eventueel unattended installeren d.m.v. het volgende commando:

wusa "Windows6.1-KB2506143-x64.msu" /quiet /norestart

Deze installatie vereist een herstart van de server om goed toegepast te worden, dus je kunt ook meteen het volgende commando uitvoeren (LET OP: deze voert direct na de installatie een herstart uit, zonder dit te verifiëren):

wusa "Windows6.1-KB2506143-x64.msu" /quiet /forcerestart

Intel Network Connections installeren

De laatste versie van “Intel Network Connections” waarin de PowerShell module IntelNetCmdlets is opgenomen, is te downloaden door te zoeken op Network Adapter Driver for Windows Server 2008 R2* via de website van Intel. De software is gemakkelijk handmatig te installeren, maar eventueel ook silent/unattended door de installatie uit te pakken en vervolgens het volgende commando te gebruiken:

DxSetup.exe /qr BD=1 DMIX=1 ANS=1 POWERSHELL=1 /liew "%TEMP%\DxSetup.log

Dit installeert naast de Base Driver ook alle benodigdheden om Teaming te kunnen configureren en de PowerShell module. Het is wel aan te raden om alle benodigde setup-bestanden lokaal te kopiëren en vanuit daar op te starten, omdat tijdens het installeren de netwerkverbinding weg kan vallen.

 

IntelNetCmdlets gebruiken

De module kan in PowerShell worden geïmporteerd door door de psd1 te importeren of (soms pas na een herstart van de server) direct via de beschikbare modules:

Import-Module "C:\Program Files\Intel\IntelNetCmdlets\IntelNetCmdlets.psd1" # via PSD1
Import-Module Import-Module IntelNetCmdlets # via beschikbare modules

De volgende Cmdlets komen beschikbaar met het importeren van de module:

PS C:\> Get-Command -Module IntelNetCmdlets | ft Name

Name
----
Add-IntelNetFcoeVirtualPort
Add-IntelNetTeamMember
Add-IntelNetVLAN
Get-IntelNetAdapter
Get-IntelNetAdapterBandwidthPercentages
Get-IntelNetAdapterProfileSettings
Get-IntelNetAdapterSetting
Get-IntelNetAdapterStatus
Get-IntelNetFcoeFabric
Get-IntelNetFcoeLun
Get-IntelNetFcoePort
Get-IntelNetFcoeSetting
Get-IntelNetFcoeTarget
Get-IntelNetFcoeVLAN
Get-IntelNetIscsiBootCrashDump
Get-IntelNetTeam
Get-IntelNetTeamSetting
Get-IntelNetVLAN
Get-IntelNetVLANJumboPacket
New-IntelNetTeam
Remove-IntelNetFcoeVirtualPort
Remove-IntelNetTeam
Remove-IntelNetTeamMember
Remove-IntelNetVLAN
Set-IntelNetAdapterMaximumBandwidthPercentage
Set-IntelNetAdapterMinimumBandwidthPercentage
Set-IntelNetAdapterSetting
Set-IntelNetFcoeSetting
Set-IntelNetIscsiBootCrashDump
Set-IntelNetTeam
Set-IntelNetTeamSetting
Set-IntelNetVLAN
Set-IntelNetVLANJumboPacket
Test-IntelNetDiagnostics
Test-IntelNetIdentifyAdapter

Door slim gebruik te maken van combinaties van deze Cmdlets kun je de dus de interfaces instellen voor o.a. het gebruik van iSCSI, Fcoe, vLANS definiëren en NIC Teaming configureren.

 

NIC Teaming op Windows Server 2008 R2

Onder Windows Server 2012 (R2) zijn er veel Cmdlets bijgekomen waarmee netwerkverbindingen ingesteld kunnen worden en is er ook de mogelijkheid om verschillende vormen van Teaming te configureren. Op Windows Server 2008 R2 zijn die mogelijkheden er niet en zal er meer gebruik gemaakt moeten worden van WMI voor het configureren van de interfaces en/of software die de leverancier beschikbaar stelt voor o.a. het Teaming.

In onderstaande script maken we gebruik van de Cmdlets in de module IntelNetCmdlets om alle gepatchte Intel Adapters te combineren in een Team en één van de statisch geconfigureerde IP-adressen (en overige informatie, zoals DNS servers) vervolgens op de Team interface te configureren.

# Importeer de te module IntelNetCmdlets, de rest van de te gebruiken Cmdlets zijn direct vanuit PowerShell beschikbaar
Import-Module IntelNetCmdlets

# De netwerkinformatie van één van de NICs met een niet dynamisch IP-adres en een geconfigureerde gateway IP ophalen
$ConnectedNICConfig = @(Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=false" | ?{$_.ipaddress -ne $null -and $_.DefaultIPGateway -ne $null})[0]

# De netwerkinformatie zetten we vervolgens nog in een gemakkelijk te hanteren custom object
$NICConfig = New-Object PSObject -Property @{
IPAddress = ($ConnectedNICConfig.IPAddress | ?{$_ -notlike "*:*"})
IPSubnet = (@($ConnectedNICConfig.IPSubnet)[0])
DNSServerSearchOrder = $ConnectedNICConfig.DNSServerSearchOrder
DNSDomain = $ConnectedNICConfig.DNSDomain
DefaultIPGateway = $ConnectedNICConfig.DefaultIPGateway
DomainDNSRegistrationEnabled = $ConnectedNICConfig.DomainDNSRegistrationEnabled
}

# De gebruikte netwerkinterface configureren we op een Dynamisch IP-adres en ook de DNS servers worden van de interface verwijderd
$ConnectedNICConfig.SetDNSServerSearchOrder() | Out-Null
$ConnectedNICConfig.EnableDHCP() | Out-Null

<#
De Intel NICs worden opgehaald op basis van de waarde van 'DeviceStatus':
1 = Ingeschakeld en verbonden
2 = Ingeschakeld en niet verbonden
#>
$ConnectedIntelNICs = Get-IntelNetAdapter | Where {$_.DeviceStatus -eq 1}

<# Maak een nieuwe team met de ingeschakelde en verbonden interfaces en geef deze de naam "<COMPUTERNAAM>_Team" en configureer dit team voor de modus "Static Link Aggregation". Andere mogelijke Team modi zijn:
AdapterFaultTolerance
AdaptiveLoadBalancing
StaticLinkAggregation
IEEE802_3adDynamicLinkAggregation
SwitchFaultTolerance
VirtualMachineLoadBalancing
#>
New-IntelNetTeam -TeamMembers $ConnectedIntelNICs -TeamMode StaticLinkAggregation -TeamName "$($env:COMPUTERNAME)_Team"

# Haal de configuratie op van het nieuwe NIC Team op basis van de naam 'Local Area Connection' (kan uiteraard verschillen per omgeving)
$TeamNIC = Get-WMIObject Win32_NetworkAdapter -Filter {NetConnectionID="Local Area Connection"}
$TeamNICConfig = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "Index=$($TeamNIC.Index)"

# Configureer vervolgens de Team interface met de IP configuratie
$_Result = $TeamNICConfig.EnableStatic($NICConfig.IPAddress, $NICConfig.IPSubnet)
Write-Output "Team NIC IP resultaat: $($_Result.ReturnValue)"
$_Result = $TeamNICConfig.SetGateways($NICConfig.DefaultIPGateway)
Write-Output "Team NIC Gateway resultaat: $($_Result.ReturnValue)"

# Wacht een korte tijd voor de DNS Instellingen kunnen worden ingesteld (deze is afhankelijk van de IP configuratie) en haal dan nog een keer de configuratie van de NIC op
Write-Host "Waiting 30 seconds for enabling new IP Configuration" -NoNewline
for($i= 0;$i -lt 30;$i++){
 Start-sleep -Seconds 1
 Write-Host "." -NoNewline
}
Write-Host "finished!`r`n"
$TeamNICConfig = Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "Index=$($TeamNIC.Index)"

# Configureer vervolgens de Team interface met de DNS instellingen 
$_Result = $TeamNICConfig.SetDNSServerSearchOrder([string[]]$NICConfig.DNSServerSearchOrder)
Write-Output "Team NIC DNS Servers resultaat: $($_Result.ReturnValue)"
$_Result = $TeamNICConfig.SetDNSDomain($NICConfig.DNSDomain)
Write-Output "Team NIC DNS Domain resultaat: $($_Result.ReturnValue)"
$_Result = $TeamNICConfig.SetDynamicDNSRegistration($NICConfig.DomainDNSRegistrationEnabled)
Write-Output "Team NIC DNS Registration resultaat: $($_Result.ReturnValue)"