Назад | Перейти на главную страницу

Start-BitsTransfer работает при запуске вручную из PowerShell, но без использования службы Windows

Я использую BITS для передачи файла с одного сервера Windows 2008 R2 на другой. Когда я запускаю команду вручную из PowerShell или обычной командной строки, она работает отлично. Теперь, когда я использую ту же команду как часть сценария сборки в Jenkins, происходит сбой со следующей ошибкой:

Start-BitsTransfer: не удается найти путь '\ 192.168.1.210 \ C $', потому что он не существует.

Jenkins работает как служба Windows под учетной записью «Local System». Я подумал, что изменение службы 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 

Вероятно, не тот ответ, на который вы надеялись:

При использовании командлетов * -BitsTransfer в процессе, который выполняется в неинтерактивном контексте, например в службе Windows, вы не сможете добавлять файлы в задания BITS, что может привести к приостановке. Чтобы задание продолжилось, необходимо войти в систему с идентификатором, который использовался для создания задания передачи. Например, при создании задания BITS в сценарии PowerShell, который выполнялся как задание планировщика заданий, передача BITS никогда не будет завершена, если в планировщике заданий не будет включен параметр задачи «Запускать только при входе пользователя в систему».

Из MSDN, где кажется, что это невозможно ...

Помните, что доля «C $» является административной, т.е. видны и доступны только администраторам. Поэтому, если учетная запись службы, на которой запущена служба Jenkins, не имеет разрешений локального администратора на 192.168.1.210, вы получите эту ошибку, потому что она фактически не может найти указанный путь.

Попробуйте запустить службу Jenkins в качестве учетной записи домена с локальным администратором на целевом сервере в качестве теста, и вы должны увидеть изменение поведения. Затем вам просто нужно определить, какие разрешения нужны вашей учетной записи службы Jenkins.

В качестве альтернативы вы можете попробовать поделиться папкой «Веб-сайт» как неадминистративным ресурсом и посмотреть, может ли сетевая служба получить к ней доступ. (Затем вам может потребоваться предоставить исходному компьютеру доступ NTFS к папке).

Bsaed из-за того, что он начинается с одной обратной косой черты в сообщение об ошибке, это похоже на проблему с побегом. У PowerShell есть неприятная привычка обрабатывать все, что начинается с обратной косой черты. \ как регулярное выражение.

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

  1. Просто избегайте первой обратной косой черты:

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

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

    \\\\192.168.1.210\\C$\\Website
    

Как ответил Ландонц, поначалу это невозможно. Но на самом деле это можно сделать, если вы готовы пройти через обручи.

Прочитайте это: Учетные записи служб и BITS - "... Вы можете использовать BITS для передачи файлов из службы. Служба должна использовать системную учетную запись LocalSystem, LocalService или NetworkService. Эти учетные записи всегда входят в систему, поэтому задания, отправленные службой с использованием этих учетных записей, всегда выполняются. ... "