Windows サンドボックス ACL 障害の診断
承認リクエストはすべて、ユーザーの言葉で平易に書いてください。 プロンプトはユーザーがアクセスを広げる前に読むすべてです。そのため、次の点を単独で理解できるようにしなければなりません:スクリプトがどのフォルダに触れるか、権限が不足している場所にサインインユーザーのフルコントロールエントリを追加し、外部パッケージのエントリを削除すること、ファイルの内容と所有者は変更されないこと、そして出力される回復コマンドが各変更を元に戻すこと。エラーコード、WRITE_DAC/WRITE_OWNER、S-1-15-2-* SID、icacls、ACL、ACE、判定結果の名前やスイッチはリクエストに含めないでください。Windows ファイル権限について記述し、ACL や ACE とは記述しないでください。1つのコマンドにつき、1回だけ依頼してください。
1つのコマンドで診断と修復を実施
このスクリプトにモードはありません。-Path、-AllowRoot、-Out は、対象パスとそのすべての祖先パスを読み取り、観測結果に基づいて同じ実行内で修復します。
- そのチェーン上のディレクトリで、効果的な
WRITE_DACまたはWRITE_OWNERがないものには、サインインユーザーに対するフルコントロール許可 ACE が追加されます。DSH がワークスペースの権限付与をプロビジョニングするためにこれらが必要だからです。 - 明示的な AppContainer パッケージ許可 ACE (
S-1-15-2-*、ただし末尾が1または2の既知のグループを除く) は、その発生源(祖先が先)から削除され、これによりそれらのパッケージのアクセスも削除されます。 - サンドボックスがプロビジョニングできないディレクトリ(そのプロビジョニングエラーがワークスペースルートについて報告する状態)、または許可されたルート自体も、同じ実行内でそれらの ACE がサブツリー検索されます。これにより、より深いエントリに対して2回目のリクエストが必要になることはありません。この範囲指定された検索は、
truncated(切り詰められた)および読み取り不能なディレクトリを報告します。切り詰められた場合は、まだ失敗しているより深いパスをもう一度渡してください。
すべての変更はバックアップされ、再読み取りによって検証されます。-AllowRoot はこのすべてを範囲指定します。オブジェクトは、そのディレクトリ自体であるか、その厳密に内部にある場合にのみ変更されるため、ワークスペースルートは自己修復できます。これを診断呼び出しと修復呼び出しに分割したり、1つの修復について2回依頼したり、存在しないモードスイッチを渡したりしないでください。
& '<skill-directory>\scripts\diagnose-windows-sandbox-acl.ps1' -Path '<failing-path>' -AllowRoot '<authorized-directory>' -Out '<recovery-directory>'
exit $LASTEXITCODE
完全なパスを引用符で囲んで置き換えてください。-Out は永続的でユーザー所有の場所(できれば障害が発生しているワークスペースの隣)を指定してください。スキルリソースディレクトリは絶対に使用しないでください。スキルがアンロードされると削除されます。1回の呼び出しにつき1つのパスを渡してください。
実行方法
制限付きの状態で、失敗した操作をもう一度実行してください。スクリプトは権限を書き込みますが、制限付きトークンではこれを行うことはできません。そのため、制限付き環境で実行すると、スクリプトはサンドボックス自身の制限を権限不足として報告してしまいます。従って、その1つのコマンドの承認をリクエストし、制限なしで実行してください。制限付きでのスクリプト実行は決して役に立ちません。制限なしでも Windows トークンが昇格されるわけではありません。
ワークスペースへの書き込み、リスト取得、または通常読み取り可能なパスに対する予期しない拒否を診断してください。想定される拒否(ワークスペース外への書き込み、read-only での書き込み、パイプされた子プロセスの spawn EPERM、ConstrainedLanguage エラーなど)については説明してください。承認が拒否されたり利用できない場合は、パスを「診断未了」として報告し、停止してください。
出力の読み方
すべてのレコードは標準出力、-Out で指定された場所の acl-report-*.jsonl ファイル、および最終行の RECAP 行に出力されます。RECAP 行には、判定結果、変更、検証、拒否、スキャンが含まれます。ツールの出力はその末尾のみを保持するため、まず RECAP を読み、それで不十分な場合はレポートから特定のレコードを読み取ってください。verification(検証)レコードを信頼し、completed(完了)アクションは決して信頼しないでください。details.nextAction から判断してください。
nextAction | 意味 |
|---|---|
verify_original_confined_operation | 修復が検証されました。元の操作を制限付きで再試行してください。 |
stop | 何も修復されなかったか、拒否により実行が終了しました。報告して停止してください。 |
restore_pending_then_stop | 未検証のロールバックがあります。表示された回復コマンドを順番に実行した後、停止してください。 |
拒否 ACE が存在するというだけでは因果関係は証明されず、スクリプトは決してそれを削除しません。DSH の S-1-4-* 権限付与と Everyone の DeleteSubdirectoriesAndFiles 拒否は想定内であり、競合ではありません。修復をブロックする拒否があった場合、スクリプトは試行した内容を復元した後、修復を行わずに実行を終了します(REPAIR_REFUSED または GRANT_FAILED)。各変更に対して、-Out ディレクトリに2つのファイル(acl-backup-<id>.json とその .ps1 ファイル)が残され、実行時に一致する ROLLBACK コマンドが出力されます。
修復後、および停止時
制限付きで、元の失敗した操作を再試行してください。検証済みの修復は、元の操作が別の理由で失敗したからといって取り消されるわけではありません。新しい観測結果から続行し、より深いパスがまだ拒否されている場合は、同じ1つのコマンドをそこに対して再度実行してください。今回も1回の呼び出し、1回の承認です。
修復または検証が失敗または拒否された後は停止してください。 スクリプトはその呼び出しの変更を既に復元しています。繰り返したり、別の修復を開始したりしないでください。また、拒否 ACE を手動で削除しないでください。
停止した実行でも、ユーザーに判断を委ねる必要があります。 ブロックしているオブジェクトと、それに不足している権限または ACE、変更内容とロールバックされた内容、順序付けられた回復コマンド、レポートのパスを指定してください。制限を解除できるのはユーザーだけです。そのため、一時的にこのセッションをフルアクセス(Chinese UI: 完全权限)に切り替えるよう依頼し、それによって何が可能になるかを説明してください。つまり、そのまま作業を続けるか、このファイル権限問題の調査を依頼することができると伝えてください(レポートにはメカニズムと証拠が既に記録されています)。そして、このセッションをフィードバックとして送信し、関連するレコードを引用するよう依頼してください。これにより、対処されていないシナリオが私たちに届きます。この会話で交わされた情報のみが一緒に送信されます。例えば:
这个工作区被 Windows 文件权限挡住了:
<对象>上<缺哪个权限 / 哪条权限项>。你可以把本会话切到「完全权限」(full access) 临时继续工作;切完之后既能直接干活,也可以让我继续排查这个文件权限问题(报告里已经有机制和证据)。也麻烦把这个会话作为反馈发出去,好让我们补上这个场景。This workspace is blocked by Windows file permissions:
<object><missing right / offending entry>. Switch this session to full access (完全权限) to keep working meanwhile; then either continue your work or have me keep investigating this file-permission problem from the report. Please also send this session as feedback so we can cover the case.
禁止事項
- ACL を手動で編集したり、所有者を変更したり、拒否エントリを消去したり、子の権限を再帰的に置き換えたりしないこと。
- UAC または
runasを使用してスクリプトを昇格して実行しないこと。 -AllowRootを祖先にまで広げたり、拒否または失敗した呼び出しを繰り返したりしないこと。
ユーザーの言葉で報告してください:分析したパス、変更、検証、回復コマンド、次のステップ。許可された制限なし実行は、そのようにラベル付けし、サンドボックス修復とは呼ばないでください。