teamcity powershell - невозможно запустить пакетный файл

Я потратил довольно много времени, ударяя головой об этом. Небольшая помощь по StackOverflow, добрые люди!

Сценарий: мы пытаемся запустить пользовательский файл .bat, расположенный на сервере CI, с помощью шага TeamCity Powershell.

  • Когда сценарий powershell запускается на локальном компьютере вручную, он правильно запускает файл .bat.
  • Когда сценарий powershell запускается через TeamCity, он успешно «видит» файл .bat (подтверждается получением ответа «не удается найти файл», когда я переименовываю ожидаемый файл .bat)
  • ОДНАКО мы не видели никаких указаний на то, что файл .bat действительно был запущен.

Что мы пробовали:

  • Мы добавили «RedirectStandardOutput» и «RedirectStandardError» для попытки диагностики, но, хотя файл журнала создается, он возвращается пустым.
  • Мы предоставили разрешения на путь к файлу и попробовали два разных учетных данных, включая учетные данные агента сборки TC.
  • В какой-то момент добавлено «-wait», чтобы узнать, нужно ли нам «говорить» PS об ожидании файла .bat.

Два вопроса...

  • Что мешает нам запустить этот .bat файл?
  • Как мы диагностируем такие проблемы? Банкомат для нас – это «черный ящик».

Настройки TeamCity Powershell:

  • Режим работы Powershell: версия 1.0; Разрядность x64 (пробовал и x86)
  • Рабочий каталог: Пробовал как пустой и определенный путь к файлу .bat (таким образом, «D:\folder\folder2\»)
  • Скрипт: Исходный код
  • Выполнение скрипта: выполнить .ps1 из внешнего файла (также пробовали с «Поместить скрипт в PowerShell stdin с аргументом «-Command-»»)
  • Добавить аргумент -NoProfile (пробовал оба)

Сценарий Powershell:

#Predefine necessary information
$Username = "DOMAIN\username"
$Password = "password"
$ComputerName = "CI Build Server Name"

#Create credential object
$SecurePassWord = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $Username, $SecurePassWord

#Start batch file
Start-Process "testbat.bat" -WorkingDirectory D:\file\path\ -Credential ($Cred)-NoNewWindow -RedirectStandardError stderr.txt -RedirectStandardOutput stdout.txt

Write-Host "Executed powershell."

ОБНОВЛЕНИЕ 1: если мы удалим часть «-Credential ($Cred)», мы сможем запустить файл testbat.bat из TeamCity, как и ожидалось. Проблема должна каким-то образом заключаться в этом аргументе "-Credential ($Cred)". Есть предположения?

ОБНОВЛЕНИЕ 2: если мы установим часть «-Credential ($Cred)» на учетные данные пользователя агента сборки, мы сможем запустить файл test.bat из TeamCity. Проблема возникает только тогда, когда мы устанавливаем учетные данные для пользователя, отличного от того, который запускает агент сборки. Кажется, это указывает на то, что синтаксис учетных данных в порядке.

ОБНОВЛЕНИЕ 3. Попытка запуска с политикой выполнения PowerShell, установленной на «RemoteSigned» и «Unrestricted». Проблема сохраняется.

ОБНОВЛЕНИЕ 4: предоставили пользователю BuildAgent и пользователю, от имени которого мы хотим запустить это, полные разрешения на powershell через «Set-PSSessionConfiguration». Проблема сохраняется.


person ECD    schedule 25.03.2015    source источник


Ответы (2)


$credential = New-Object System.Management.Automation.PsCredential(".\user", (ConvertTo-SecureString "pass" -AsPlainText -Force))
     Start-Process powershell -Credential $credential -ArgumentList '-noprofile -command &{Start-Process  D:\file\path\test.bat -NoNewWindow -RedirectStandardError stderr.txt -RedirectStandardOutput stdout.txt }'

примечание:
сначала я получаю учетные данные "user" ur user, затем конвертирую ваш пароль в обычный текст
затем запускаю процесс с вашим набором учетных данных

person Soheil Hashemi    schedule 25.03.2015
comment
Привет, Сохейл. Сначала я протестировал это изменение синтаксиса на своем локальном скрипте, и он работал так же, как и раньше. Затем я внес изменения в свой шаг powershell teamcity, но .bat все еще не запускается. Одно отличие заключалось в том, что с этим изменением синтаксиса «stderr.txt» и «stdout.txt» не создаются. Раньше они создавались пустыми. - person ECD; 26.03.2015
comment
echo %username% › D:\path\path\log.txt ; Каковы ваши настройки шага powershell? - person ECD; 26.03.2015
comment
@ECD твои средства $env:USERNAME > username.txt ? - person Soheil Hashemi; 27.03.2015
comment
файл .bat, который я пытаюсь вызвать из сценария powershell, имеет синтаксис echo %username% › D:\path\path\log.txt. Локально работает, но нужно ли его менять? - person ECD; 27.03.2015
comment
echo %username% > path не имеет проблем до тех пор, пока вы не перенаправите вывод на путь с привилегией пользователя, не имеющего доступа к пути в месте назначения, которое вы запускаете летучей мыши, у вас есть доступ к d:\path ? или не проверять разрешение ntfs на запись и изменение разрешения на путь - person Soheil Hashemi; 27.03.2015
comment
После удаления аргумента «$Cred» мы можем запустить testbat.bat из teamcity. Похоже, TeamCity имеет права доступа к нужным папкам/файлам. Виной тому аргумент $Cred, который мы каким-то образом используем... - person ECD; 28.03.2015
comment
Я без проблем тестирую этот скрипт на 2 окнах. Вы используете аргумент -WorkingDirectory для запуска процесса? просто используйте полный путь к скрипту, я имею в виду d:\path\1.bat, d:\stderr.txt, d:\stdout.txt - person Soheil Hashemi; 28.03.2015
comment
Мы пробовали использовать как «-WorkingDirectory» в Start-Process, так и в настройках TeamCity Powershell. Это не имеет значения. Кроме того, мы можем запускать файл .bat из TeamCity, когда мы удаляем $Cred, так что это не похоже на проблему с расположением файла. Проблема связана с компонентом $Cred. Он отлично работает при непосредственном запуске локального сценария PowerShell, но не работает при попытке через TeamCity. - person ECD; 30.03.2015
comment
Сохейл, вы знаете кого-нибудь из представителей TeamCity, с которыми мы могли бы обсудить? Со временем это становится все более серьезной проблемой. - person ECD; 30.03.2015
comment
@ECD Я не работаю с teamcity, я dl teamcity и тестирую свой скрипт, а затем уведомляю вас - person Soheil Hashemi; 30.03.2015
comment
Без проблем! Я просто решил проверить. - person ECD; 30.03.2015

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

  1. Запустите агент через командную строку.
  2. Попробуйте запустить службу агента под другой учетной записью (не Local System) с правами администратора, возможно, это поможет.
  3. Попробуйте плагин RunAs. Он предоставляет возможность запускать сборки под указанной учетной записью пользователя.
person Alina Mishina    schedule 22.03.2016