Server List
Server list report
Desktop OSes like Windows XP, Vista, 7, 8, 10, Mac OS X have been removed from the list
#AD Server list #By default the password for the computer object is reset every 30 days #pwdLastSet attribute is replicated to all Domain Controllers $StartTime = Get-Date $ServersFile= "C:\scripts\Output\Servers.csv" $smtpServer = "smtp" $To = "Kevin Curran <kcurran@blah.com>"
$From = "Kevin Curran <kcurran@blah.com>"
Function check-even ($num) {[bool]!($num%2)} $counter = $null $computers = Get-ADComputer -filter * -Properties pwdlastset, Description, operatingSystem, operatingSystemServicePack, pwdLastSet, whenCreated, CanonicalName $computers = $computers | select Name, OperatingSystem, OperatingSystemServicePack, whenCreated, @{n="pwdLastSet";e={[Datetime]::FromFileTime($_.pwdLastSet)}}, @{n="OU";e={$_.CanonicalName -Replace '/[^/]*$',''}} $Servers = $Computers | where {$_.OperatingSystem -notlike "*XP*" -and $_.OperatingSystem -notlike "Windows 7*" -and $_.OperatingSystem -notlike "Windows 8*" -and $_.OperatingSystem -notlike "Windows 10*" -and $_.OperatingSystem -notlike "Windows Vista*" -and $_.OperatingSystem -notlike "Mac OS X"} $TotalServers = $Servers.count $ServersCountsByOS = $Servers | Group-Object -property OperatingSystem | sort count -desc | select count,name # foreach ($machine in $Servers) # { # $counter ++ # $DNS = $null # write-host "$counter of $TotalServers testing connection to $($machine.name)" # $DNS = [System.Net.Dns]::GetHostByName($machine.name) # If ($DNS) { # $machine | Add-Member -membertype noteproperty -name IPs -Value ` # $([String]::Join(" ",$($DNS.AddressList.IPAddressToString))) # $machine | Add-Member -membertype noteproperty -name Pingable -Value $(Test-Connection -Quiet -Count 1 -ComputerName $machine.name) # #need to catch error "No such host is known" # } # } $Servers | Export-Csv -NoTypeInformation $ServersFile $StopTime = Get-Date $ElapsedTime =$StopTime - $StartTime Write-host "Script completed in $([Math]::Round($ElapsedTime.TotalSeconds,0)) Seconds `r`n" #need to create this an empty array so it will not be treated as 1 line string an break the ModifiedHTML function $message = @() $message = $message + "The attached list of servers was pulled from AD <br>" $message = $message + "Desktop OSes like Windows XP, Vista, 7, 8, 10, Mac OS X have been removed from the list <br>" $message += $ServersCountsByOS | ConvertTo-Html -Fragment -PreContent "<H2>Counts of Servers by OS </H2>" | ForEach-Object {$_} $ModifiedHTML=ForEach ($line in $Message) { $counter++ if (check-even $counter) {$line.replace('<tr><td>','<tr class="d0"><td>')} Else {$line.replace('<tr><td>','<tr class="d1"><td>')} } $PreMessage = @" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>HTML TABLE</title> <style type="text/css"> TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;} TH{border-width: 1px;padding: 1px;border-style: solid;border-color: black;background-color:MidnightBlue; color:Yellow;} TD{border-width: 1px;padding: 1px;border-style: solid;border-color: black;} TR.D0 TD {background-color: White; } TR.D1 TD {background-color: LawnGreen; } <!-- This nth-child CSS does not seem to be processed by email clients --> tr:nth-child(odd) {background-color: White;} tr:nth-child(even) {background-color: LawnGreen;} </style> </head><body> "@ $PostMessage = "<br>This script was run by " + $env:username + " on " + $env:COMPUTERNAME $PostMessage += "<br>Script completed in $([Math]::Round($ElapsedTime.TotalMinutes,0)) Minutes" $PostMessage += "<br>ScriptName: $($MyInvocation.MyCommand) " $PostMessage += "<br>Script path: $(Split-Path -Parent $MyInvocation.MyCommand.Path)" $PostMessage += "</body></html>" $html = $PreMessage + $($ModifiedHTML | out-string) + $PostMessage #Send Email Send-MailMessage -From $From -To $To -SmtpServer $smtpServer ` -Subject "AD Server list" -BodyAsHtml $html -Attachments $ServersFile