SharePoint Unterseiten Liste – PowerShell Skript

SharePoint Unterseiten Liste (inklusive „SiteAdministrators“, „Created“ Date, „LastItemModifiedDate“, „Author“, „URL“, „ID“) per PowerShell Skript generieren

Das PowerShell-Skript in diesem Artikel erstellt eine SharePoint Unterseiten Liste. Diese Liste der Unterseiten (SubSites) enthält natürlich auch die dazugehörigen Websitesammlungen (Sitecollections) und die wichtigsten Informationen wie „ServerRelativeUrl“, „Title“, „SiteAdministrators“, „Created“ Date, „LastItemModifiedDate“, „Author“, „URL“, „ID“ und „ParentWebId“.

Beispielausgabe:

ServerRelativeUrl           Title          	SiteAdministrators         Created            	LastItemModifiedDate	Author                     Url                                                         ID                                  				ParentWebId
-----------------           -----          	------------------         -------            	--------------------	------                     ---                                                         --                                  				-----------
/                           Homepage		i:0#.w|domain\SiteAdmin1   20.02.2013 11:29:28	07.10.2017 01:00:04 	i:0#.w|domain\author1      https://sharepoint.domain.de                                c9176007-424f-4d03-a4f9-695b8df0a0f5				00000000-0000-0000-0000-000000000000
/Sitecollection1           	Projekte1  		i:0#.w|domain\SiteAdmin2   01.08.2013 09:03:34	14.06.2017 21:56:11 	i:0#.w|domain\author2      https://sharepoint.domain.de/Sitecollection1                a109b1e2-72be-4e55-bff6-e5612790d9d8				b9e00a9a-7822-488d-8289-049fe91f919b
/Sitecollection1/SubSite1   Projekt1   		i:0#.w|domain\SiteAdmin2   28.03.2014 09:18:13	17.06.2017 09:56:22 	i:0#.w|domain\author3      https://sharepoint.domain.de/Sitecollection1/SubSite1       6d392a7f-3c7d-43b1-9ad5-b9a0411a5c04				36f95aa9-31fc-4170-b87f-d78210832fab
/Sitecollection1/SubSite2   Projekt2   		i:0#.w|domain\SiteAdmin2   03.02.2016 12:09:28	14.06.2017 09:58:12 	i:0#.w|domain\author4      https://sharepoint.domain.de/Sitecollection1/SubSite2       6de69a56-3460-49e9-83f1-36a9fa3b1fe9				36f95aa9-31fc-4170-b87f-d78210832fab
/Sitecollection2           	Projekte2  		i:0#.w|domain\SiteAdmin3   28.03.2014 09:18:13	17.06.2017 09:56:22 	i:0#.w|domain\author5      https://sharepoint.domain.de/Sitecollection2                5055d2d7-50f4-43c8-aea8-165942e6631c				b9e00a9a-7822-488d-8289-049fe91f919b
/Sitecollection2/SubSite1   Projekt1   		i:0#.w|domain\SiteAdmin4   03.02.2016 12:09:28	14.06.2017 09:58:12 	i:0#.w|domain\author6      https://sharepoint.domain.de/Sitecollection2/SubSite1       5db93ed7-4b54-4517-879c-dd976daff3b8				ff0cd1e8-f640-4569-8ccd-feabe124c9ae

 

Diese SharePoint Unterseiten Liste wird in der PowerShell-Konsole ausgegeben. Außerdem wird die Tabelle in eine Text-Datei (TXT) und eine CSV-Datei geschrieben und bei Bedarf 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 und Reporting-Anfragen schnell beantworten zu können.

SharePoint Unterseiten Liste – Das Skript

 

<# Info
    .SYNOPSIS
        Schreibt SP-Berichte
    .DESCRIPTION
        Es werden SharePoint Unterseiten aufgerufen und fuer schnellen Aufruf in Dateien geschrieben.
#>



# =====================================================================
# Settings
# =====================================================================

$WebApp = "https://sharepoint.domain.de"
$ReportFolder = "C:\Berichte"
$TxtFile = "SpUnterseiten_TXT.txt"
$CsvFile = "SpUnterseiten_CSV.csv"
$Mail=$true

$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$DebugPreference = "SilentlyContinue"											
$verbosePreference = "Continue"													
#$verbosePreference = "SilentlyContinue"										

$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 "WebApp ist $WebApp"



Write-Verbose "Variable entfernen"
$Sites = ""



Write-Verbose "Site-List wird generiert ..."
$Sites = Get-SPWebApplication $WebApp -Verbose:$false | Get-SPSite -Limit All -Verbose:$false | Get-SPWeb -Limit All -Verbose:$false | Select ServerRelativeUrl, Title, SiteAdministrators, Created, LastItemModifiedDate, Author, URL, ID, ParentWebID



