2012-05-17 12 views
19

アクティブなPSSession上でファイルを送信するソリューションを探して数時間を焼いただけです。結果はnada、nienteです。私はアクティブなセッションを介してリモートコンピュータ上でコマンドを呼び出そうとしています。アクティブなセッションはネットワークストレージから何かをコピーする必要があります。PSSession経由でファイルを送信

ため、「第2のホップ」問題の
icm -Session $s { 
Copy-Item $networkLocation $PCLocation } 

、私は直接それを行うことができない、と私は勝利Server 2003を実行していますので、私はのCredSSPを有効に傾ける:だから、基本的にこれはそれがあります。最初にファイルを自分のコンピュータにコピーしてから、リモートマシンに送信/プッシュすることはできますが、どうすればよいですか?私はPModemを試しましたが、私が見たように、データをプルするだけでプッシュすることはできません。

助けが必要です。

+1

なぜネットワーク共有を使用してファイルをコピーしないのですか? – JPBlanc

+1

良いですが、高い権限がそれを承認しません:) –

+1

リモートコンピュータをADで "信頼された委任"にすることができれば、CredSSPなしでセカンドホップを実行できます。 –

答えて

17

小さなファイルの場合は、ファイルの内容とファイル名をパラメータとして送信できます。

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

ファイルはセッションの制限があるものは何でもに収まるように長すぎる場合、あなたはチャンクとしてでファイルを読み込み、それらを一緒に追加するために同様の技術を使用することができ、ターゲットの場所に

+1

'$ f == $ filename'と' $ c == $ contents' ?? –

+2

$ filenameと$ contentsはスクリプトブロック内のパラメータの名前です。 $ fと$ cはスクリプトブロックに渡される変数です。 –

2

私はずっと前と同じ問題に直面し、PS Remotingセッションでファイルを送信するための概念実証をまとめました。

https://gist.github.com/791112

#requires -version 2.0 

[CmdletBinding()] 
param (
    [Parameter(Mandatory=$true)] 
    [string] 
    $ComputerName, 

    [Parameter(Mandatory=$true)] 
    [string] 
    $Path, 

    [Parameter(Mandatory=$true)] 
    [string] 
    $Destination, 

    [int] 
    $TransferChunkSize = 0x10000 
) 

function Initialize-TempScript ($Path) { 
    "<# DATA" | Set-Content -Path $Path 
} 

function Complete-Chunk() { 
@" 
DATA #> 
`$TransferPath = `$Env:TEMP | Join-Path -ChildPath '$TransferId' 
`$InData = `$false 
`$WriteStream = [IO.File]::OpenWrite(`$TransferPath) 
try { 
    `$WriteStream.Seek(0, 'End') | Out-Null 
    `$MyInvocation.MyCommand.Definition -split "``n" | ForEach-Object { 
     if (`$InData) { 
      `$InData = -not `$_.StartsWith('DATA #>') 
      if (`$InData) { 
       `$WriteBuffer = [Convert]::FromBase64String(`$_) 
       `$WriteStream.Write(`$WriteBuffer, 0, `$WriteBuffer.Length) 
      } 
     } else { 
      `$InData = `$_.StartsWith('<# DATA') 
     } 
    } 
} finally { 
    `$WriteStream.Close() 
} 
"@ 
} 

