2017-08-22 Monitor Hostname IP change
Here’s a really simple but useful script to monitor hostnames for IP addresse change.
Usage
Settings
First you have to adjust the settings variables to your needs
$hosts_csv_path = "C:\Temp\hosts.csv"
$LogPath = "c:\Logs\"
$email_props = @{
SMTP = "192.168.1.1"
From = "$env:computername@domain.com"
To = "email.to@domain.com"
}
Init
Then run the script – it will end with an error, but will load Resolve-Host function and set variables Then run
PS > Resolve-Host -HostName HostNameToMonitor |
Export-Csv -Path $hosts_csv_path -Encoding UTF8
Or to add another hostname to monitor
PS > Resolve-Host -HostName AnotherHostname |
Export-Csv -Path $hosts_csv_path -Encoding UTF8 -Append
Run
Now with the initial start you can schedule the script and wait for an email when an IP of a hostname changes.
Script
The main function Resolve-Host returns all IP addresses of a hostname
function Resolve-Host {
param($HostName)
BEGIN {
Write-verbose "In function Resolve-Host"
}
PROCESS {
Write-Verbose "$hostName"
$host_ips = [System.Net.Dns]::GetHostAddresses("$hostName")
if ($?) {
foreach ($host_ip in $host_ips) {
Write-Verbose " $($host_ip.ipaddresstostring)"
[pscustomobject][ordered]@{
HostName = $hostName
IP = $host_ip.ipaddresstostring
Date = Get-Date -Format ("yyyy-MM-dd")
}
}
}
}
}
Import from a csv all previous hostnames and IP addresses.
$hosts_csv = Import-Csv $hosts_csv_path -ErrorVariable +my_error
Group them by hostname and call Resolve-Host foreach hostname. Foreach result from Resolve-Host it checks if the IP is already on the list. If not then it is added.
$host_list = $hosts_csv | Group-Object -Property hostname -ErrorVariable +my_error
$results = foreach ($host_single in $host_list) {
$hostname = $host_single.Name
$query = Resolve-Host -HostName $hostname
if ($query) {
foreach ($row in $query) {
if (!($host_single.group.ip -contains $row.ip)) {
$row
Write-Verbose " Add $($row.ip)"
} else {
Write-Verbose " Skip $($row.ip)"
}
}
}
}
In the end if something new was found an email is sent and results added to CSV.
if ($results) {
Write-Verbose "Send mail with results"
Send-MailMessage @email_props -Subject "Hostname IP change" -Body $(
($results | ForEach-Object {"$($_.ip) $($_.hostname)"}) -join "`n")
Write-Verbose "Export results"
$results | Export-Csv -Append $hosts_csv_path -NoTypeInformation -Encoding utf8 -ErrorVariable +my_error
}
Source code
Source code on GitHubGist
Leave a Comment