I've a little Powershell script, it creates New Background Job, who contains New-PsDrive and Copy-Item.
Start-Job -ScriptBlock {
$shareadress = "\\172.22.0.100\c$"
$username = "Springfield\Administrator"
$pwd = "MyPassword"
$password = ConvertTo-SecureString -AsPlainText -Force -String $pwd
$credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username,$password
New-PSDrive TEMPO -PSProvider filesystem -Root $shareadress -Credential $credentials -Scope global
Copy-Item "C:\test.txt" -Destination "TEMPO:\test.txt"
Remove-PSDrive TEMPO
}
Get-Job | Wait-Job
Get-Job | Receive-Job
Remove-Job -State Completed
When i execute it, i got this, and it never end... it's stuck in Running State :
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
28 Job28 BackgroundJob Running True localhost ...
When i execute it without Job, it works :
$shareadress = "\\172.22.0.100\c$"
$username = "Springfield\Administrator"
$pwd = "MyPassword"
$password = ConvertTo-SecureString -AsPlainText -Force -String $pwd
$credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username,$password
New-PSDrive TEMPO -PSProvider filesystem -Root $shareadress -Credential $credentials -Scope global
Copy-Item "C:\test.txt" -Destination "TEMPO:\test.txt"
Remove-PSDrive TEMPO
Can someone explain me why? I searched a lot on Google, but can't find any explanation..
Thanks for your help
This is how i resolved it :
Start-Job -ScriptBlock {
$destination = $letter+"\test.txt"
$letter = ls function:[d-z]: -n | ?{ !(test-path $_) } | random
$shareadress = "\\172.22.0.100\c$"
$username = "Springfield\Administrator"
$password = "MyPassword"
Net use $letter $shareadress /user:$username $pwd | Out-Null
Copy-Item "C:\test.txt" -Destination $destination
Net use $letter /delete | Out-Null
}
Get-Job | Wait-Job
Get-Job | Receive-Job
Remove-Job -State Completed
I used Net-use instead of New-Psdrive.
I think there is a bug with Remote Psdrive and powershell jobs.
It's entirely possible that the job doesn't have sufficient context to map a drive with New-PsDrive cmdlet
I'll also report it on https://connect.microsoft.com/PowerShell/Feedback
This question was asked a long time ago but I have done some troubleshooting on a similar situation so thought I'd post here.
From what I've found, it seems to be an issue with creating the PSCredential object within the job. If it's passed as a parameter to the job, it seems to work fine. The following script illustrates this (and the workaround).
C:\scripts\MySimpleJob.ps1:
Param(
[string] $computer,
[pscredential] $DeploymentCredential
)
if($DeploymentCredential -eq $null)
{
$securePass = Get-Content "C:\scripts\passwords\dijital.txt" | ConvertTo-SecureString
$DeploymentCredential = New-Object PsCredential 'foobar\dijital', $SecurePass
}
New-PSDrive -Name TargetServer -PSProvider FileSystem -Root ('\\' + $computer + '\c$') -Credential $deploymentCredential | Out-Null
$testinglog = 'TargetServer:\temp\TEST.txt'
if(Test-Path -Path $testinglog)
{
Remove-Item -Path $testinglog -Force
}
New-Item $testinglog -ItemType 'File' -Force
((Get-Date -Format "yyyy-MM-dd\THH\:mm:ss:fff: ") + 'I can write to this file!') | Out-File -FilePath $testinglog
If I launch this script as a job without the $DeploymentCredential parameter, it is decrypted from a file within the job and will hang:
$job = Start-Job -ScriptBlock {
C:\scripts\MySimpleJob.ps1 -Computer $args[0]
}`
-ArgumentList @( 'MYTESTSERVER')
Wait-Job -Job $job
($job.PSEndTime - $job.PSBeginTime).TotalSeconds
However, if I pass the $DeploymentCredential parameter (which I obtain in exactly the same way), the job will complete normally in less than 1 second:
$SecurePass = Get-Content "C:\scripts\passwords\dijital.txt" | ConvertTo-SecureString
$DeploymentCredential = New-Object PsCredential 'foobar\dijital', $SecurePass
$job = Start-Job -ScriptBlock {
C:\scripts\MySimpleJob.ps1 -Computer $args[0] -deploymentCredential $args[1]
}`
-ArgumentList @( 'MYTESTSERVER' , $DeploymentCredential)
Wait-Job -Job $job
($job.PSEndTime - $job.PSBeginTime).TotalSeconds
In PowerShell 4.0 the job will stay in the running state indefinitely. In PowerShell 5.1, it will hang for ~180 seconds and then terminate.
In both situation the file is written to correctly and I've also added logging to the very end of the job and it is definitely reaching the last line of the MySimpleJob.ps1 script.
I will raise this on the UserVoice PowerShell forum as I can't find anything raised there yet.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With