So parameters are :
- computername
- remote credentials
- network address
- network mask
Download the dar
Here is the code :
param( [Parameter(Mandatory=$true,HelpMessage="Computername")] [string]$ComputerName, [Parameter(Mandatory=$true,HelpMessage="Credential name to make a remote connection")] [string]$CredentialName, [Parameter(Mandatory=$true,HelpMessage="Network adddress")] [string]$NetworkAddress, [Parameter(Mandatory=$true,HelpMessage="Subnet mask")] [string]$SubnetMask ) # helper functions to work with ipaddresses function Get-NetworkAddress { param ( [IpAddress]$ip, [IpAddress]$Mask ) $IpAddressBytes = $ip.GetAddressBytes() $SubnetMaskBytes = $Mask.GetAddressBytes() if ($IpAddressBytes.Length -ne $SubnetMaskBytes.Length) { throw "Lengths of IP address and subnet mask do not match." exit 0 } $NetworkAddressParts = @() for ($i=0;$i -le 3;$i++) { $NetworkAddressParts += $ipAddressBytes[$i]-band $subnetMaskBytes[$i] } $NetworkAddressString = $NetworkAddressParts -Join "." return [IpAddress]$NetworkAddressString } function Test-IsInSameSubnet { param ( [IpAddress]$ip1, [IpAddress]$ip2, [IpAddress]$mask1, [IpAddress]$mask2 ) $Network1 = Get-NetworkAddress -ip $ip1 -mask $mask1 $Network2 = Get-NetworkAddress -ip $ip2 -mask $mask2 return $Network1.Equals($Network2) } # remote function to get manufacturere function getManufacturer(){ return Invoke-Command -Session $session -ScriptBlock {(Get-WmiObject -Class Win32_ComputerSystem).Manufacturer} } # remote function to get all ipaddresses function getIpAddresses(){ return Invoke-Command -Session $session -ScriptBlock { [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() ` | ForEach-Object { $_.GetIPProperties() } ` | Select-Object -ExpandProperty 'UnicastAddresses'; } } $ErrorActionPreference = "stop" try{ # get credentials $mycreds = Get-WfaCredentials $CredentialName # create remote ps session $session = New-PSSession -ComputerName $ComputerName -Credential $mycreds # is vm ? Set required interface counts $manufacturer = getManufacturer $isVm = $false $requiredVserverAddresses = 2 if($manufacturer -match 'VMWare'){ Get-WfaLogger -info -message "[Host] This is a vm [$ComputerFQDN]" $requiredHostAddresses = 1 }else{ Get-WfaLogger -info -message "[Host] This is a physical machine [$ComputerFQDN]" $requiredHostAddresses = 2 } # has iscsi ip ? $iscsiIpList = @() $iscsiConnectionList = @() $ipAddresses = getIpAddresses # loop every ipaddres and check if in iscsi range foreach($ip in $IpAddresses){ if($ip.IPv4Mask -ne "0.0.0.0"){ if(Test-IsInSameSubnet -ip1 $ip.Address -ip2 $NetworkAddress -mask1 $ip.IPv4Mask -mask2 $SubnetMask){ Get-WfaLogger -info -message "[host] IP $($ip.Address) is an iscsi address" $iscsiIpList+=($ip.Address.IPAddressToString) } } } # stop if iscsi count mismatch if($iscsiIpList.Count -ne $requiredHostAddresses){ Get-WfaLogger -info -message "[Host] Expected iscsi addresses [$requiredHostAddresses]" Get-WfaLogger -info -message "[Host] Found iscsi addresses [$($iscsiIpList.Count)]" throw "[Host] iscsi IpAddress count mismatch" }else{ Get-WfaLogger -info -message "[Host] iscsi IpAddress count correct [$requiredHostAddresses]" } }catch{ throw $_.Exception }finally{ try{ $out = Disconnect-PSSession $session -EA SilentlyContinue $out = Remove-PSSession $session -EA SilentlyContinue }catch{ } }
No comments :
Post a Comment