Выполнение 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 отключен на обоих серверах. В чем дело?

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 \ versus \ tt-file.perf.corp). вместо.
  2. Вы можете использовать групповую политику (или настроить в IE, если это одноразовый компьютер) адреса для локальной зоны интрасети. Если это одноразовый компьютер, перейдите в Internet Explorer, Сервис, Свойства обозревателя, затем перейдите на вкладку Безопасность. Нажмите Local Intranet, Advanced, затем добавьте здесь свое полное доменное имя, как показано ниже.

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

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

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

Для получения дополнительной информации о подходе групповой политики, обратитесь к этой теме здесь на TechNet.

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

Другие вопросы по тегам