Start-BitsTransfer Работает, когда запускается вручную из powershell, но не использует службу Windows
Я использую биты для передачи файла с одного сервера Windows 2008 R2 на другой. Когда я запускаю команду вручную из powershell или обычной командной строки, она работает отлично. Теперь, когда я использую ту же команду, что и часть сценария сборки в Jenkins, происходит сбой со следующей ошибкой:
Start-BitsTransfer: Невозможно найти путь '\192.168.1.210\C$', поскольку он не существует.
Jenkins работает как служба Windows под учетной записью "Локальная система". Я думал, что изменение службы Windows для запуска под учетной записью "Сетевая служба" может помочь, но это не так.
Есть ли какая-то причина безопасности, которая не позволяет BITS запускаться из службы Windows?
Вот сценарий Powershell, который у меня есть deploy.ps1:
Function Get-PSCredential($User,$Password)
{
$SecPass = convertto-securestring -asplaintext -string $Password -force
$Creds = new-object System.Management.Automation.PSCredential -argumentlist $User,$SecPass
Return $Creds
}
$credential = Get-PSCredential -User jenkins -Password jenkins
Import-Module BitsTransfer
Start-BitsTransfer -source c:\file.zip -destination \\192.168.1.210\C$\Website -credential $credential
Подтверждение еще раз, приведенный выше скрипт powershell отлично работает, когда я запускаю его вручную, используя powershell или команду windows.
Это команда, которую я использую в Jenkins для запуска скрипта:
Powershell.exe -noprofile -executionpolicy Bypass -file C:\deploy.ps1
4 ответа
Вероятно, не тот ответ, на который вы надеялись:
При использовании командлетов *-BitsTransfer из процесса, который выполняется в неинтерактивном контексте, например в службе Windows, вы не сможете добавлять файлы в задания BITS, что может привести к приостановленному состоянию. Чтобы продолжить выполнение задания, необходимо войти в систему с идентификатором, который использовался для создания задания передачи. Например, при создании задания BITS в сценарии PowerShell, который был выполнен как задание планировщика задач, передача BITS никогда не завершится, если не включен параметр задачи "Запустить планировщик заданий", только когда пользователь вошел в систему ".
Из MSDN, где кажется, что это невозможно...
Помните, что доля 'C$' является административной, т.е. видимы и доступны только администраторам. Поэтому, если учетная запись службы, на которой запущена служба Jenkins, не имеет прав локального администратора для 192.168.1.210, вы получите эту ошибку - потому что она на самом деле не может найти указанный путь.
Попробуйте запустить службу Jenkins как учетную запись домена с локальным администратором на целевом сервере в качестве теста, и вы должны увидеть изменение поведения. Тогда вам просто нужно определить, какие разрешения нужны вашей учетной записи службы Jenkins.
В качестве альтернативы вы можете попробовать открыть общий доступ к папке "Веб-сайт" в качестве неадминистративного ресурса и посмотреть, может ли сетевой сервис получить к нему доступ. (Тогда вам может потребоваться предоставить исходному компьютеру доступ NTFS к папке).
Как Ландонз ответил, сначала это не может быть сделано. Но это на самом деле можно сделать, если вы готовы пройти через обручи.
Прочитайте это: Учетные записи служб и BITS - "... Вы можете использовать BITS для передачи файлов из службы. Служба должна использовать системную учетную запись LocalSystem, LocalService или NetworkService. Эти учетные записи всегда входят в систему; поэтому задания, представленные Сервис с использованием этих учетных записей всегда запускается..."
На основании того факта, что в сообщении об ошибке все начинается с одной обратной косой черты, это выглядит как проблема с выходом из строя. PowerShell имеет раздражающую привычку обрабатывать все, что начинается с обратной косой черты \
как регулярное выражение.
Попробуйте экранировать этот параметр. На ум приходят три возможных пути:
Просто избегайте первого обратного слеша:
`\\192.168.1.210\C$\Website
Одинарная кавычка - весь параметр
$
обрабатывается специально в двойных кавычках):'\\192.168.1.210\C$\Website'
Удвойте все обратные слеши:
\\\\192.168.1.210\\C$\\Website