Windows10同士のディスク間でフォルダやファイルのコピーができない時

1TB(Windows10 Home)から2TBにHDDを交換して、2TBにWindows10Proを新規インストール、その後、USB経由で外付けHDD(1TB)をつないで2TBにデータ移管しました。しかし、所有権とアクセス権の変更をGUIではうまく出来ず、第1ハマり。移動させたいデータは合計150GB程度、USB2.0でHDD同士の移管、エクスプローラーでドラッグ&コピーしましたが超絶な時間泥棒をされたあげく、256文字パス長制限(MAX_PATH)とアクセス権で再び第2ハマり、無限アラート地獄。最終的にrobocopyコマンドでドライブをまたいでフォルダのミラーリングを行いました。

Adobeのフォルダ内に、アプリケーションによっては所有権やアクセス権の変更をコマンドでも出来ないものがありました。

Windows10のOS同士によるアクセス権や所有権のしばり対応無しでデータ移管出来るように、HDD交換作業の前に他のストレージへrobocopyコマンドでデータ移管しておくことを強く推奨します。所有権とアクセス権の変更はなかなか厄介な作業です。

コマンドはすべて管理者権限のPowerShellで実行してください。

旧1TBのHDDから2TBのHDDにデータ移管

Windows10 Homeの1TBのHDDから2TBのWindows10 ProのHDDへのデータ移管は、1TBを外付けHDDとしてUSBでパソコンにつなぎ、1TBのHDDの所有権をAdministratorsに変更し、親フォルダから継承しているアクセス権だけにするリセットするという手順になりそうです。

1TBのHDDについて、所有権とアクセス権がWindows10 Homeのユーザーのままではデータ移行できません。2TBのWindows10 Proの管理者に所有権もアクセス権も強制変更したいです。

GUIによる所有者変更を行うと、256文字パス長制限(MAX_PATH)などの変更出来ないエラーの無限大量地獄にハマり作業が進まなくなりました。そのため、管理者権限のPowerShellでtakeownコマンドによる再帰的な多数のファイルやフォルダの所有者変更とicaclsによるアクセス権変更を一気に行う作戦に変更しました。コマンド実行の時間は結構長かったです。

所有権変更

takeownを使います。おそらくLinuxのchownみたいなコマンド。

//Windows10 home 1TB HDDをUSBで外付け接続したら管理者権限でWindows PowerShellを起動
//Windows10 home 1TB HDD(Gドライブ)に移動
G:
//ユーザーフォルダにフォルダに移動
cd Users
//所有者をAdministratorsに変更。オプションのRは再帰的、オプションのAはAdministrators
takeown /F ユーザー名 /R /A

ただ、上記のPowerShellのコマンド作業でも

『ディレクトリ “G:Usersユーザー名〇△×” の内容を読み取るアクセス許可がありません。フルコントロールのアクセス許可を取得できるようにディレクトリアクセス許可を変更しますか(”はい”には”Y”、”いいえ”には”N”、取り消すには、”C”を指定します)?』

が大量に表示され、作業が止まる手動地獄が出てきました。最初はAdobeのソフトウェアで発生。アプリケーションによっては改ざん防止のためにアクセス権を厳しく絞っているということだと思います。”いいえ”の “N” を何度も選んでいたが、途中でめんどくさくなって “Y” にしたら、以降、手動地獄は無くなりました。

ACL(アクセスコントロールリスト)のリセット

アクセス権の設定をいったんすべてリセットして、親フォルダから継承しているアクセス権だけにするというコマンド。外付けHDD(Windows10 Home 1TB)のGドライブに対して行いました。/tはファイルでもフォルダでも再帰的を意味します。

//Gドライブに移動
G:
//ユーザーフォルダに移動
cd Useers
//リセットのicacls実行
icacls ユーザー名 /reset /t

Adobe¥Acrobat\Distiller DC\Cache\PSHFList1 のみアクセス拒否されました。

データ移管は、あらかじめ別の外付けストレージにファイル全部を移動してから再インストール作業を行うほうがシンプルでおすすめです。

データの移動について

ドラッグ&コピーによるデータ移動は絶対にやめたほうがいい。「ファイルやフォルダの256文字パス長制限(MAX_PATH)」と「アクセス権」などでエラー出まくり、無限GUI手動作業地獄で完遂できなくなる。そのため、以下の方法がある。

  1. copy、xcopy、robocoryの違いを把握したうえでrobocopyを使う
  2. FastCopyを使う

Microsoft純正ではないFastCopyはなるべく避けたいので、robocopyコマンドによるドライブ間のミラーリングを行うことにした。以下のようなコマンドになる。外付けHDD1TBのGドライブの特定のフォルダをEドライブの特定のフォルダにミラーリングするというコマンドになる。/mirはそのままミラー、/zbはユーザーのアクセス権がないファイルも移動、/xdはEドライブルートのSystem Volume Informationフォルダの除外。/logはログファイル(ログファイル無しだとかなり早くなります)。robocopyは、256文字パス長制限を超えるものにも対応している。

robocopy G:\Users\ユーザー名\Desktop E:\Users\ユーザー名\document /mir /zb /xd "System Volume Information" /log:robocopy_mirror.log
//ログは  C:\Windows\system32\robocopy_mirror.log に設置されました。

が、問題が発生デスクトップフォルダが2つになってしまった・・・。ミラーリングするとミラー先のフォルダ名まで変えてしまう。E:\Users\ユーザー名\documentではなくてE:\Users\ユーザー名\Desktopになり、既存のE:\Users\ユーザー名\Desktopとパス重複が発生・・・。場所のファイルパスはrobocopyで変更されないのでフォルダ名とアイコンを変えて修正しました。名称がカタカナでドキュメント、パス(場所)は英語にうまく戻すのもめんどくさいので、気になる方はrobocopyする時に、E:\Users\ユーザー名\document\1TBHDD の様にフォルダをもう一つ増やしておくといいと思います。

まとめ

Windows10同士のディスク間のデータコピーについて、管理者権限のPowerShellで、所有権変更はtakeownコマンドでAdministratorsに、アクセス権変更はicaclsコマンドでリセット、データ移行はrobocopyコマンドでドライブをまたぐことに注意してコマンドオプションをつける。