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 имеет раздражающую привычку обрабатывать все, что начинается с обратной косой черты \ как регулярное выражение.

Попробуйте экранировать этот параметр. На ум приходят три возможных пути:

  1. Просто избегайте первого обратного слеша:

    `\\192.168.1.210\C$\Website
    
  2. Одинарная кавычка - весь параметр $ обрабатывается специально в двойных кавычках):

    '\\192.168.1.210\C$\Website'
    
  3. Удвойте все обратные слеши:

    \\\\192.168.1.210\\C$\\Website
    
Другие вопросы по тегам