Is it possible to get data from PRTG, with powershell? Has anybody done that before?

I would like to receive data like disk-usages and uptime-information.


Article Comments

Hi,
Sure, this is possible. PRTG offers an HTTP API which can be queried using Powershell. The API Dcoumentation can be found at YOUR_PRTG_SERVER/api.htm. I personally am using the Invoke-WebRequest cmdlet here. Example code below:

param(
    [string]$user = "prtgadmin",
    [string]$pass = "prtgadmin",
    [string]$prtgserver = "https://127.0.0.1",
    [string]$time = "yesterday",
    [string]$path = "D:\Temp\"
)
# function from http://stackoverflow.com/questions/11696944 to override SSL Cert check
function Ignore-SSLCertificates
{
    $Provider = New-Object Microsoft.CSharp.CSharpCodeProvider
    $Compiler = $Provider.CreateCompiler()
    $Params = New-Object System.CodeDom.Compiler.CompilerParameters
    $Params.GenerateExecutable = $false
    $Params.GenerateInMemory = $true
    $Params.IncludeDebugInformation = $false
    $Params.ReferencedAssemblies.Add("System.DLL") > $null
    $TASource=@'
        namespace Local.ToolkitExtensions.Net.CertificatePolicy
        {
            public class TrustAll : System.Net.ICertificatePolicy
            {
                public bool CheckValidationResult(System.Net.ServicePoint sp,System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem)
                {
                    return true;
                }
            }
        }
'@ 
    $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
    $TAAssembly=$TAResults.CompiledAssembly
    ## We create an instance of TrustAll and attach it to the ServicePointManager
    $TrustAll = $TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager]::CertificatePolicy = $TrustAll
}
Ignore-SSLCertificates

$get_devices_uri = ("{0}/api/table.json?content=devices&output=json&columns=objid&username={1}&password={2}" -f $prtgserver, $user, $pass)

try{
    $JSON = Invoke-WebRequest -Uri $get_devices_uri | ConvertFrom-Json
}
catch{
    Write-Host "Error. Cannot get device ids. Exiting!"
    exit 0
}
foreach($object in $JSON.devices){
    $destination = ("{0}\{1}.csv" -f $path, $object.objid)
    $get_messages_uri = ("{0}/api/table.xml?content=messages&output=csvtable&columns=objid,datetime,parent,type,name,status,message&filter_drel={1}&id={2}&username={3}&password={4}" -f $prtgserver, $time, $object.objid, $user, $pass)
    try{
        Invoke-WebRequest -Uri $get_messages_uri -OutFile $destination
    }
    catch{
        Write-Host "Error. Cannot get messages. Exiting!"
        exit 0
    }
}

Above code gets messages from a sensor but can easily be adapted to sensor data. Please note that the function from Stackoverflow has to stay in place when you are using a self signed Certificate as this will (I know this is not optimal) overwrite the certificate check. If not needed please remove!


Apr, 2016 - Permalink

Certainly done it before..

Have a look here:

Look at the function Get-prtgSensorData

Params: SensorID, [datetime]StartDate, [datetime]EndDate

Returns a table of the raw data.

More details here:


Apr, 2016 - Permalink