<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1678611822423757&amp;ev=PageView&amp;noscript=1">

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

Adam Bertram| March 07 2018

| IT insights

powershell copy-item

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

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

PowerShell Copy-Item

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

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

このプロセスにはいくつかの利点がありますが、最大のメリットは5985HTTP)と5986HTTPS)の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 にパスすることで実現することができます。

PowerShell を使って自動化する方法

Topics: IT insights

Default HTML block

Leave a Reply

Your email address will not be published. Required fields are marked *

THIS POST WAS WRITTEN BY Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

無料試用版

無料試用版をお気軽にお試しください。

無料試用版を試す

コンタクト

ご質問、ご意見をお寄せください。

連絡先

ブログの定期メール便

ブログを定期的にメール配信いたします。