Выполнение Powershell на удаленном сервере завершается сбоем, если путь к сценарию указан полностью

У меня есть два сервера под управлением Windows Server 2012 R2 в одном домене: \tt-sql.perf.corp и \tt-file.perf.corp. Сценарий Powershell находится в общей папке на файловом сервере \tt-file.perf.corp\fileshare\helloworld.ps1. У меня есть приложение на сервере sql, выполняющее следующую команду:

powershell -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command "& '\tt-file.perf.corp\fileshare\helloworld.ps1'"

Это терпит неудачу со следующей ошибкой:

& : Ошибка проверки AuthorizationManager. В строке: 1 символ: 3 + & '\tt-file.perf.corp\fileshare\helloworld.ps1' + ~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId: UnauthorizedAccess

Это также не работает, если я изменю путь для использования IP-адреса.

Однако это работает, когда путь к сценарию не указан полностью: powershell -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command "& '\tt-file\fileshare\helloworld.ps1'"

Служба инструментария управления Windows работает на обоих серверах. Я также запустил Get-ExecutionPolicy на обоих серверах, и для обоих установлено значение Unrestricted. UAC отключен на обоих серверах. Что происходит?


person themilkyninja    schedule 24.03.2015    source источник


Ответы (1)


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

Более подробные сведения можно найти в этом сообщении блога. ; на самом деле это происходит потому, что когда вы указываете полное доменное имя для сервера, вы нарушаете одну из функций безопасности PowerShell/Windows. Несмотря на то, что вы указываете, что PowerShell должен обходить обычную политику выполнения, запуск с полного доменного имени заставляет Windows полагать, что этот файл исходит из Интернета, и поэтому PowerShell хочет отобразить вам предупреждение, подобное этому:

Run only scripts that you trust. While scripts from the Internet can be
useful, this script can potentially harm your computer. Do you want to run  
\\tt-file.perf.corp\fileshare\helloworld.ps1?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D"):

Но это невозможно, потому что вы запускаете оболочку в неинтерактивном режиме.


Итак, у вас есть два варианта решения этой проблемы:

  1. Как упоминается в этом сообщении в блоге, вы можете решить проблему, сделав путь UNC доверенным сайтом в IE или используя только короткое имя, как вы видели (используя \tt-file\ вместо \tt-file.perf.corp) вместо.
  2. Вы можете использовать групповую политику (или настроить в IE, если это одноразовый компьютер) адреса для локальной зоны интрасети. Если это одноразовая машина, перейдите в Internet Explorer, Инструменты, Свойства обозревателя, затем перейдите на вкладку «Безопасность». Нажмите «Местная интрасеть», «Дополнительно», затем добавьте сюда свое полное доменное имя, как показано ниже.

Настройка подсказки безопасности полного доменного имени для одного компьютера

Если это параметр, который вы хотите настроить глобально, укажите путь, как я сделал выше, в следующем месте в консоли управления групповыми политиками:

Конфигурация пользователя, разверните Политики > Параметры Windows > Обслуживание Internet Explorer > Безопасность 3. Дважды щелкните Зоны безопасности и рейтинги содержимого, затем выберите Импортировать текущие зоны безопасности и параметры конфиденциальности.

Для получения дополнительной информации о подходе групповой политики, local-intranet-sites-zone-via-gpo" rel="noreferrer">см. эту ветку здесь, на TechNet.

Надеюсь, это поможет! К сожалению, я не могу придумать хороший способ PowerShell для решения этой проблемы :).

person FoxDeploy    schedule 24.03.2015
comment
Спасибо за информацию, это объясняет. Знаете, почему я не увижу эту проблему в другом внутреннем домене? Насколько я могу судить, не существует групповой политики для добавления домена в локальную интрасеть, и она не задана в IE. Я не уверен, где еще искать, чтобы узнать, что может позволить ему работать. - person themilkyninja; 26.03.2015
comment
В Internet Explorer есть настройка в той же области, о которой я упоминал перед доверенными сайтами, в любом случае есть флажок, который вы можете установить, чтобы автоматически определить сайты интрасети и обойти систему безопасности. Возможно, этот флажок установлен? - person FoxDeploy; 26.03.2015