DPM Rapportage uitbreiden met SQL en PowerShell

In de GUI van Microsoft System Center Data Protection Manager (DPM) is veel informatie terug te vinden. Echter, automatisch een dagelijks, wekelijkse of maandelijkse DPM rapportage met op maat gemaakte informatie is lastig. Een deel is relatief makkelijk terug te vinden met de Powershell Cmdlets die voor DPM beschikbaar zijn. Een ander deel van de informatie is met SQL queries goed uit de DPM database te halen. Helaas zijn beide methodes niet volledig. Daarom hebben we voor de rapportage een combinatie van PowerShell en informatie uit de SQL database gebruikt.

Uiteraard kan je handmatig aan de slag met Powershell commando’s in de DPM Management Shell en vervolgens hetzelfde doen voor een aantal queries in SQL Server Management Studio. De meerwaarde zit hem vooral in het automatiseren van dit proces, waarbij je een Powershell script als scheduled task op je DPM server laat draaien. Met dit script haal je zowel via Powershell als SQL informatie op, stopt dit vervolgens in een CSV-bestand wat daarna automatisch wordt gemaild naar bijvoorbeeld de helpdesk.

DPM-Rapportage-Voorbeeld-Agents

Voorbeeld van DPM Rapportage (Agent inventarisatie)

DPM en SQL vanuit Powershell

In de standaard Powershell console heb je geen toegang tot de DPM cmdlets of SQL en dit geldt ook voor een script. Daarom moet deze functionaliteit eerst geïmporteerd worden voordat we echt aan de slag kunnen. Voor de DPM Cmdlets moet de ‘DataProtectionManager’  module geïmporteerd worden. Het makkelijkst is om ook gelijk een verbinding te maken naar de DPM server. Ervan uit gaande dat je het script op de DPM server draait kan je de naam van de lokale server ophalen met $env:computername en vervolgens met Connect-DPMServer gelijk naar deze variabele connecten.

$DPMServer = $env:computername
Import-Module "DataProtectionManager"
Connect-DPMServer -DPMServerName $DPMServer

Om vanuit PowerShell met de database te kunnen communiceren gebruiken we de PowerShell module die meegeleverd wordt met een installatie van SQL Server. Bij het laden voegt deze module ook de SQLServer PSDrive toe en maakt daar gelijk je current PSDrive van. Mocht je bestanden lokaal willen weg schrijven dan is het slim om het gewenste pad mee te geven of de PSDrive terug te wijzigen. Ook als je de SQL module weer zou willen verwijderen moet je eerst de current PSDrive wijzigen, want anders mislukt het verwijderen met de error “Because the SQLPS module is providing the PSDrive in the current Windows PowerShell session, no modules were removed”.

Import-Module "SQLPS"

Om te kunnen queryen moet je de instance en de database meegeven en dit kunnen we simpel uit het registry van de DPM server halen:

$DpmRegKey = "HKLM:SOFTWARE\Microsoft\Microsoft Data Protection Manager\DB"
$DpmSqlInstance = "$((Get-ItemProperty $DpmRegKey).SqlServer)\$((Get-ItemProperty $DpmRegKey).InstanceName)"
$DpmDataBase = (Get-ItemProperty $DpmRegKey).DatabaseName

Informatie verzamelen

Voor DPM zijn er een flink aantal Powershell Cmdlets beschikbaar om informatie op te halen. Bijvoorbeeld het verzamelen van informatie over de protection groups of datasources is relatief simpel:

$DpmPGs = Get-DPMProtectionGroup
$DpmDSs = Get-DPMDatasource | Where-Object{$_.TotalRecoveryPoints -ne 0}

Lastiger wordt het als je bijvoorbeeld wil weten welke rollups er geïnstalleerd zijn op DPM. Hier komt SQL om de hoek kijken. Een standaard query vanuit PowerShell ziet er als volgt uit:

