# PRTG Exchange Metrics # # Calculates various metrics about Exchange Counters and can be run on a long term base # - Number of Mailboxes, Romm. Ressource # - Number of EAS Device # (Performance 7sec für 1500 devices get-activesyncdevice # (Performance für Age is much lower 5min für 1466 Devices !!! # # To reduce load, the program will store the last Runtime and Results in a file and Update them only once every hour # multiple PRTG Sensors can start the samt program and choose the channels by parameter # # Load last 5 Minutes from Messagestatistics and result as XML für PRTG # http://www.paessler.com/manuals/prtg/additional_sensor_types.htm # http://www.paessler.com/manuals/prtg/exe_script_advanced_sensor.htm # # 32bit PowerShell !!! # Set-ExecutionPolicy -ExecutionPolicy remotesigned # # 20121203 Ver1.0 Initial Version # 20121204 Ver1.1 Cleanup, adding mbsize # 20150325 Ver1.2 Handling für empty names param ( [string]$mode= "", # specify mode [string]$mb="" # Optional Mailboxlist ) write-host "Start PRTG Sensor" [string]$exchangeuri = "http://nawex001.netatwork.de/PowerShell" if (($mode -eq "") -or ($mode -eq $null)) { write-host "no argument given Exit" } else { if (!(Get-Command "Get-OrganizationConfig" -errorAction SilentlyContinue)) { $error.removerange(0,1) # remove last error write-host " Creating Exchange Remote Session" $session = new-pssession ` -ConfigurationName "Microsoft.Exchange" ` -ConnectionUri $exchangeuri ` -Authentication Kerberos write-host " Import Exchange Remote Session Commandlets" import-pssession -Session $session -AllowClobber | out-null } Set-AdServerSettings -ViewEntireForest $true $result="`r`n" if ($mode -eq "EASSTATE") { $Devicelist = Get-ActiveSyncDevice -resultsize unlimited foreach ($entry in ($Devicelist | group DeviceAccessState)){ $result+=" `r`n" if ($entry.name.trim()-eq "") { $result+=" NoName`r`n" } else { $result+=" "+$entry.name+"`r`n" } $result+=" "+$entry.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" } $result+=" `r`n" $result+=" Total`r`n" $result+=" "+$devicelist.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+="ExMetrics done:"+$arg+"`r`n" } elseif ($mode -eq "EASTYPE") { write-host "EASTYPE: Loading ActiveSyncDevice" $Devicelist = Get-ActiveSyncDevice -resultsize unlimited foreach ($entry in ($Devicelist | group Devicetype)){ $result+=" `r`n" $result+=" "+$entry.name+"`r`n" $result+=" "+$entry.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" } $result+=" `r`n" $result+=" Total`r`n" $result+=" "+$devicelist.count+"`r`n" $result+=" Count`r`n" $result+=" 0" $result+=" 1" $result+=" Absolute`r`n" $result+=" `r`n" $result+="ExMetrics done:"+$arg+"`r`n" } elseif ($mode -eq "EASOPERATOR") { write-host "EASOPERATOR: Loading ActiveSyncDevice" $Devicelist = Get-ActiveSyncDevice -resultsize unlimited -erroraction silentlycontinue foreach ($entry in ($Devicelist | group DeviceMobileOperator)){ $result+=" `r`n" $result+=" "+$entry.name+"`r`n" $result+=" "+$entry.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" } $result+=" `r`n" $result+=" Total`r`n" $result+=" "+$devicelist.count+"`r`n" $result+=" Count`r`n" $result+=" 0" $result+=" 1" $result+=" Absolute`r`n" $result+=" `r`n" $result+="ExMetrics done:"+$arg+"`r`n" } elseif ($mode -eq "EASAGE") { write-host "EASAGE:Loading ActiveSyncDevice" $Devicelist = Get-ActiveSyncDevice -resultsize unlimited -erroraction silentlycontinue $deviceage = ($Devicelist | Get-ActiveSyncDevicestatistics -erroraction silentlycontinue) $older30d = 0; $last30d = 0 ; $Last7d = 0 ; $Last24h=0; $ageunknown=0 $currenttimestamp = (get-date) foreach ($entry in ($deviceage)){ try { $age = ($currenttimestamp - $entry.LastSuccessSync).totaldays } catch { $ageunknown+=1 } if ($age -lt 1) { $Last24h+=1} elseif ($age -lt 7) { $Last7d+=1} elseif ($age -lt 30) { $Last30d+=1} else {$older30d+=1} } $result+=" `r`n" $result+=" Last24h`r`n" $result+=" "+$Last24h+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+=" `r`n" $result+=" Last7d`r`n" $result+=" "+$Last7d+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+=" `r`n" $result+=" Last30d`r`n" $result+=" "+$last30d+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+=" `r`n" $result+=" older30d`r`n" $result+=" "+$older30d+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+=" `r`n" $result+=" Unknown`r`n" $result+=" "+$ageunknown+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+=" `r`n" $result+=" Total`r`n" $result+=" "+$deviceage.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+="ExMetrics done:"+$arg+"`r`n" } elseif ($mode -eq "DBUserCOUNT") { write-host "DBUserCount: Loading Mailboxlist" $mblist = Get-Mailbox -resultsize unlimited foreach ($entry in ($mblist | group database )){ $result+=" `r`n" $result+=" "+$entry.name+"`r`n" $result+=" "+$entry.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" } $result+=" `r`n" $result+=" Total`r`n" $result+=" "+$mblist.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+="ExMetrics done:"+$arg+"`r`n" } elseif ($mode -eq "DBSIZE") { write-host "DBSIZE: Loading Mailboxdatabaselist with status" $dblist = Get-MailboxDatabase -Status | select ServerName,Name,DatabaseSize foreach ($entry in ($dblist)){ $result+=" `r`n" # remote PowerShell sends a string instead of gb value so converting back $result+=" "+$entry.name+"`r`n" $result+=" "+([int](($entry.databasesize.split("(")[0]).replace(" ","")/1GB))+"`r`n" $result+=" GB`r`n" $result+=" Absolute`r`n" $result+=" `r`n" } $result+="ExMetrics done:"+$arg+"`r`n" } elseif ($mode -eq "maildomain") { write-host "MailDomain:Loading Mailbox List" $mblist = Get-Mailbox -resultsize unlimited foreach ($entry in ($mblist | %{($_.primarysmtpaddress.split("@")[1])} | group)){ $result+=" `r`n" $result+=" "+$entry.name+"`r`n" $result+=" "+$entry.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" } $result+=" `r`n" $result+=" Total`r`n" $result+=" "+$mblist.count+"`r`n" $result+=" Count`r`n" $result+=" Absolute`r`n" $result+=" `r`n" $result+="ExMetrics done:"+$arg+"`r`n" } elseif ($mode -eq "mbsize") { write-host "MBSize List:" $mb if ($mb.contains(" ")) {write-host " Splitting by space"; $mblist = $mb.split(" ")} elseif ($mb.contains(",")) {write-host " Splitting by ,"; $mblist = $mb.split(",")} elseif ($mb.contains(";")) {write-host " Splitting by ;"; $mblist = $mb.split(";")} else { write-host " SingleItem"; $mblist=$mb} foreach ($mailbox in $mblist){# write-host "Processing Mailbox:$mailbox" $size = (get-mailboxstatistics -identity $mailbox).totalitemsize $result+=" `r`n" $result+=" "+$mailbox+"`r`n" # remote PowerShell sends a string instead of gb value so converting back $result+=" "+([int](($size.split("(")[0]).replace(" ","")/1MB))+"`r`n" $result+=" MB`r`n" $result+=" Absolute`r`n" $result+=" `r`n" } } else { write-host "Invalid Parameter $mode" $result+="Invalid Parameter:"+$arg+"`r`n" } $result+="" remove-pssession -session $session } write-host "End: ExitCode "$error.count Write-host "Sending Result to output pipeline" $result if ($error) { #write-host "Found Errors" EXIT 1 }