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!
Add comment