web-dev-qa-db-ja.com

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

Windowsを再インストールするたびに、ユーザー名が以前と同じsameであっても、ユーザーの新しい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で失敗します拒否されましたエラー。所有権を変更することはできません。

SubInACL ツールを使用して所有権を変更できたとしても、古いユーザーが新しいインストールに存在しないため、caclsは古いユーザーの権限を削除できず、 'tcopy古いユーザーの新しいユーザーへのアクセス許可。

では、新しくインストールした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 !
18
LiuYan 刘研

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
11
Daniel Gehriger
  1. コンピューターのSIDを変更したり、コンピューターのSIDと一致しないようにローカルアカウントのSIDを変更したりするためのサポートされている方法はありません。

  2. 質問の文言は、オペレーティングシステムを頻繁に再インストールしていることを意味しますが、その必要はありません。再インストールが必要な問題が繰り返し発生している場合は、毎回再インストールするだけでなく、問題の原因を特定することをお勧めします。

  3. 特定のグループは 既知のSID を使用します。これは、コンピューターを再インストールしてもグループが変更されないことを意味します。したがって、これらのグループを使用するように事前に権限を選択することで、問題を単純化できます。役立つ可能性のあるこれらのグループには、Administrators、Power Users、Users、Authenticated Users、INTERACTIVEなどがあります。

  4. フォルダーツリー全体のアクセス許可をリセットするのに時間がかかりますが簡単な方法の1つは、コピーすることです。

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

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

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

    robocopy /e /b c:\empty-folder c:\original-folder
    
3
Harry Johnston