Почему PowerShell не работает, если я использую WinRS?

У меня есть файл "test.ps1", и его содержимое указано ниже:

$getRSDBName =
{
    Add-PSSnapIn Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
    $rsdb = Get-SPRSDatabase

    return $rsdb
}


$rsdb = invoke-command  -scriptblock $getRSDBName 

$rsdb

Это работает, если я называю это как:

powershell -f c:\test.ps1

Я получаю сообщение об ошибке, если использую WinRS:

winrs -r:xxxxx -u:xxxxxx -p:xxxxx powershell -f c:\test.ps1

Я тоже пробовал вводя -Authentication CredSSP -Credential $creds в качестве параметров Invoke-Command, но я получил тот же результат, что и раньше. В обоих случаях ошибка:

Местная ферма не доступна. Командлеты с FeatureDependencyId не зарегистрированы. Get-SPRSDatabase: невозможно получить доступ к локальной ферме. Убедитесь, что локальная ферма правильно настроена, доступна в данный момент и что у вас есть соответствующие миссии для доступа к базе данных, прежде чем пытаться снова. В C:\clean.ps1:181 char:29 + $rsdb = Get-SPRSDatabase <<<< + CategoryInfo: InvalidData: (Microsoft.Repor...ServiceDatabase: GetReportingServiceDatabase) [Get-SPRSDatabase], SPCmdletException + FullyQualifiedErrorId: Microsoft.ReportingServices.SharePoint.PowerShell.GetReportingServiceDatabase

Может ли кто-нибудь объяснить, что происходит?

2 ответа

Это вызвано проблемой "второго прыжка", описанной здесь, когда командлет на удаленном сервере, в свою очередь, пытается достичь базы данных sql (он должен передать ему учетные данные, но они не могут быть делегированы во второй раз)

чтобы решить это запустите следующее на сервере

Enable-WSManCredSSP –Role server

и это на клиенте (требует повышенных привилегий)

Enable-WSManCredSSP –Role client –DelegateComputer *

тогда не забудьте использовать

$session = New-PSSession -ComputerName $computer -Credential $credential -Authentication CredSSP

когда вы открываете удаленный сеанс и передаете $session для вызова invoke

Invoke-Command -ScriptBlock $doSomething -Session $session  

это решило для меня:) в общем я обнаружил, что любая странная проблема, которую я нахожу при использовании invoke-команды, так или иначе связана с проблемой второго прыжка. Это на самом деле функция безопасности, поэтому она здесь, чтобы помочь нам, даже если это немного скучно, но это не так сложно решить

Можете ли вы создать PS-сессию, а затем запустить скрипт в этой удаленной оболочке? Если так, почему бы не добавить сеанс создания / уничтожения в ваш текущий скрипт?

$Session = New-PSSession -ComputerName "computerNameHere"
Import-PSSession -Session $Session

$getRSDBName = {
    Add-PSSnapIn Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
    $rsdb = Get-SPRSDatabase

    return $rsdb
}
$rsdb = invoke-command  -scriptblock $getRSDBName 
$rsdb

Remove-PSSession -ComputerName "computerNameHere"
Другие вопросы по тегам