Start-BitsTransfer Funciona quando acionado manualmente a partir do powershell, mas não usando um serviço do windows

1

Estou usando o BITS para transferir arquivos de um servidor do Windows 2008 R2 para o outro. Quando eu executo o comando manualmente a partir do powershell ou da linha de comando regular, ele funciona perfeitamente. Agora, quando eu uso o mesmo comando como parte de um script de compilação no Jenkins, ele falha com o seguinte erro:

Start-BitsTransfer: Não é possível encontrar o caminho '\ 192.168.1.210 \ C $' porque ele não existe.

O Jenkins é executado como um serviço do Windows na conta "Sistema local". Achei que mudar o serviço do Windows para ser executado na conta "Serviço de Rede" pode ajudar, mas esse não é o caso.

Existe algum motivo de segurança que não permite que o BITS seja executado a partir de um serviço do Windows?

Aqui está o script do Powershell que eu tenho 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

Confirmando novamente, o script PowerShell acima funciona perfeitamente quando eu o inicio manualmente usando o comando powershell ou windows.

Este é o comando que eu uso no Jenkins para acionar o script:

Powershell.exe -noprofile -executionpolicy Bypass -file C:\deploy.ps1 
    
por newbie 01.06.2013 / 23:23

4 respostas

2

Provavelmente não é a resposta que você esperava:

When you use *-BitsTransfer cmdlets from within a process that runs in a noninteractive context, such as a Windows service, you may not be able to add files to BITS jobs, which can result in a suspended state. For the job to proceed, the identity that was used to create a transfer job must be logged on. For example, when creating a BITS job in a PowerShell script that was executed as a Task Scheduler job, the BITS transfer will never complete unless the Task Scheduler's task setting "Run only when user is logged on" is enabled.

De MSDN , onde parece não ser possível ...

    
por 23.01.2015 / 16:40
1

Lembre-se de que o compartilhamento 'C $' é um compartilhamento administrativo, ou seja. visível e acessível apenas pelos administradores. Portanto, a menos que a conta de serviço que executa o serviço Jenkins tenha permissões de administrador local em 192.168.1.210, você obterá esse erro, porque na verdade não pode encontrar o caminho especificado.

Tente executar o serviço Jenkins como uma conta de domínio que tenha o Admin local no servidor de destino como um teste, e você deverá ver a mudança de comportamento. Então você só precisaria determinar quais permissões sua conta de serviço do Jenkins precisa.

Como alternativa, você pode tentar compartilhar a pasta "Website" como um compartilhamento não administrativo e verificar se o serviço de rede pode acessá-la. (Você pode então precisar dar ao computador de origem acesso NTFS à pasta).

    
por 04.06.2013 / 15:28
0

Por causa do fato de que ele começa com uma única barra invertida na mensagem de erro , parece um problema de escape. O PowerShell tem um hábito irritante de tratar qualquer coisa que comece com uma barra invertida \ como uma expressão regular.

Tente escapar desse parâmetro. Três maneiras possíveis vêm à mente:

  1. Basta escapar da primeira barra invertida:

    '\192.168.1.210\C$\Website
    
  2. Cite o parâmetro inteiro (não as aspas duplas porque $ é tratado especialmente em itens com aspas duplas):

    '\192.168.1.210\C$\Website'
    
  3. Duplique todas as barras invertidas:

    \\192.168.1.210\C$\Website
    
por 01.06.2013 / 23:48
0

Como Landonz respondeu, a princípio, isso não pode ser feito. Mas isso realmente pode ser feito, se você estiver disposto a passar pelos aros.

Leia isto: Contas de serviço e BITS - " ... Você pode usar o BITS para transferir arquivos de um serviço.O serviço deve usar a conta do sistema LocalSystem, LocalService ou NetworkService.Essas contas estão sempre conectadas, portanto, as tarefas enviadas por um serviço usando essas contas sempre são executadas .. "

    
por 23.01.2015 / 20:29