После удалении коллекции сайтов SharePoint средствами PowerShell через команду Remove-SPSite было написано, что все окей. Правда при попытке создать SPSite с таким же именем выдавалось сообщение о том, что такое имя уже используется. Задав в PowerShell команду Get-SPSite, я обнаружил, что моя коллекция сайтов до сих пор в списке.
При попытке зайти на страницу удаляемой коллекции сайтов и получал ошибку 404 – страница не найдена. В ULS-логах ничего мне понятного не было. В любом случае, я хотел удалить SPSite, а не понять, почему он не работает.
Продолжил экспериментировать с командами в PowerShell, пытаясь заменить URL коллекции сайтов на GUID.
$ss = Get-SPSite -Identity https://spdev/mytempSite Remove-SPSite -Identity $ss.ID
В результате получил сообщение об ошибке:
Remove-SPSite : Не удалось завершить эту операцию.
Повторите попытку.
At line:1 char:14
+ Remove-SPSite <<<< -Identity $ss.ID
+ CategoryInfo : InvalidData: (Microsoft.Share... mdletRemoveSite:
SPCmdletRemoveSite) [Remove-SPSite], SPException
+ FullyQualifiedErrorId : Microsoft.SharePoint. PowerShell.SPCmdletRemoveSiTe
Попробовал воспользоваться командой Remove-SPDeletedSite также через идентификатор, но тоже была ошибка, что не получается найти SPSite с моим идентификатором:
Remove-SPDeletedSite -Identity $ss.ID
Снова ошибка:
Remove-SPDeletedSite : Cannot find an SPDeletedSite object with Id or Url: …..
С решением проблемы помог один очень малоизвестный метод ForceDeleteSite.Он позволяет удалить из базы данных информацию о коллекции сайтов. Недостаток этого метода – он не удаляет никакие артефакты из файловой системы, так что этот метод только на крайний случай.
$site = Get-SPSite http://siteurl $siteId = $site.Id $siteDatabase = $site.ContentDatabase $siteDatabase.ForceDeleteSite( $siteId, $false, $false)
Теперь немного подробней о методе:
public void ForceDeleteSite( Guid siteId, bool gradualDelete, bool restorable )
Входящие параметры: идентификатор коллекции сайтов, $true или $false для включения параметра gradualDelete (если надо удалить сразу, то ставьте $false), $true или $false для возможности восстановления (рекомендую сразу $false).