SharePoint DB Liste (nach Größe) sortiert per PowerShell Skript generieren
Das folgende PowerShell-Skript generiert eine SharePoint DB Liste, die nach Größe sortiert ist. Am Ende wird auch die Summe dieser Datenbanken berechnet.
Diese Liste wird in der PowerShell-Konsole ausgegeben. Zusätzlich wird die Liste in eine Text-Datei (TXT) und eine CSV-Datei geschrieben und per Mail verschickt. Die Erstellung bzw. den Versand der SharePoint DBs Liste kann man per Windows-Task z.B. einmal pro Woche automatisieren.
Das Skript könnte, zusammen mit den anderen Skripten aus unserer Artikelreihe „Inventarisierung„, dem SharePoint-Admin dabei helfen, seine SharePoint-Umgebung zu erfassen und Überblick über Sitecollections, Datenbanken und andere Sharepointfarmkomponenten zu behalten.
SharePoint DB Liste – Das Skript
<# .SYNOPSIS Schreibt SP-Berichte .DESCRIPTION Es werden SharePoint Datenbanken nach Groeße sortiert aufgerufen und fuer schnellen Aufruf in Dateien geschrieben. #> # ===================================================================== # Settings # ===================================================================== $ReportFolder = "C:\Berichte" $TxtFile = "SpDBGroessen_TXT.txt" $CsvFile = "SpDBGroessen_CSV.csv" $Mail=$true $ErrorActionPreference = "Stop" $WarningPreference = "Continue" $DebugPreference = "SilentlyContinue" # Wenn Inquire aktiviert ist, kann man Haltepunkte mit write-debug "Hier ist ein Haltepunkt" einfügen $verbosePreference = "Continue" # Sehr gesprächig #$verbosePreference = "SilentlyContinue" # Standard $Loging = $false $Logdir = (gci(resolve-path ($myInvocation.MyCommand.Path))).DirectoryName # Als Ordner wird der Ordner genommen, in dem das Skript liegt $LogName = (gci(resolve-path ($myInvocation.MyCommand.Path))).BaseName + ".log" # Als Log-Name wird der Srkipt-Name genommen und Endung auf .log geändert #$LogName = (gci(resolve-path ($myInvocation.MyCommand.Path))).BaseName + " " + (Get-Date -f 'yyyy-MM-dd_HH.mm.ss tt') + ".log" # Als Log-Name wird der Srkipt-Name genommen, Zeit hinzugefügt und Endung auf .log geändert #$Logdir = "$env:homepath\Desktop\Logs" # Wo die Logdatei gespeichert werden soll. #$LogName = "Skript.log" $LogFile = "$Logdir" + "\" + "$LogName" # ===================================================================== # ===================================================================== # Skript-Kopf # ===================================================================== # Error Handling trap { Write-Verbose "trap ausgelöst" #"Error: $_" "$_.Exception.Message" $objCompSys = Get-WmiObject win32_computersystem $compfull = ($objCompSys.name+"."+$objCompSys.domain).ToLower() Remove-Variable objCompSys $ScriptName = (gci(resolve-path ($myInvocation.MyCommand.Path))).Name # Mailversand $Date = get-date $emailTo = "Vorname.Nachname1@domain.de"#, "Vorname.Nachname2@domain.de" $emailFrom = "PS Error Handling <Vorname.Nachname1@domain.de>" $smtpServer = "mailgw.domain.de" $Subject = "Exception in $ScriptName" $Body = ("Time: {0}`nComputer: {1}`nException: {2}`n`n`nInvocationInfo:`n================================================================={3}=================================================================`n" -f ($Date), ($compfull), ($_.Exception | Format-List | Out-String), ($_.InvocationInfo | Format-List | Out-String)) Send-MailMessage -From $emailFrom -To $emailTo -SmtpServer $smtpServer -Encoding UTF8 -Subject $subject -Body $body -Priority Normal #Write-Error $_ #Ausgabe auch in der Konsole exit #continue } #Skript wird beendet, falls keine Administrator-Rechte If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Write-Warning "You do not have Administrator rights to run this script!`nPlease re-run this script as an Administrator!" if ($Debug -eq $true) {Write-Host "Press Enter to exit..." -nonewline -fore yellow ; $null = Read-Host " "} try {stop-transcript} catch {} # Logging beenden write-host "`n`n" if ($Debug -ne $true) {start-sleep -s 5} Exit } # Zeitmessung beginnt $StartTimeMeasure = Get-Date # Log # Transcript-Methode try {stop-transcript} catch {} # Falls das Skript vorher abgebrochen wurde und die Aufzeichnung am Ende nicht beendet wurde, soll diese hier beendet werden. If ($Loging -eq $True) { write-verbose "Die Log-Datei ist: $Logfile" start-transcript -path $Logfile } # Skript-Koerper # ===================================================================== Write-Verbose "SharePoint-Module laden..." Add-PSSnapin Microsoft.SharePoint.PowerShell Write-Verbose "Fensterpuffer einstellen" #Puffer (sonst werden z.B. Spalten rechts abgeschnitten in der Konsolen- und TXT-Ausgabe etc.) $buffer = $host.ui.RawUI.BufferSize; $buffer.width = 3000; $buffer.height = 3000; $host.UI.RawUI.Set_BufferSize($buffer) Write-Verbose "Variable leeren" $output = "" Write-Verbose "Liste wird generiert ..." $DBs = get-spdatabase -Verbose:$false $output = $DBs | Sort DiskSizeRequired | Select -Property Name, @{label="DiskSizeRequired in MB";Expression={[math]::round($_.DiskSizeRequired/1MB, 2)}}, Status, Type, IsReadOnly, CanUpgrade, IsBackwardsCompatible, NeedsUpgrade, IncludeInVssBackup, ID, LegacyDatabaseConnectionString Write-Verbose "Datengroesse Summe aller SP-Datenbanken berechnen" $DBs | ForEach-Object {$outputDiskSize=0}{$outputDiskSize+=$_.DiskSizeRequired} #{$sum/1MB} # Ausgabe # ----------------------------------------- Write-Verbose "Ausgabe in der Konsole" #$output | ft * -AutoSize $output | ft * -Auto Write-Host "`nGroesse der Datenbanken: $([math]::round($outputDiskSize/1MB, 2)) MB`n" -ForegroundColor Cyan Write-Verbose "Ausgabe in TXT-Datei" #$output | ft * -AutoSize | Out-File -Encoding UTF8 -FilePath "$home\desktop\$(Get-Date -Format 'yyyy-MM-dd HH.mm.ss') $(gc env:computername) SpWebsTXT.txt" $output | ft * -Auto | Out-File -Encoding UTF8 -Force -FilePath "$ReportFolder\$TxtFile" # Summe dranhaengen @" Größe aller SharePoint-DBs ================================================================= Summe: $([math]::round($outputDiskSize/1MB, 2)) MB "@ | Out-File -Append -Encoding UTF8 -Force -FilePath "$ReportFolder\$TxtFile" Write-Verbose "Ausgabe in CSV-Datei" $output | Export-CSV -Delimiter ";" -NoTypeInformation -Encoding UTF8 -Force -Path "$ReportFolder\$CsvFile" # Skript-Ende # ===================================================================== Write-Verbose "Variable entfernen" $output = "" # Zeitmessung Ende $End = get-date $Dauer = $End - $StartTimeMeasure Write-Verbose "Laufzeit: $Dauer" Write-Verbose "Mail generieren und Versand" if ($Mail -eq $true) { $objCompSys = Get-WmiObject win32_computersystem $compfull = ($objCompSys.name+"."+$objCompSys.domain).ToLower() Remove-Variable objCompSys $ScriptName = (gci(resolve-path ($myInvocation.MyCommand.Path))).Name $Date = get-date -f G $emailTo = "Vorname.Nachname1@domain.de"#, "Vorname.Nachname2@domain.de" $emailFrom = "$ScriptName <Vorname.Nachname1@domain.de>" $smtpServer = "mailgw.domain.de" $Subject = "$ScriptName" $EmailAttachment = "$ReportFolder\$TxtFile", "$ReportFolder\$CsvFile" # Bei Bedarf, wenn keine Anhaenge, dann auskommentieren. $Body = @" Die Ausgabe von $ScriptName wurde generiert. Details: ================================================================= Zeit: $(get-date -format F) Computer: $compfull Script: $ScriptName Laufzeit: $Dauer Ordner: $ReportFolder Ausgaben: $ReportFolder\$TxtFile $ReportFolder\$CsvFile ================================================================= "@ # "@ Darf nur ganz links stehen # Ohne und mit Anhang (eins von Beiden auskommentieren) #Send-MailMessage -From $emailFrom -To $emailTo -SmtpServer $smtpServer -Encoding UTF8 -Subject $subject -Body $body -Priority Normal Send-MailMessage -From $emailFrom -To $emailTo -SmtpServer $smtpServer -Encoding UTF8 -Subject $subject -Body $body -Priority Normal -Attachment $EmailAttachment } # Log beenden try {stop-transcript} catch {} # Logging beenden # Pause (manchmal geht die Konsole zu schnell zu) #If ($AsJob -ne $True -or $Debug -eq $true) { #Write-Host "`n`nPress Enter to exit..." -nonewline -fore yellow ; $null = Read-Host " " #}
Vorbereitungen
Skrpt abspeichern
Das Skript z.B. als „C:\Scripts\Berichte\Bericht-SpDBGroessen.ps1
“ abspeichern.
Berechtigungen
Es muss sichergestellt werden, dass der ausführende Account genug Rechte hat und das Ausführen der SharePoint-CMDlets (z.B. Get-SPAlternateURL) möglich ist.
Skript anpassen
Im Bereich „Settings“ die Variablen anpassen.
Die Variable $ReportFolder
steuert, wo die Berichte abgelegt werden sollen.
Im Skript-Kopf und im Skript-Ende folgende Variablen anpassen (jeweils 1x für Error-Handling und 1x für Mailversand)
$emailTo =
$emailFrom =
$smtpServer =
Ausführen / Testen
Das Skript direkt ausführen oder in die PowerShell-ISE kopieren und dort ausführen.
Die SharePoint DB Liste wird in der PowerShell-Konsole ausgegeben.
Es werden im Ordner „C:\Berichte“ die Dateien „SpDBGroessen_TXT.txt“ und „SpDBGroessen_CSV.csv“ erzeugt und falls in „Settings“ $Mail=$true
dann per Mail versendet.
SharePoint DB Liste – Windows-Aufgabe erstellen
Damit die erstellten Berichte stets aktuelle Daten zur Verfügung stellen, könnte man das Skript per Windows-Aufgabenplanung ausführen lassen.
Den Aufgabenjob kann man entweder komplett per Hand erstellen oder die hier zur Verfügung gestellte Datei als Job importieren.
Entweder den Windows-Task per Hand erstellen
- Windows Aufgabenplanung öffnen
- In der Aufgabenplanung einen neuen Ordner namens „Berichte“ erstellen (falls noch nicht vorhanden)
- Im rechten Bereich unter „Aktionen“ den Punkt „Aufgabe erstellen…“ anklicken.
- Name:
Bericht - SpDBGroessen
- Beschreibung:
Es werden SharePoint Datenbanken nach Groeße sortiert aufgerufen und fuer schnellen Aufruf in Dateien geschrieben.
- Trigger: Wöchentlich um 03:00 jeden Monatag.
- Programm:
powershell.exe -noprofile -NonInteractive -executionpolicy ByPass -File "C:\Scripts\Berichte\Bericht-SpDBGroessen.ps1"
- Im rechten Bereich unter „Aktionen“ den Punkt „Aufgabe erstellen…“ anklicken.
Oder Windows-Task per Import erstellen
- Folgenden XML-Code in einen Text-Editor (ich empfehle „Notepad++“) seiner Wahl kopieren.
<?xml version="1.0" encoding="UTF-16"?> <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Date>2017-06-30T14:28:48.7958166</Date> <Author>Domain\user</Author> <Description>Es werden SharePoint Datenbanken nach Groeße sortiert aufgerufen und fuer schnellen Aufruf in Dateien geschrieben.</Description> </RegistrationInfo> <Triggers> <CalendarTrigger> <StartBoundary>2017-09-04T03:00:00</StartBoundary> <ExecutionTimeLimit>P1D</ExecutionTimeLimit> <Enabled>true</Enabled> <ScheduleByWeek> <DaysOfWeek> <Monday /> </DaysOfWeek> <WeeksInterval>1</WeeksInterval> </ScheduleByWeek> </CalendarTrigger> </Triggers> <Principals> <Principal id="Author"> <UserId>Domain\user</UserId> <LogonType>Password</LogonType> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> <AllowHardTerminate>true</AllowHardTerminate> <StartWhenAvailable>true</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <StopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <AllowStartOnDemand>true</AllowStartOnDemand> <Enabled>true</Enabled> <Hidden>false</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <WakeToRun>false</WakeToRun> <ExecutionTimeLimit>PT1H</ExecutionTimeLimit> <Priority>7</Priority> </Settings> <Actions Context="Author"> <Exec> <Command>powershell.exe</Command> <Arguments>-noprofile -NonInteractive -executionpolicy ByPass -File "C:\Scripts\Berichte\Bericht-SpDBGroessen.ps1"</Arguments> </Exec> </Actions> </Task>
- Den Benutzer in den Zeilen 5 und 23 anpassen.
- Den Inhalt als XML-Datei (z.B. „Bericht – SpDBGroessen.xml“) abspeichern.
- Windows Aufgabenplanung öffnen und auf der rechten Seite im Bereich „Aktionen“ den Punkt „Aufgabe importieren…“ anklicken.
- Die Vorher erstellte XML-Datei öffnen (hier „Bericht – SpDBGroessen.xml“)
- Nun kann man alle Parameter noch einmal anschauen und ändern (außer den Autor)
Nach dem Fertigstellen, wird der Task wöchentlich am Montag um drei Uhr ausgeführt und die Berichte erstellt bzw. versendet.