powershell copy-item

PowerShell の Copy-Item コマンドレットを使用して WinRM でファイル転送する方法

PowerShell の Copy-Item コマンドレットを使用して WinRM でファイル転送する方法

コマンドラインで、PowerShell のCopy-Item を使ってファイルをコピーするのは簡単です。Copy-Item コマンドレットで、送信元と送信先の場所を指定するだけですから、このプロセスがどのように実行されるのかをしっかり把握しないままに使う人も少なくありません。

意識するしないにかかわらず、すべてのTCPネットワーク通信(SMBファイルコピーなど)は、ネットワークポートを使用してビット転送します。ファイルコピーのプロセスで、ポイントAからポイントBにファイルを移動するためには、宛先ノードまでの全てのポートが開いている必要があります。SMBファイルコピーの場合、そのポートは445です。これは、通常は内部的に開いている一般的なポートですが、高いセキュリティがかけられていたり、DMZを通過する場合は別です。

 

PowerShell Copy-Item

高いセキュリティで保護された環境からファイル転送する場合、あるいは、内部ネットワークからさまざまなポート制限がある可能性のあるDMZにファイル転送する必要がある場合、スクリプトを使ってファイルをいつでもノードにコピーできるようにするにはどうすればよいでしょうか?1つの方法は、PowerShell v5のCopy-Itemコマンドレットを新しい –ToSession パラメータと共に使用することです。

このパラメータは、Windows Management Framework(WMF)v5 で Copy-Item コマンドレットと共に導入されました。Invoke-Command のようなコマンドレットを使ってコマンドをコンピュータ上でリモート実行するために使用するのと同じリンクを介して、ファイルを転送することが可能です。

このプロセスにはいくつかの利点がありますが、最大のメリットは5985(HTTP)と5986(HTTPS)のTCPポートが使われることです。これらの標準ポートは、通常はリモートノードを管理するために開きますが、DMZ環境にも開かれることがあります。Copy-Item –ToSession を使用することにより、SMBがブロックされているかどうかにかかわらず、常にファイルが確実にコピーされるようにすることができます。

従来のSMBメソッドを使用してPowerShell の Copy-Itemを使用する場合は、パスと送り先のパラメータを指定する必要があります。C:\Folderfile1.txt というファイルを C:\ にあるリモートコンピュータ SERVER1 にコピーするには、次のようにします。

Copy-Item –Path C:\Folder1\file1.txt –Destination '\\SERVER1\c$'

\\SERVER1\c$ というUNCパスを使用していることに注意してください。以降の説明に出てきます。

PowerShell リモートセッション

もし何らかの理由でSMBがブロックされている場合、またはすでに Invoke-Command を使用してSERVER1でコマンドを実行している場合はどうなるでしょうか?その場合は、PowerShell のリモートセッションを利用して、SMB ではなく WinRM でファイルを転送できます。これを行うには、新しいリモートセッションを確立し、そのセッションでファイルを転送する必要があります。.

まず、新しいPowerShell リモートセッションを作成する必要があります。これを行うには、New-PSSession コマンドレットを使用して $session 変数にセッションを割り当てます。

$session = New-PSSession –ComputerName SERVER1

新しい PowerShell リモートセッションを確立するのに、Active Directory 環境で使用される最も一般的な方法である Kerberos 認証を使用します。

次に、ToSession パラメータと、Destinationパラメータのためにリモートコンピュータ上のローカルパスを指定する必要があります。

Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession $session

ここでは、宛先として、UNC パスではなく C:\ を使用していることに留意してください。このコマンドは、既述したものとまったく同じことを実現しますが、セッションを使用してファイルをカプセル化し、WinRM 経由で転送します。

終了後には、Remove-PSSessionでセッションを削除することを忘れないようにしてください。

$session | Remove-PSSession

セッションを何か他の目的で再利用する予定がない場合は、セッションの作成から破棄まで、すべてを1行で指定することもできます。

Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession (New-PSSession –ComputerName SERVER1)

これですべてです。PowerShell のリモートセッションが可能であってSMBが制限されている環境で、または、すでに何か他の目的でリモートセッションを使用している環境で、ファイルをポイントAからポイントBまで転送したい場合は、セッションを Copy-Item にパスすることで実現することができます。

関連ブログ


Comments
Comments are disabled in preview mode.
Loading animation