I wrote a very simple PowerShell workflow to solve an issue on one particular environment. The problem was that system administrators thought that it is a good idea to disable IPv6 protocol on all NICs on all servers.
Disabling IPv6 protocol is a very bad practice.
- This will not disable IPv6.
- Microsoft does not tests this scenario so a lot of weird things can happen in such environment.
Possibilities
- It is possible to use the Workflow on local server or against multiple remote servers (parallel processing).
- It is possible to get only a report of the current status. You should do that before you do enable or disable action.
- It is possible to enable or disable IPv4 or IPv6 (I hope you will never use it do disable IPv6) or to enable all IP protocols
Examples
Get report for all servers in the specified OU
$servers = Get-ADComputer ` -Filter * ` -SearchBase 'OU=Servers,OU=Contoso headquarters,DC=ad1,DC=contoso,DC=com' | Select-Object -ExpandProperty Name Set-VNetAdapterIPProtocol ` -Process Report -PSComputerName $servers | Out-GridView
Enable all IP protocols on the specified servers and export results
Set-VNetAdapterIPProtocol ` -Process EnableIPv4andIPv6 ` -PSComputerName cont2test0, cont2test1, cont2test2 | Export-Csv ` -Path C:\Temp\MyReport.csv ` -Delimiter "`t" ` -Encoding UTF8 ` -NoTypeInformation
Code
Workflow Set-VNetAdapterIPProtocol { <# .SYNOPSIS Report or modify status (enabled or disabled) of IP protocol (IPv4 or IPv6) on a single device or on multiple (in parallel). .DESCRIPTION Developer Developer: Rudolf Vesely, http://rudolfvesely.com/ Copyright (c) Rudolf Vesely. All rights reserved License: Free for private use only "V" is the first letter of the developer's surname. The letter is used to distingue Rudolf Vesely's cmdlets from the other cmdlets. Description Report or modify status (enabled or disabled) of IP protocol (IPv4 or IPv6) on a single device or on multiple (in parallel). Requirements Developed and tested using PowerShell 4.0. .PARAMETER Process Action that should be done. .EXAMPLE 'Get report for all servers in the specified OU' $servers = Get-ADComputer ` -Filter * ` -SearchBase 'OU=Servers,OU=Contoso headquarters,DC=ad1,DC=contoso,DC=com' | Select-Object -ExpandProperty Name Set-VNetAdapterIPProtocol ` -Process Report -PSComputerName $servers ` -Verbose | Out-GridView .EXAMPLE 'Enable all IP protocols on the specified servers and export results' Set-VNetAdapterIPProtocol ` -Process EnableIPv4andIPv6 -PSComputerName cont2test0, cont2test1, cont2test2 ` -Verbose | Export-Csv ` -Path C:\Temp\MyReport.csv ` -Delimiter "`t" ` -Encoding UTF8 ` -NoTypeInformation .INPUTS .OUTPUTS System.Management.Automation.PSCustomObject .LINK https://techstronghold.com/ #> [CmdletBinding( DefaultParametersetName = 'Process', HelpURI = 'https://techstronghold.com/', ConfirmImpact = 'Medium' )] Param ( [Parameter( Mandatory = $false, Position = 0, ParameterSetName = '' )] [ValidateSet( 'Report', 'EnableIPv4', 'DisableIPv4', 'EnableIPv6', 'DisableIPv6', 'EnableIPv4andIPv6' )] [string]$Process = 'Report' ) $ErrorActionPreference = 'Stop' InlineScript { try { Get-NetAdapter -ErrorAction Stop | ForEach-Object -Process ` { try { $ipv4Status = ($_ | Get-NetAdapterBinding -ComponentID 'ms_tcpip').Enabled $ipv6Status = ($_ | Get-NetAdapterBinding -ComponentID 'ms_tcpip6').Enabled if ($ipv4Status -and $Using:Process -eq 'DisableIPv4') { Write-Warning -Message 'Disable: IPv4' $ipv4Status = ($_ | Disable-NetAdapterBinding -ComponentID 'ms_tcpip' -PassThru).Enabled } elseif (!$ipv4Status -and $Using:Process -match 'EnableIPv4|EnableIPv4andIPv6') { Write-Warning -Message 'Enable: IPv4' $ipv4Status = ($_ | Enable-NetAdapterBinding -ComponentID 'ms_tcpip' -PassThru).Enabled } if ($ipv6Status -and $Using:Process -eq 'DisableIPv6') { Write-Warning -Message 'Disable: IPv6' $ipv6Status = ($_ | Disable-NetAdapterBinding -ComponentID 'ms_tcpip6' -PassThru).Enabled } elseif (!$ipv6Status -and $Using:Process -match 'EnableIPv6|EnableIPv4andIPv6') { Write-Warning -Message 'Enable: IPv6' $ipv6Status = ($_ | Enable-NetAdapterBinding -ComponentID 'ms_tcpip6' -PassThru).Enabled } # Return [PsCustomObject]@{ ComputerName = $env:COMPUTERNAME Name = $interfaceItem.Name Index = $interfaceItem.ifIndex MacAddress = $interfaceItem.MacAddress IPv4Status = $ipv4Status IPv6Status = $ipv6Status Error = $false ErrorDescription = $null } } catch { # Return [PsCustomObject]@{ ComputerName = $env:COMPUTERNAME Name = $interfaceItem.Name Index = $interfaceItem.ifIndex MacAddress = $interfaceItem.MacAddress IPv4Status = $null IPv6Status = $null Error = $true ErrorDescription = ('Exception during trial to process network adapter: {0}' -f $_.Exception.Message) } } } } catch { # Return [PsCustomObject]@{ ComputerName = $env:COMPUTERNAME Name = $null Index = $null MacAddress = $null IPv4Status = $null IPv6Status = $null Error = $true ErrorDescription = ('Exception during trial to get network adapters: {0}' -f $_.Exception.Message) } } } }