# Ausgabe
# -----------------------------------------
Write-Verbose "Ausgabe in der Konsole"
$Sites | ft * -AutoSize

Write-Verbose "Ausgabe in TXT-Datei"
$Sites | ft * -AutoSize | Out-File -Encoding UTF8 -Force -FilePath "$ReportFolder\$TxtFile"

Write-Verbose "Ausgabe in CSV-Datei"
$Sites | Export-CSV -Delimiter ";" -NoTypeInformation -Encoding UTF8 -Force -Path "$ReportFolder\$CsvFile"






# Skript-Ende
# =====================================================================

Write-Verbose "Variable entfernen"
$Sites = ""



# 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-SpUnterseiten.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 $WebApp steuert, welche Webapplikation abgefragt wird, z.B. das Portal selbst, oder MySites etc. (falls in diesem Skript vorhanden).
  • 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 Unterseiten Liste wird in der PowerShell-Konsole ausgegeben. Da die Ausgabe meistens breiter ist als das PowerShell-Fenster, wird im Skript der Puffer höher gesetzt, damit die PowerShell-Ausgabe nicht abgeschnitten, oder umgebrochen ist. In dem Fall muss dann nach rechts gescrollt werden.

Die PowerShell-Ausgabe sieht beispielsweise so aus:

ServerRelativeUrl           Title          	SiteAdministrators         Created            	LastItemModifiedDate	Author                     Url                                                         ID                                  				ParentWebId
-----------------           -----          	------------------         -------            	--------------------	------                     ---                                                         --                                  				-----------
/                           Homepage		i:0#.w|domain\SiteAdmin1   20.02.2013 11:29:28	07.10.2017 01:00:04 	i:0#.w|domain\author1      https://sharepoint.domain.de                                c9176007-424f-4d03-a4f9-695b8df0a0f5				00000000-0000-0000-0000-000000000000
/Sitecollection1           	Projekte1  		i:0#.w|domain\SiteAdmin2   01.08.2013 09:03:34	14.06.2017 21:56:11 	i:0#.w|domain\author2      https://sharepoint.domain.de/Sitecollection1                a109b1e2-72be-4e55-bff6-e5612790d9d8				b9e00a9a-7822-488d-8289-049fe91f919b
/Sitecollection1/SubSite1   Projekt1   		i:0#.w|domain\SiteAdmin2   28.03.2014 09:18:13	17.06.2017 09:56:22 	i:0#.w|domain\author3      https://sharepoint.domain.de/Sitecollection1/SubSite1       6d392a7f-3c7d-43b1-9ad5-b9a0411a5c04				36f95aa9-31fc-4170-b87f-d78210832fab
/Sitecollection1/SubSite2   Projekt2   		i:0#.w|domain\SiteAdmin2   03.02.2016 12:09:28	14.06.2017 09:58:12 	i:0#.w|domain\author4      https://sharepoint.domain.de/Sitecollection1/SubSite2       6de69a56-3460-49e9-83f1-36a9fa3b1fe9				36f95aa9-31fc-4170-b87f-d78210832fab
/Sitecollection2           	Projekte2  		i:0#.w|domain\SiteAdmin3   28.03.2014 09:18:13	17.06.2017 09:56:22 	i:0#.w|domain\author5      https://sharepoint.domain.de/Sitecollection2                5055d2d7-50f4-43c8-aea8-165942e6631c				b9e00a9a-7822-488d-8289-049fe91f919b
/Sitecollection2/SubSite1   Projekt1   		i:0#.w|domain\SiteAdmin4   03.02.2016 12:09:28	14.06.2017 09:58:12 	i:0#.w|domain\author6      https://sharepoint.domain.de/Sitecollection2/SubSite1       5db93ed7-4b54-4517-879c-dd976daff3b8				ff0cd1e8-f640-4569-8ccd-feabe124c9ae

 

Es werden im Ordner „C:\Berichte“ die Dateien „SpSpUnterseiten_TXT.txt“ und „SpSpUnterseiten_CSV.csv“ erzeugt und falls in „Settings“ $Mail=$true gesetzt, dann per Mail versendet.

 SharePoint Unterseiten Liste 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 SharePoint Unterseiten Liste - 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 - SpUnterseiten
    • Es werden SharePoint Unterseiten 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-SpUnterseiten.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 Unterseiten 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-SpUnterseiten.ps1"</Arguments>
    </Exec>
  </Actions>
</Task>
  • Den Benutzer in den Zeilen 5 und 23 anpassen.
  • Den Inhalt als XML-Datei (z.B. „Bericht – SpUnterseiten.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 – SpUnterseiten.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