Invoke-Sqlcmd -ServerInstance $DpmSqlInstance -Query $Query

Voor een simpele query kan je deze als string meegeven, maar bij een uitgebreide query maak je gebruik van een scriptblock. Om de geïnstalleerde rollups te verzamelen haal je de informatie op uit de tabel tbl_DPM_InstalledUpdates:

$DpmInstalledUpdates = Invoke-Sqlcmd -ServerInstance $DpmSqlInstance -Query "SELECT * FROM $DpmDataBase.dbo.tbl_DPM_InstalledUpdates;"

CSV aanmaken en mailen t.b.v. DPM Rapportage

In PowerShell bestaat er een Cmdlet speciaal voor het maken van CSV-bestanden:

$DpmPGs | Select-Object Name,PGProtectionType,OnsiteRecoveryRange | Export-Csv -Path "C:\Scripts\Output\protectiongroups.csv -Delimiter ";"
$DpmDSs | Select-Object Name,ProtectionGroupName,ObjectType | Export-Csv -Path "C:\Scripts\Output\datasources.csv -Delimiter ";"
$DpmInstalledUpdates | Select-Object KBID | Export-Csv -Path "C:\Scripts\Output\installedupdates.csv -Delimiter ";"

Het nadeel van het Export-Csv Cmdlet is dat je voor elke variabele een aparte CSV aanmaakt.  Alle informatie in één csv kan ook, maar is iets meer werk:

$CsvLocation = "C:\Scripts\Output\DPMinfo.csv"
New-Item -type file $CsvLocation -Force
Add-Content -Path $CsvLocation -Value "Protection Groups"
Add-Content -Path $CsvLocation -Value "Name;ProtectionType;Retention"
Foreach ($PG in $DpmPGs) {
    Add-Content -Path $CsvLocation -Value "$($PG.Name);$($PG.PGProtectionType);$($PG.OnsiteRecoveryRange)"
}
Add-Content -Path $CsvLocation -Value ""
Add-Content -Path $CsvLocation -Value "Datasources"
Add-Content -Path $CsvLocation -Value "Name;ProtectionGroup;ProtectionType"
Foreach ($DS in $DpmDSs) {
    Add-Content -Path $CsvLocation -Value "$($PG.Name);$($PG.ProtectionGroupName);$($PG.ObjectType)"
}
Add-Content -Path $CsvLocation -Value ""
Add-Content -Path $CsvLocation -Value "Installed updates"
Add-Content -Path $CsvLocation -Value "Update"
Foreach ($DS in $DpmInstalledUpdates) {
    Add-Content -Path $CsvLocation -Value "$($PG.KBID)"
}

Uiteraard kunnen we de verzamelde informatie vervolgens mailen:

$Mailto = "helpdesk@gtsonline.nl"
$MailFrom = "dpm@gtsonline.nl"
$Mailsubject = "Script: DPM info"
$SendMailSMTP = "smtp.domain.local"
$Mailbody = "Dit script draait als een scheduled task op $DpmServer ($PSCommandPath)."
Send-MailMessage -To $Mailto -From $Mailfrom -Subject $Mailsubject -Attachments $CsvLocation -SmtpServer $SendMailSMTP -Body $Mailbody

En nu?

Bovenstaande geeft een voorbeeld van een rapport uit DPM. We kunnen ons voorstellen dat u meer wensen hebt dan bovenstaande. Onze engineers denken graag met u mee en neem dus vooral contact met ons op via support@gtsonline.nl. Wilt u dat de back-up geregeld is, maar wilt u hier niet zelf mee aan de slag? We denken graag met u mee en nemen graag de zorg over uw back-up van u over.



Wilt u graag een afspraak maken? Dat kan!

Wij ontvangen u met plezier of komen graag bij u op locatie.

Heeft u een vraag?

Vul onderstaand formulier in en wij nemen zo snel mogelijk contact op!



X