Windowsの再インストール後、古いユーザーのSIDを新しいユーザーにバインドしてNTFSファイルの所有権とアクセス許可を維持する方法


18

Windowsを再インストールするたびに、ユーザー名が以前と同じであっても、ユーザーの新しいSIDが作成されます。

// example (not real SID format, just show the problem)
user   SID
--------------------
liuyan S-old-501    // old SID before reinstall
liuyan S-new-501    // new SID after  reinstall

再インストール後の厄介な問題は、NTFSファイルの所有権であり、ハードドライブディスクのアクセス許可は古いユーザーのSIDに関連付けられたままです。

NTFSファイルの所有権とアクセス許可の設定を保持し、新しいユーザーが古いユーザーのSIDを取得できるようにして、アクセス許可の問題なく以前のようにファイルにアクセスできるようにします。

このcaclsような状況ではコマンドラインツールを使用できません。ファイルは新しいユーザーに属しているため、Access is deniedエラーで失敗します。所有権を変更することはできません。

SubInACLツールを使用して所有権を変更できたとしてもcacls、古いユーザーは新しいインストールに存在しないため、古いユーザーの権限を削除できません。また、古いユーザーの権限を新しいユーザーにコピーできません。

したがって、新しくインストールしたWindowsで、古いユーザーのSIDを新しいユーザーに単純にバインドできますか?

サンプルテストバッチ

@echo off
REM Additional tools used in this script
REM PsGetSid http://technet.microsoft.com/en-us/sysinternals/bb897417
REM SubInACL http://www.microsoft.com/en-us/download/details.aspx?id=23510
REM
REM make sure these tools are added into PATH

set account=MyUserAccount
set password=long-password
set dir=test
set file=test.txt

echo Creating user [%account%] with password [%password%]...
pause
net user %account% %password% /add
psgetsid %account%
echo Done !

echo Making directory [%dir%] ...
pause
mkdir %dir%
dir %dir%* /q
echo Done !

echo Changing permissions of directory [%dir%]: only [%account%] and [%UserDomain%\%UserName%] has full access permission...
pause
cacls %dir% /G %account%:F
cacls %dir% /E /G %UserDomain%\%UserName%:F
dir %dir%* /q
cacls %dir%
echo Done !

echo Changing ownership of directory [%dir%] to [%account%]...
pause
subinacl /file %dir% /setowner=%account%
dir %dir%* /q
echo Done !

echo RunAs [%account%] user to write a file [%file%] in directory [%dir%]...
pause
runas /noprofile /env /user:%account% "cmd /k echo some text %DATE% %TIME% > %dir%\%file%"
dir %dir% /q
echo Done !

echo Deleting and Recreating user [%account%] (reinstall simulation) ...
pause
net user %account% /delete
net user %account% %password% /add
psgetsid %account%
echo Done ! %account% is recreated, it has a new SID now

echo Now, use this "same" account [%account%] to access [%dir%], it will failed with "Access is denied"
pause
runas /noprofile /env /user:%account% "cmd /k cacls %dir%"
REM runas /noprofile /env /user:%account% "cmd /k type %dir%\%file%"
echo Done !

echo Changing ownership of directory [%dir%] to NEW [%account%]...
pause
subinacl /file %dir% /setowner=%account%
dir %dir%* /q
cacls %dir%
echo Done ! As you can see, "Account Domain not found" is actually the OLD [%account%] user

echo Deleting user [%account%] ...
pause
net user %account% /delete
echo Done !

echo Deleting directory [%dir%]...
pause
rmdir %dir% /s /q
echo Done !

ファイルの所有権を取得することに反対するのはなぜですか?
ラムハウンド

所有権のみを取得した場合、一部のファイルは、アクセス許可が古いユーザーのSIDに設定されたままなので、アクセスできません。
LiuYan刘研

@LiuYan刘研しかし、所有権を取得すると、すべての権限を編集できるようになります。
イッツィ

1
@IsziRoryorIsznti、ファイルが少なく、すべての権限が親から継承されている場合はtrue。しかし、多くのファイルがあり、ほとんどのファイルに個別のアクセス許可設定(Cygwinの下のファイルなど)がある場合、それらを同じアクセス許可で単純に置き換えることはできません。
LiuYan刘研

回答:


11

setaclを使用して、孤立したSIDを新しいものに置き換えることができます。たとえば、次を使用して古いSIDを新しいSIDに置き換えます。

setacl.exe -on C:\ 
           -ot file 
           -actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst" 
           -rec cont