function Complete-FinalChunk ($Destination) { 
@" 
`$TransferPath | Move-Item -Destination '$Destination' -Force 
"@ 
} 

$ErrorActionPreference = 'Stop' 
Set-StrictMode -Version Latest 

$EncodingChunkSize = 57 * 100 
if ($EncodingChunkSize % 57 -ne 0) { 
    throw "EncodingChunkSize must be a multiple of 57" 
} 

$TransferId = [Guid]::NewGuid().ToString() 


$Path = ($Path | Resolve-Path).ProviderPath 
$ReadBuffer = New-Object -TypeName byte[] -ArgumentList $EncodingChunkSize 

$TempPath = ([IO.Path]::GetTempFileName() | % { $_ | Move-Item -Destination "$_.ps1" -PassThru}).FullName 
$Session = New-PSSession -ComputerName $ComputerName 
$ReadStream = [IO.File]::OpenRead($Path) 

$ChunkCount = 0 
Initialize-TempScript -Path $TempPath 

try { 
    do { 
     $ReadCount = $ReadStream.Read($ReadBuffer, 0, $EncodingChunkSize) 
     if ($ReadCount -gt 0) { 
      [Convert]::ToBase64String($ReadBuffer, 0, $ReadCount, 'InsertLineBreaks') | 
       Add-Content -Path $TempPath 
     } 
     $ChunkCount += $ReadCount 
     if ($ChunkCount -ge $TransferChunkSize -or $ReadCount -eq 0) { 
      # send 
      Write-Verbose "Sending chunk $TransferIndex" 
      Complete-Chunk | Add-Content -Path $TempPath 
      if ($ReadCount -eq 0) { 
       Complete-FinalChunk -Destination $Destination | Add-Content -Path $TempPath 
       Write-Verbose "Sending final chunk" 
      } 
      Invoke-Command -Session $Session -FilePath $TempPath 

      # reset 
      $ChunkCount = 0 
      Initialize-TempScript -Path $TempPath 
     } 
    } while ($ReadCount -gt 0) 
} finally { 
    if ($ReadStream) { $ReadStream.Close() } 
    $Session | Remove-PSSession 
    $TempPath | Remove-Item 
} 

いくつかのマイナーな変更は、それが新しいものを開始する代わりに、それをパラメータとしてセッションを受け入れることができます:あなたはここにスクリプトを見つけることができます。私は、大きなファイルを転送するときに、宛先コンピュータ上のRemotingサービスのメモリ消費量がかなり大きくなることがわかった。私は、PS Remotingが本当にこのように使われるようには設計されていないと思う。

31

これは-FromSession-toSessionパラメータを持っている5.0

Copy-ItemのPowerShell/WMFで可能になりました。これらのうちの1つを使用して、セッション変数を渡すことができます。

例えば、

$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 

実際には最大ファイルサイズの制限があるかわからないhttps://richardspowershellblog.wordpress.com/2015/05/28/copy-files-over-ps-remoting-sessions/

0
$data = Get-Content 'C:\file.exe' -Raw 
Invoke-Command -ComputerName 'server' -ScriptBlock { $using:data | Set-Content -Path 'D:\filecopy.exe' } 

でより多くの例を参照してください。

+0

'get-data'とは何ですか? – Mark

+0

それは私の頭の上からpowershellを入力するだろう。明らかに 'Get-Content'だったはずです – mtnielsen

1

NET USEあなたは、あなたがあなたのPSSessionで、あるいはPSSessionはなくて、ドライブ文字を使用することができますリモートシステムのためのローカルドライブ文字を追加することができます。これはPowershell v5をお持ちでない場合に役立ちます。0は、あなたが行うとしても、

リモートUNCパスの一部として、リモートマシン名またはそのIPアドレスを使用することができ、あなたは、同じライン上のユーザ名とパスワードの資格情報を指定することができます。

NET USE Z: \\192.168.1.50\ShareName /USER:192.168.1.50\UserName UserPassword 

別の例:

NET USE Z: \\RemoteSystem\ShareName /USER:RemoteSystem\UserName UserPassword 

OR

NET USE Z: \\RemoteSystem\ShareName /USER:Domain\UserName UserPassword 

あなたはユーザーCRを指定しない場合同じ行のedentials、あなたが彼らのために求められます。

>NET USE Z: \\192.168.1.50\ShareName 
Enter the user name for '192.168.1.50': 192.168.1.50\UserName 
Enter the password for 192.168.1.50: ***** 
The command completed successfully. 

あなたが次で終了したら、あなたは、ドライブ文字を削除することがあります。

NET USE Z: /delete 

あなたはNETとの完全な構文を得ることができますつかいます /?

>net use /? 
The syntax of this command is: 

NET USE 
[devicename | *] [\\computername\sharename[\volume] [password | *]] 
     [/USER:[domainname\]username] 
     [/USER:[dotted domain name\]username] 
     [/USER:[[email protected] domain name] 
     [/SMARTCARD] 
     [/SAVECRED] 
     [[/DELETE] | [/PERSISTENT:{YES | NO}]] 

NET USE {devicename | *} [password | *] /HOME 

NET USE [/PERSISTENT:{YES | NO}] 

NETシステムフォルダ内の標準的な外部の.exeコマンドで、PowerShellでうまく動作します。

+0

あなたのPowerShellをv5 +にアップグレードするのはずっと簡単ではありませんか? – Liam

関連する問題