Spsite.allwebs возвращает ошибку
-
16-10-2019 - |
Вопрос
Прежде всего, извините, если это очевидный вопрос, я много искал, но не могу найти решение.
Когда я открываю spsite
в PowerShell как это:
$spsite = Get-SPSite "https://adress"
А потом я стараюсь получить все веб -сайты так
$spsite.allwebs
Я получаю следующую ошибку:
$spsite.allwebs : Exception has been thrown by the target of an invocation
+ CategoryInfo : NotSpecified: (:) [], TargetInvocationExcept
+ FullyQualifiedErrorId : System.Reflection.TargetInvocationException
Я не понимаю, что я делаю не так, на моем другом сервере SP это работает нормально.
Заранее спасибо,
Редактировать Чтобы быть более ясным в моей проблеме, я опубликую здесь 2 скриншота, вы можете увидеть, что я вошел в систему как sp_admin
И я основной администратор в сборе сайта.
Здесь вы видите команды, которые я выполняю, и ошибку, которую я получаю.
Редактировать 2
$spsite.gettype
выход:
PS C:\Users\sp_admin> $spsite.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False SPSite System.Object
Решение
Я думаю, что это простая проблема с разрешениями. Get-Spsite позволит вам получить объект SPSITE (... по крайней мере, частичный), не имея разрешений на эту коллекцию сайтов. Но когда вы пытаетесь получить доступ к коллекции AllWebs, он бросает ошибку.
Чтобы подтвердить это, я создаю новую коллекцию сайтов и сделал кого -то, кроме меня первичным и средним администратором коллекции сайтов. Затем я запустил get-spsite против этой коллекции сайтов и возвращаю объект SPSite, но когда я получаю доступ к коллекции AllWebs, он бросил точно ту же ошибку, что и вы видите выше.
Другие советы
Все разрешения, необходимые для исправления этой ошибки:
- Администратор сбора сайтов на SPSite (независимо от того, дано ли он через центральный администратор или настройки сайта)
- PowerShell Scripting Admin:
add-spshelladmin domain\username
- Администратор сценариев PowerShell в базах данных контента:
get-spcontentdatabase | add-spshelladmin domain\username
Обратите внимание, что команды PowerShell должны управлять учетной записью фермы (или кем -то еще, у кого уже есть эти разрешения)
Синтаксис правильный. Вы получаете доступ ко всем сайтам в коллекции сайтов с пользователем, который выполняет подсказку PowerShell? Может быть, доступом отказано на одном из сайтов ...
Этот код сработал для меня!
[Microsoft.SharePoint.SPSecurity]::RunWithElevatedPrivileges({
$Site = Get-SPSite $siteUrl
Foreach ($web in $Site.AllWebs)
{
#do something..
$web.Dispose()
}
$Site.Dispose()
});
Видеть https://stackoverflow.com/questions/13142327/cannot-get-basic-sharepoint-powershell-script-to-run
Я нашел этот подход очень надежным, потому что сообщение об ошибке также может возникнуть в результате сайта, заблокированного из центральной администрирования. Повышение разрешений в этом сценарии все равно даст ошибку. Вот что сработало для меня.
try{
$allWebs = ($site | Select-Object -ExpandProperty AllWebs)
foreach($web in $allWebs){
# do something
}
} catch {
if($_.Exception.Message -match "Access to this Web site has been blocked."){
Write-Warning "`nSite Collection Locked: '{0}'`n" -f $site.Url
} else {
# something else is needed like script access to db or site collection full control
}
}