Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Send files over PSSession

Tags:

I just burned a couple of hours searching for a solution to send files over an active PSSession. And the result is nada, niente. I'm trying to invoke a command on a remote computer over an active session, which should copy something from a network storage. So, basically this is it:

icm -Session $s { Copy-Item $networkLocation $PCLocation } 

Because of the "second hop" problem, I can't do that directly, and because I'm running win server 2003 I cant enable CredSSP. I could first copy the files to my computer and then send/push them to the remote machine, but how? I tried PModem, but as I saw it can only pull data and not push.

Any help is appreaciated.

like image 865
kalbsschnitzel Avatar asked May 17 '12 11:05

kalbsschnitzel


People also ask

How do you use PSSession?

Use a PSSession to run multiple commands that share data, such as a function or the value of a variable. To run commands in a PSSession, use the Invoke-Command cmdlet. To use the PSSession to interact directly with a remote computer, use the Enter-PSSession cmdlet.

What is the purpose of PSSession?

Why Use a PSSession? Use a PSSession when you need a persistent connection to a remote computer. With a PSSession, you can run a series of commands that share data, such as the value of variables, the contents of a function, or the definition of an alias. You can run remote commands without creating a PSSession.


2 Answers

This is now possible in PowerShell / WMF 5.0

Copy-Item has -FromSession and -toSession parameters. You can use one of these and pass in a session variable.

eg.

$cs = New-PSSession -ComputerName 169.254.44.14 -Credential (Get-Credential) -Name SQL Copy-Item Northwind.* -Destination "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\" -ToSession $cs 

See more examples at here, or you can checkout the official documentation.

like image 88
David Gardiner Avatar answered Oct 21 '22 16:10

David Gardiner


If it was a small file, you could send the contents of the file and the filename as parameters.

$f="the filename" $c=Get-Content $f invoke-command -session $s -script {param($filename,$contents) `      set-content -path $filename -value $contents} -argumentlist $f,$c 

If the file is too long to fit in whatever the limits for the session are, you could read the file in as chunks, and use a similar technique to append them together in the target location


PowerShell 5+ has built-in support for doing this, described in David's answer.

like image 35
Mike Shepard Avatar answered Oct 21 '22 18:10

Mike Shepard