PSDrive を使って自分の権限がついていないファイルやフォルダーをコピーする
AD のドメイン引っ越しという貴重な経験をしているのですが、引っ越し元の共有フォルダーに引っ越し先アカウントの権限を設定せずにコピーできないものかと考えておりました。 また、引っ越し元と引っ越し先では完全に異なるアカウントになり、引っ越し元のドメインは消滅することから所有者も何とかしたいとも・・・
そこで、コピー先の端末でコピー元の認証情報を使ってマウントし、 robocopy でコピーしてみました。
移行元と移行先が Active Directory ドメインに参加していない環境の場合、UAC リモート制限に引っかかるためレジストリを修正して UAC リモート制限を無効にする必要があります。
PowerShell で移行元共有フォルダーをマウントしコピーする
実行するコマンド、次のようになります。
PS C:\> $Cred = Get-Credential
PS C:\> New-PSDrive -Name SrcData -PSProvider FileSystem -Root "\\移行元PCのIPアドレスまたはPC名\共有フォルダー" -Credential $cred
PS C:\> cd SrcData:\
PS C:\> Robocopy コピー元フォルダー D:\Shared /E /DCOPY:DAT /COPY:DATS
PS C:\> cd C:\
PS C:\> Remove-PSDrive -Name SrcData
以上で、移行元の認証情報で共有フォルダーをマウントし、移行先へデータの移行ができます。
それでは、各コマンドが何をしているのか見ていきます。
Get-Credential コマンドレットで表示されたダイアログにユーザー名とパスワードを入力し認証情報を保持します。Get-Credential コマンドレットを使うと入力したパスワードは、[System.Security.SecureString] として暗号化され再利用可能になるそうです。

New-PSDrive コマンドレットで移行元のフォルダーを新しいドライブとしてマウントします。
PS C:\> New-PSDrive -Name SrcData -PSProvider FileSystem -Root "\\192.168.x.x\Shared" -Credential $Cred
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
SrcData FileSystem \\192.168.x.x\Shared
マウントに成功するとドライブのように扱えるので、移行元へ移動します。 あとは、 robocopy でコピーします。
PS C:\> cd SrcData:\
PS C:\> Robocopy コピー元フォルダー D:\Shared /E /DCOPY:DAT /COPY:DATS
コピーが終わったら、マウントを解除する必要があるので移行先のドライブへ移動しマウントを解除します。
PS C:\> cd C:\
PS C:\> Remove-PSDrive -Name SrcData
おまけ
マウントされているドライブを確認するには、 Get-PSDrive コマンドレットを使います。
Get-PSDrive コマンドレットは、一般的なディスクドライブだけでなく「レジストリ」や「証明書ストア」などもドライブとして列挙されます。「レジストリ」や「証明書ストア」もファイルシステムと同じように Set-Location コマンドレットでディレクトリを移動することができたりします。
PS C:\> Get-PSDrive
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
Alias Alias
C 282.87 638.61 FileSystem C:\
Cert Certificate \
D 597.22 332.89 FileSystem D:\
E FileSystem E:\
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
SrcData FileSystem \\192.168.x.x\c$
Variable Variable
WSMan WSMan