Adlis
Adlis

Reputation: 115

Does Posh-ssh not work with windows Task Scheduler

Been trying to connect to an sftp using posh-ssh. Works fine when i run it, when i try running it through windows task scheduler it does not work.

I have tried switching around the users that are to run the script such as Admin, myself, system, etc.

I have tried using keys to save the password and decrypt it later on.

$Password = ConvertTo-SecureString 'sftpPW' -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 
$sftpIP = 'hostIP'
$sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential

And then other method VVVVVVVVVV this part is run not in the script but is to create a password

Get-Random -Count 32 -InputObject (0..255) | Out-File -FilePath encrypt
ConvertTo-SecureString 'sftpPW' -AsPlainText -Force | convertFrom-secureString -key (get-content -path encrypt) | Out-File pw

^^^^^^^^^^

$SFTPUser="user"
$password = (cat pw | ConvertTo-SecureString -key (Get-Content -path encrypt))
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 
$sftpIP = 'hostIP'
$sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential

edit*

Import-Module Posh-SSH
$datestuff = Get-Date
echo "start $datestuff" > C:\sftptestlog
$SFTPUser="user"
echo $sftpuser >> C:\sftptestlog
$Password = ConvertTo-SecureString 'sftpPW' -AsPlainText -Force
echo $password >> C:\sftptestlog
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 
$sftpIP = 'hostip'

echo $Credential >> C:\sftptestlog
echo $sftpip >> C:\sftptestlog
$sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential
echo $sftpSess >> C:\sftptestlog

expected output from sftptestlog

start 09/10/2019 16:31:19

user

System.Security.SecureString

UserName Password

-------- --------

user System.Security.SecureString

hostIP

SessionId Host Connected

--------- ---- ---------
2 hostIP True

above output only happens when the script is run from the command line. When using scheduler the output is the same only the last lines (starting from sessionID) are not printed out.

Upvotes: 2

Views: 2147

Answers (4)

Jesse B
Jesse B

Reputation: 31

Figured this out after lots of head bashing. The issue is that the SSH connection waits for you to accept the SSL certificate as valid. So it pauses at the New-SFTPSession waiting for your input. If you run it as yourself, it only asks once so you probably clicked OK and never had to again.

No amount of error checking or importing the module is going to fix that.

Include the flags -AcceptKey -Force and it works like a champ.

New-SFTPSession -ComputerName $server -Credential $creds -AcceptKey -Force

Upvotes: 3

David Culbertson
David Culbertson

Reputation: 11

To avoid issues with the path to the posh-ssh module, you can install it with:

install-module posh-ssh -Scope AllUsers

Upvotes: 0

Adlis
Adlis

Reputation: 115

Found out that the ENV:PSModulePath didn't have the path to where the module was installed when using task scheduler. When importing the module I linked directly to where the module was. Import-Module "C:\Program Files\WindowsPowerShell\Modules\Posh-SSH"

Upvotes: 2

Scepticalist
Scepticalist

Reputation: 3923

I'd highly recommend you put some logging into your script so that you can diagnose this sort of thing as the task scheduler event log won't help very much at all. An easy way is to use Start-Transcript

# Put this line at the very start of your script
Start-Transcript -Path 'c:\temp\sftplog.txt'

Write-Host 'Setting up user credentials'
$Password = ConvertTo-SecureString 'sftppassword' -AsPlainText -Force
$SFTPUser="username"
$Credential = New-Object System.Management.Automation.PSCredential($SFTPUser, $Password) 

# Destination host
$sftpIP = 'hostip'
Write-Host 'Destination host is $sftpIP, testing availability'
Try {
    Test-Connection -ComputerName $sftpIP -ErrorAction Stop
    Write-Host 'Host is contactable'
}
Catch {
    $_.Exception
}


# Attempt connection
Try {
    Write-Host 'Trying to connect via SFTP to $SftpIP'
    $sftpSess = New-SFTPSession -ComputerName $SftpIp -Credential $Credential -ErrorAction Stop
    Write-Host 'Done'
}
Catch {
    $_
}

# Put this line at the very end of your script
Stop-Transcript

You can remove the Transcript and/or all the Write-Host commands when you've diagnosed the issue.

Upvotes: 1

Related Questions