SharePoint Dienste Tabelle inklusive Status – PowerShell Skript

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.

SharePoint Dienste Tabelle inklusive Status per PowerShell Skript generieren - Bericht - Inventarisierung - Report - SharePoint2013

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 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 - 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"

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 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 – 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.

Schreibe einen Kommentar

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