SharePoint – File locked by another user – PowerShell

04.07.2018 0 Von Frank

In seltenen Fällen kann es passieren, dass Dateien einer SharePoint-Bibliothek durch einen Benutzer gesperrt sind, obwohl dieser die Datei längst nicht mehr bearbeitet und die Datei eigentlich wieder freigegeben sein sollte.
Man erhält die Meldung “File locked by another user”.
SharePoint erkennt in diesem Fall also nicht, dass der Lock eigentlich wieder entfernt werden sollte.

Wodurch kann das Problem entstehen:

  • Word oder ein anderes Programm hat sich vorher unbeabsichtigt beendet.
  • Es läuft eine zweite Word-Instanz im Hintergrund. Ggf. auch nicht mehr sichtbar und nur in der Prozessliste.
  • PC stürzt ab während das Dokument geöffnet war.
  • Netzwerkverbindung bricht ab, während das Dokument geöffnet war.

Falls die Dateisperre auch nach einiger Zeit nicht entfernt wird, hilft PowerShell mit folgendem Skript.
Das Skript muss per SharePoint-Management-Shell mit einem ShellAdmin ausgeführt werden.
Vorher muss man natürlich die Inhalte der 3 Variablen $targetWeb, $targetLib und $itemID austauschen.

  1. $targetWeb => URL des Webs, in der sich die Bibliothek befindet in der eine Datei entsperrt werden soll
  2. $targetLib => DisplayName der Bibliothek in der eine Datei entsperrt werden soll
  3. $itemID    => ID des Items, dessen Datei entsperrt werden soll
#SharePoint CMDLETS laden
if ((Get-PsSnapin | ?{$_.Name -eq "Microsoft.SharePoint.PowerShell"})-eq $null) {
  $PSSnapin = Add-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
}

# Variablendefinition
$targetWeb = "https://server/sites/xyz"
$targetLib = "LibraryName"
$itemID = 11

#Auslesen von Web und Library
$spWeb = Get-SPWeb $targetWeb
$spLib = $spWeb.Lists[$targetLib]

#Logging
write-host "WEB	: $($spWeb.Url)"
write-host "--------------------------------------"

#Unlock Item
$spItem = $spLib.GetItemById($itemID)

if($spItem.File.LockId -ne $null) {
  write-host "   Datei ist gelockt von $($spItem.File.LockedByUser) mit LockID $($spItem.File.LockId)"
  $spItem.File.ReleaseLock($spItem.File.LockId)
  write-host "   Lock von Datei $itemID wurde aufgehoben"
}
else {
  write-host "   Datei $itemID ist nicht gelockt"
}

write-host -LogString "--------------------------------------"
$spWeb.Dispose()