SharePoint Dienste Tabelle inklusive Dienst-Status per PowerShell Skript generieren
Das PowerShell-Skript in diesem Artikel erstellt eine SharePoint Dienste Tabelle. In dieser Tabelle werden alle SharePoint-Dienste, die in der Farm vorhanden sind, mit dem Status auf den SharePoint-Servern der SharePoint-Farm ausgegeben.
Beispielausgabe:
Service | Server01 | Server02 | Server03 | Server04 |
---|---|---|---|---|
Server Suche | Online | Online | Disabled | Disabled |
Verteilter Cache | Online | Online | ||
Zentraladministration | Online | Online | Disabled | Disabled |
. . . | . . . | . . . | . . . | . . . |
Diese Tabelle der SharePoint Dienste inklusive Dienst-Status wird in der PowerShell-Konsole ausgegeben. Zusätzlich wird die Tabelle in eine Text-Datei (TXT) und eine CSV-Datei geschrieben und per Mail verschickt. Die Erstellung bzw. den Versand 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 den Überblick über Sitecollections, Datenbanken und andere Sharepointfarmkomponenten zu behalten.
SharePoint Dienste Tabelle – Das Skript
<# .SYNOPSIS Schreibt SP-Berichte .DESCRIPTION Es werden SharePoint Dienste auf den Servern mit Status angezeigt und fuer schnellen Aufruf in Dateien geschrieben. #> # ===================================================================== # Settings # ===================================================================== $ReportFolder = "C:\Berichte" $TxtFile = "SpSpDiensteStatus_TXT.txt" $CsvFile = "SpSpDiensteStatus_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 = "" $services = "" $Servers = "" $Table = "" Write-Verbose "Ausgabe wird generiert ..." # Zeigt alle Share-Point-Dienste und deren Status auf allen Servern einer SP-Farm in einer Tabelle an # ------------------------------------------------------------------------- $services = new-object system.collections.sortedlist Get-SPServer | Where-Object { $_.Role -match 'Application' } | %{ $_.serviceinstances | % { if (!($services.contains($_.typename))){ $services[$_.typename] = $_.typename} }} #Get-SPServer | Where-Object { $_.Role -match ‘Application’ } | %{ $_.serviceinstances | % { if (!($services.contains($_.service))){ $services[$_.service] = $_.service} }} write-verbose "Server abfragen und speichern...`n" $Servers = Get-SPServer | Where-Object { $_.Role -match 'Application' } #Tabelle erzeugen write-host "" write-verbose "Tabelle wird erstellt...`n" $tabName = "Services Table" $table = New-Object system.Data.DataTable "$tabName" $table.columns.add( (New-Object system.Data.DataColumn 'Service (TypeName)',([string]))) $table.PrimaryKey = $table.Columns['Service (TypeName)'] $servers | %{ $table.columns.add( (New-Object system.Data.DataColumn $_.Name,([string])) ) } $services.Keys | %{ $table.Rows.Add( ($table.NewRow().'Service (TypeName)' = $_)) } # Tabelle befüllen write-host "" write-verbose "Status der Dienste setzen...`n" foreach($server in $servers){ # Status setzen #$server.serviceinstances | %{ if ($_.status -eq “Online” ) {$table.Rows.Find($_.typename)[$server.Name] = “Online”} } # Status "Online" bei laufenden Diensten schreiben #$server.serviceinstances | %{ if ($_.status -ne “Online” ) {$table.Rows.Find($_.typename)[$server.Name] = “-”} } $server.serviceinstances | %{$table.Rows.Find($_.typename)[$server.Name] = $_.status} # Echten Status schreiben } $output = $Table #| ft -AutoSize # Ausgabe # ----------------------------------------- #Write-Verbose "Ausgabe in GUI-Zellenansicht" #$Table | Out-GridView Write-Verbose "Ausgabe in der Konsole" $output | ft -AutoSize Write-Verbose "Ausgabe in TXT-Datei" $output | ft -AutoSize | Out-File -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 Sites 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-SpDiensteStatus.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 Dienste Tabelle inklusive Status wird in der PowerShell-Konsole ausgegeben.
Es werden im Ordner „C:\Berichte“ die Dateien „SpDiensteStatus_TXT.txt“ und „SpDiensteStatus_CSV.csv“ erzeugt und falls in „Settings“ $Mail=$true
dann per Mail versendet.
SharePoint Dienste Tabelle inklusive Dienst-Status per 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 - SpDiensteStatus
- Beschreibung:
Es werden SharePoint Dienste auf den Servern mit Status angezeigt 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-SpDiensteStatus.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 Dienste auf den Servern mit Status angezeigt 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-SpDiensteStatus.ps1"</Arguments> </Exec> </Actions> </Task>
- Den Benutzer in den Zeilen 5 und 23 anpassen.
- Den Inhalt als XML-Datei (z.B. „Bericht – SpDiensteStatus.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 – SpDiensteStatus.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.