素敵なツール!それが私が望んでいたことです(ただし、ユーザーSIDは変更されません)。それは今私の必須リストにあります!ただし、予期しない動作があります。テストバッチの後で(ディレクトリとファイルを削除せずに)これを試行した場合、ディレクトリは親からアクセス許可を継承します。これは望ましくないことです。注:ディレクトリのACLはcaclsコマンドを介して変更されますが、継承フラグは変更されません。
LiuYan刘研

SetACLドキュメントによると、C:\\である必要があると思います。
cdmckay

@cdmckay:わかりません。「オブジェクト名がバックスラッシュで終了し、それを引用符で囲む場合、最後のバックスラッシュを別のバックスラッシュでエスケープするようにしてください。」しかし、私はそれを引用符で囲みません。
ダニエルゲーリガー

1
2016年1月8日の時点で、指定する必要があるのために受託者のアクションをまたは所有者が設定されていません。-actn trusteeラインは、する必要があります-actn trustee -trst "n1:S-old-501;n2:S-new-501;ta:repltrst;w:d,s,o,g"。その場合でも、cygwinがグループに対して選択したものはすべて正しく設定されません(まだが「不明」として表示されます/bin/ls -l)。
Makyen

1
@Makyen:cygwinでも同じ問題が発生しました-rec cont_objが、ファイルの変更も適用するため修正しました。
デニスバハレフ

3
  1. コンピューターのSIDを変更したり、コンピューターのSIDと一致しないようにローカルアカウントのSIDを変更したりする方法はサポートされていません。

  2. 質問の文言は、オペレーティングシステムを頻繁に再インストールすることを意味しますが、これは必要ありません。再インストールが必要な問題が繰り返し発生する場合は、毎回単に再インストールするのではなく、何が原因であるかを把握する価値があります。

  3. 特定のグループは、既知のSIDを使用します。これは、コンピューターを再インストールしても変更されないことを意味します。したがって、これらのグループを使用するように事前に許可を選択することで、問題をより簡単にすることができます。役立つ可能性のあるこれらのグループには、管理者、パワーユーザー、ユーザー、認証済みユーザー、対話型などがあります。

  4. フォルダーツリー全体のアクセス許可をリセットする方法は、ゆっくりですが簡単にコピーする方法です。

    robocopy /e /b c:\original-folder c:\new-copy
    

    これは、昇格されたコマンドプロンプトから実行する必要があります。/ bオプションを使用すると、robocopyは復元特権を使用してファイルのセキュリティをバイパスします。c:\new-copy開始する前に作成し、必要に応じて権限を設定します。

    このコマンドを使用して、コピー後に元のフォルダーを削除できます。

    robocopy /e /b c:\empty-folder c:\original-folder
    

管理者としてこれを行い、古いユーザーの場所から新しいユーザーの場所にファイルをコピーすると、各ファイルのtge SUDが新しいユーザーにtgeに設定されますか?
trusktr 14年

@trusktr:意味に依存します。ファイルの所有権はコピーを行っている管理者ユーザーに割り当てられますが、アクセス許可は親フォルダーから継承されます。通常、権限のみが重要です。
ハリージョンストン14年

基本的には、古いWindows C:\ Users \ usernameの場所からすべてのファイルを新しいWindows C:\ Users \ usernameの場所にコピーして、それらのファイルがすべて新しいユーザーに属するようにすることです(新しいWindowsに移行するだけです)基本的にインストールし、前のユーザーのファイルを保持したい)。古いものと新しいものの両方で同じユーザー名です。管理者がトリックを行うときに、ある場所から別の場所へのファイルの単純なコピーはありますか?NTFS-3Gを使用してファイルSIDをLinuxユーザーにマッピングしているため、ファイルのSIDが新しいユーザーのSIDに変更されるかどうかを知りたいです。
trusktr 14年

@trusktr:その場合、所有権は問題になりませんが、ユーザープロファイルには、その方法で移行できないもの(特にユーザーのレジストリハイブ)が含まれます。Robocopyはアクセス許可に関する限り問題ありませんが、<username>フォルダー全体ではなく、個々のフォルダー(たとえば、Documents、Desktopなど)をコピーすることをお勧めします。AppDataのような隠しフォルダーは除外します-必ずコピーを保持しますが、新しいアカウントの上にコピーしないでください。
ハリージョンストン14年

理想的には、<username>フォルダーを別のパーティション(古いWindowsパーティション)に保持し、その<username>フォルダーを新しいWindowsのユーザー<username>のホームフォルダーにしたいだけです。
trusktr 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.