Network
Get IPs for a list of hostnames (nslookup)
http://blogs.msdn.com/b/powershell/archive/2006/06/26/647318.aspx
http://dmitrysotnikov.wordpress.com/2008/03/07/get-computer-by-ip-address/
$serverList= Get-QADComputer blah* | select name foreach ($server in $serverlist) { $IP= $([System.Net.Dns]::GetHostAddresses("$($server.name)")).IPAddressToString $Server | Add-Member -membertype noteproperty -name IPAddress -Value $IP #$IP=$null } $serverlist
$serverlist | where {$_.IPAddress -like "192.168.3.*"}
Get Subnet ID split IP Address
$ServerList = Import-Csv C:\scripts\AllServers.csv foreach ($Server in $ServerList) { $Subnet=$null $Subnet=($Server."IP Address").split(".") #Lazy assuming class c set 4th octet to 0 $Subnet[3]=0 $Subnet = $Subnet -join "." $Server | Add-Member -MemberType NoteProperty -Name "Subnet" -Value $subnet }
$ServerList | select "device name", subnet | group -Property subnet
Stale DNS records
http://www.indented.co.uk/index.php/2008/10/10/microsoft-dns-stale-records/
Count IP Address returned by dns
http://msdn.microsoft.com/en-us/library/system.net.dns.aspx
http://msdn.microsoft.com/en-us/library/system.net.dns.gethostentry.aspx
([System.Net.Dns]::GetHostAddresses("mypc")).count ([System.Net.Dns]::GetHostAddresses("www.google.com")).count
Count only IPV4 Addresses
([System.Net.Dns]::GetHostAddresses("www.google.com") | where {$_.AddressFamily -eq "InterNetwork"}).count
Count for each name in a list
$machinelist = "www.google.com","www.yahoo.com","www.cnn.com" foreach ($machine in $machinelist) { #Sometimes count does not return a value for the line bellow I don't understand why seems like #it does not work if only 1 IP is returned #$DNSIPV4Count = ([System.Net.Dns]::GetHostAddresses($machine) | where {$_.AddressFamily -eq "InterNetwork"}).count $DNSIPV4Count = [System.Net.Dns]::GetHostAddresses($machine) | where {$_.AddressFamily -eq "InterNetwork"} | measure write-host $machine $DNSIPV4Count.Count }
Get FQDN
[System.Net.Dns]::GetHostByName("www.google.com")
Get FQDN
[System.Net.Dns]::GetHostEntry("www.google.com")
Check-Host - modified to create an object instead of write-host
Why does my new object have extra blank lines that I don't want?
http://www.kgk.gr/2011/10/16/powershell-clrscr/
function Check-Host { [CmdletBinding()] Param( [Parameter(Mandatory=$True, HelpMessage="Computer Name")][String]$ComputerName ) $HostInfo = {} | Select "FQDN","IP Addresses","Pingable","WMI Computer Name","WMI Computer Domain", "WMIOSInstallDate","MatchingNames","Uptime Text","Uptime" $DNS = [System.Net.Dns]::GetHostByName($ComputerName) $IPAddress = $DNS.AddressList[0].IPAddressToString $Pingable=$(Test-Connection -Quiet -count 2 -ComputerName $IPAddress) $HostInfo.FQDN = $($DNS.HostName) $HostInfo."IP Addresses" = $($DNS.AddressList) $HostInfo.Pingable = $Pingable If($Pingable) { $WMIOS = Get-WmiObject -ErrorVariable WMIError -ErrorAction SilentlyContinue -Class win32_operatingsystem -ComputerName $IPAddress #If there was no error running the previouse line (wmi connection) do this wmi connection too If($?) { $HostInfo."WMI Computer Name" = $($WMIOS.CSName) $HostInfo."WMI Computer Domain" = $(Get-WmiObject -Class win32_Computersystem -ComputerName $IPAddress).Domain $Uptime = $WMIOS.ConvertToDateTime($WMIOS.LocalDateTime) - $WMIOS.ConvertToDateTime($WMIOS.LastBootUpTime) $HostInfo.WMIOSInstallDate = (([WMI]'').ConvertToDateTime($WMIOS.InstallDate)).tostring() $HostInfo."Uptime Text"= "$($Uptime.Days) Days $($Uptime.Hours) Hours $($Uptime.Minutes) Minutes" $HostInfo.Uptime = $Uptime } #Test if the original computer name matches the name returned by WMI at that IP address if so "True" otherwise #return the WMI errer if it exists or False if not $HostInfo.MatchingNames = IF ($ComputerName -eq $WMIOS.CSName) {$true} ElseIf ($WMIError) { $ErrorString = "$WMIError" If($ErrorString -like '*Access is denied*'){"WMI Error - Access is denied"} ElseIf($ErrorString -like '*OutOfMemoryException*'){"WMI Error - OutOfMemoryException"} ElseIf($ErrorString -like '*Server execution failed*'){"WMI Error - Server execution failed"} ElseIf($ErrorString -like '*RPC server is unavailable*'){"WMI Error - RPC server is unavailable"} ElseIf($ErrorString -like '*Not Found*'){"WMI Error - Not Found"} Else { #return the errorstring to MathingName variable and write the new WMI error to a log file $ErrorString #$WMIError | Out-File .\$($ComputerName)_error.txt } } Else {$false} } $HostInfo <# .synopsis quick health check on a host validate it is in DNS, Pingable and the Name of that machine matches the input computername and checks host uptime .description Check host .PARAMETER ComputerName specify the Computer Name .example Check-Host -ComputerName Server01 .example Check-Host Server01 .Link http://www.google.com #> }
Import remote modules
http://blogs.technet.com/b/ashleymcglone/archive/2013/06/27/how-to-use-the-2012-active-directory-cmdlets-from-windows-7.aspx
$ses = New-PSSession -ComputerName Server1 Import-Module DNSServer,DNSClient,NetTCPIP -PSSession $ses
DNS Querries
function Get-HostLookup { [CmdletBinding()] Param( [parameter(Mandatory = $true)] [string] $DomainName=$(throw '$DomainName is required') ) $HostLookup= $([System.Net.Dns]::GetHostentry("$($DomainName)")) Return $HostLookup }
View Client DNS Cache
https://gallery.technet.microsoft.com/scriptcenter/ad12dc1c-b0c7-44d6-97c7-1a537b0b4fef
Function Get-DNSClientCache{ $DNSCache = @() Invoke-Expression "IPConfig /DisplayDNS" | Select-String -Pattern "Record Name" -Context 0,5 | %{ $Record = New-Object PSObject -Property @{ Name=($_.Line -Split ":")[1] Type=($_.Context.PostContext[0] -Split ":")[1] TTL=($_.Context.PostContext[1] -Split ":")[1] Length=($_.Context.PostContext[2] -Split ":")[1] Section=($_.Context.PostContext[3] -Split ":")[1] HostRecord=($_.Context.PostContext[4] -Split ":")[1] } $DNSCache +=$Record } return $DNSCache }
Test port access
try {
$socket = new-object Net.Sockets.TcpClient
$socket.Connect('google.com',80)
$socket.Connected
}
catch [system.exception] {
'False'
}