Kleine Helferlein – Teil 2

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.

Leave a Comment

Your email address will not be published. Required fields are marked *