SharePoint DB Liste nach Größe sortiert – PowerShell Skript

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.

SharePoint DB Liste nach Größe sortiert - PowerShell Skript - Bericht - Inventarisierung - SharePoint 2013

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 Windows Aufgabenplanung - Task Scheduler - Icon - Symbol
  • In der Aufgabenplanung einen neuen Ordner namens „Berichte“ erstellen (falls noch nicht vorhanden)
    • Im rechten Bereich unter „Aktionen“ den Punkt „Aufgabe erstellen…“ anklicken.
      Windows Aufgabenplanung - Task Scheduler - Aktionen - Aufgabe erstellen - Aufgabe importieren - Ausführen - Beenden - Deaktivieren - Exportieren - Eigenschaften
    • 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"

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 Windows Aufgabenplanung - Task Scheduler - Icon - Symbol und auf der rechten Seite im Bereich „Aktionen“ den Punkt „Aufgabe importieren…“ anklicken.
    Windows Aufgabenplanung - Task Scheduler - Aktionen - Aufgabe erstellen - Aufgabe importieren - Ausführen - Beenden - Deaktivieren - Exportieren - Eigenschaften
  • 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert