Heute folgt Teil 2 der kleinen Helferlein.
Stellen wir uns folgendes vor: Ein Mitarbeiter verlässt das Unternehmen, ist allerdings noch bei einigen Seiten als Kontaktperson eingetragen.
Um nicht alle Seiten manuell bearbeiten zu müssen, benötigen wir ein PowerShell Script, mit dem wir alle Seiten prüfen und ggf. den Kontakt ersetzen können.
Folgende weitere Anforderungen werden an unser Script gestellt:
- ausgecheckte Seiten werden nicht bearbeitet
- Die URL von ausgecheckten Seiten wird geloggt, wenn der alte Mitarbeiter als Kontakt hinterlegt wurde (um diese später manuell zu bearbeiten)
- eingecheckte Seiten sollen nach der Bearbeitung wieder eingecheckt werden
- veröffentlichte Seiten sollen nach der Bearbeitung wieder veröffentlicht werden
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
cls if ( (Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null) { Add-PSSnapin Microsoft.SharePoint.PowerShell } $site = get-spsite "URL"; $oldContact = $site.RootWeb.EnsureUser("Benutzer_alt"); $newContact = $site.RootWeb.EnsureUser("Benutzer_neu"); $internalNameContact = "PublishingContact"; $Logfile = "C:\temp\log.txt"; $logFileCheckedOutFiles = "C:\temp\CheckedOutFiles.txt"; #Methode zum Loggen von Fehlern function LogError($errorText) { write-host -f red $errorText; Write-Output $errorText | Out-File $Logfile -Append } #Methode zum Loggen der ausgecheckten Dateien function LogFile($text) { Write-Output $text | Out-File $logFileCheckedOutFiles -Append } function CheckContact($subweb, $page) { $spFile = $subweb.GetFile($page.Url); #Prüfen ob der "alte" Kontakt eingetragen ist $oldUserValue = New-Object Microsoft.Sharepoint.SPFieldUserValue($site.RootWeb, $spFile.Item[$internalNameContact]); if ($spFile.Item[$internalNameContact] -ne $null -and ($oldUserValue.lookupId -eq $oldContact.Id)) { #Nur Wenn die Seite nicht ausgechecked ist if ($spFile.CheckOutStatus -eq "None") { Write-Host "Kontakt wird angepasst" -ForegroundColor Green $published = $false; if ($spFile.Level -eq "Published") { $published = $true; } #auschecken $spFile.CheckOut(); #neuen Kontakt eintragen $spFile.Item[$internalNameContact] = New-Object Microsoft.Sharepoint.SPFieldUserValue($site.RootWeb, $newContact.Id, $newContact.LoginName); $spFile.Item.Update(); if ($published -eq $true) { #einchecken und veröffentlichen $spFile.CheckIn("Update Webparts via PowerShell", [Microsoft.SharePoint.SPCheckinType]::MajorCheckIn) } else { #einchecken $spFile.CheckIn("Update Webparts via PowerShell"); } } else { Write-Host "Die Seite ist ausgechecked." $page.Uri.AbsolutePath -ForegroundColor Red LogFile $page.Uri.AbsolutePath; } } } # jedes Web foreach ($subweb in $site.AllWebs) { Write-Host $subweb.Url try { $publishingWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($subweb); $pages = $publishingWeb.GetPublishingPages(); if ($pages) { #jede Seite foreach ($page in $pages) { try { Write-Host $page.Uri.AbsolutePath; CheckContact $subweb $page; } catch [System.Exception] { $errorText = "Fehler bei der Verarbeitung der Seite (" + $page.Url + "): " + $_.Exception.ToString(); LogError $errorText; } } } } catch [System.Exception] { $errorText = "Fehler bei der Verarbeitung des Webs (" + $subweb.Url + "): " + $_.Exception.ToString(); LogError $errorText; } write-host "Alle Webs geprüft."; }' |
Ich hoffe dieser Blogeintrag konnte euch weiter helfen.