by davids at 2012-09-24 17:31:08
Hi,by davids at 2012-09-24 19:27:03
I need some help changing this script so that it meets my needs.
I need for it to use an array of servers, try to do the TCP connect to port 3389 so that I know RDP (actually Terminal Services) is working and then build up a report like below that is emailed to me.
----------Example Report----------------
Server | RDPStatus
Server1 | OK
Server2 | FAIL
---------script-----------------------
[code2=powershell]$port = 3389
$ErrorActionPreference = "SilentlyContinue"
foreach ($target in $args) {
new-object System.Net.Sockets.TcpClient($target, $port) -ErrorVariable sockErr | out-null
if ($sockerr) {
write-host "FAIL $target"
} else {
write-host "OK $target"
}
}[/code2]
OK. So I think I’m getting closer.by RichardSiddaway at 2012-09-25 02:58:52
This emails me a message, but the body only contains the text of System.Collections.Hashtable
[code2=powershell]$servers = "dfcu-ptrm13","dfcu-ptrm14","dfcu-ptrm16","dfcu-ptrm17","dfcu-ptrm18","dfcu-ptrm19","dfcu-ptrm20","dfcu-ptrm21","dfcu-ptrm22","dfcu-ptrm23","dfcu-ttrm1","dfcu-psun"
$MailFrom = "scriptaccount@workemail.com"
$Mailto = "me@myworkemail.com"
$EmailSubject = "Remote Desktop Port Open Test"
$smtpServer = "mysmtpserver"
$Mailtext = @{}
$port = 3389
$ErrorActionPreference = "Continue"
$RDPping = @{}
$data = New-Object PSObject -Property @{ Computername = "Computername" ; IP = "IP" ; Status = "Status" ; }
$data.Computername="$target"
foreach ($target in $servers) {
$reachable = new-object System.Net.Sockets.TcpClient($target, $port) -ErrorVariable sockErr | out-null
if($reachable)
{
$IPAddress = [System.Net.Dns]::GetHostAddresses($.Name)|select-object IPAddressToString -expandproperty IPAddressToString
$data.Status = "OK"
}
else
{
$data.Status = "FAIL"
}
#if ($sockerr) {
#write-host "FAIL $target"
#$data.Status = "FAIL"
#$RDPping = $RDPping , $data
#} else {
#write-host "OK $target"
#$data.Status = "OK"
#$RDPping = $RDPping , $data
#}
New-Object -TypeName PSObject -Property @{
SystemName = $
Reachable = $reachable
IPAddress = $IPAddress
} | Select-Object SystemName,Reachable,IPAddress | Export-Csv -Path C:\export.csv
}
$Mailtext = $RDPping + $Date
$Date = Get-Date
send-Mailmessage -To $MailTo -From $MailFrom -Subject $EmailSubject -SmtpServer $smtpServer -Body ($Mailtext)[/code2]
Try changing toby davids at 2012-09-25 15:58:47
-Body $($Maitext)
OK. So I changed the script to as below:by poshoholic at 2012-09-26 19:21:44
[code2=powershell]$servers = "dfcu-ptrm13","dfcu-ptrm14","dfcu-ptrm16","dfcu-ptrm17","dfcu-ptrm18","dfcu-ptrm19","dfcu-ptrm20","dfcu-ptrm21","dfcu-ptrm22","dfcu-ptrm23","dfcu-ttrm1","dfcu-psun"
$MailFrom = "scriptaccount@abc.com"
$Mailto = "me@abc.com"
$EmailSubject = "Remote Desktop Port Open Test"
$smtpServer = "abcsmtpserver"
$port = 3389
$ErrorActionPreference = "Continue"
$RDPping = @{}
$data = New-Object PSObject -Property @{ Computername = "Computername" ; IP = "IP" ; Status = "Status" ; }
$data.Computername="$target"
foreach ($target in $servers) {
$reachable = new-object System.Net.Sockets.TcpClient($target, $port) -ErrorVariable sockErr | out-null
if($reachable)
{
#$IPAddress = [System.Net.Dns]::GetHostAddresses($.Name)|select-object IPAddressToString -expandproperty IPAddressToString
$data.Status = "OK"
$RDPping = $RDPping , $data
}
else
{
$data.Status = "FAIL"
$RDPping = $RDPping , $data
}
}
$Mailtext = $RDPping | Select Computername,IP,Status | Out-String
#$Date = Get-Date
send-Mailmessage -To $MailTo -From $MailFrom -Subject $EmailSubject -SmtpServer $smtpServer -BodyAsHtml $($Mailtext)[/code2]
What I get in the email body is:
[code2=plain]Computername IP Status ------------ – ------ dfcu-psun IP FAIL[/code2]
This is not what I was expecting.
Try switching from:by davids at 2012-10-03 19:23:21Send-MailMessage … -BodyAsHtml $($MailText)
to:Send-MailMessage … -Body $MailText
Or if you want an HTML email message, you could do this instead:$MailHtml = $RDPPing | Select ComputerName,IP,Status | ConvertTo-Html -Fragment
Send-MailMessage … -BodyAsHtml $MailHtml
OK. So I was still having problems so I changed and I’m now trying to use Chad’s script from http://poshcode.org/85by poshoholic at 2012-10-04 06:16:52
All I’m doing is building an array of computer names and then running
[code2=powershell]$NewTermServ | %{.\Test-Port.ps1}[/code2]
True
True
True
True
True
True
True
True
Can anyone advise me how I can get the name of the server to appear as well?
For example:
Name RDPConnect
Server1 True
Server2 True
by davids at 2012-10-04 17:50:48$NewTermServ | ForEach-Object {
New-Object PSObject -Property @{
Name = $
RDPConnect = $_ | .\Test-Port.ps1
}
}
Or, if you’re using PowerShell 3, you can do it this way:$NewTermServ | ForEach-Object {
[pscustomobject]@{
Name = $
RDPConnect = $ | .\Test-Port.ps1
}
}
Thanks Kirk. That works perfectly.