1

私の環境では、多数のファイル サーバーで NTFS ACL 監査レポートとさまざまな ACL クリーンアップ アクティビティを実行するプロジェクトがいくつかあります。これらのアクティビティをサーバー上でローカルに実行できない主な理由は 2 つあります。

1) サーバーは実際には別の会社によって所有および管理されているため、サーバーへのローカル アクセス権がありません。

2) それらは変更された Linux OS (GuardianOS と呼ばれる) を実行するSNAP NAS サーバーであるため、ローカル アクセスを取得できたとしても、必要な操作を実行するためのツールが利用できるかどうかはわかりません。

それが邪魔にならないように、私は独自の ACL 監査レポート ツールを展開することになりました。このツールは、指定された最上位パスから始まるファイル システムを再帰的に調べ、ACL で遭遇したすべてのグループ/ユーザーに関する HTML レポートを次のように吐き出します。ツリーをたどる際のアクセス許可の変更を表示するだけでなく、このツールを開発しているときに、ネットワーク オーバーヘッドがこれらの操作を実行する際の最悪の部分であり、プロセスをマルチスレッド化することで、大幅に優れたパフォーマンスを達成できることがわかりました。

ただし、ACL の変更とクリーンアップを実行するための優れたツールを見つけるのにまだ苦労しています。すぐに使用できる標準ツール (cacls、xcacls、Explorer) はシングル スレッドのようで、ネットワーク経由でパフォーマンスが大幅に低下します。マルチスレッド化された独自の ACL 設定プログラムのローリングを見てきましたが、私がよく知っている唯一の API は .NET FileSystemAccessRule のものであり、問​​題は、フォルダーにアクセス許可を設定すると、自動的に「フロー」することです。権限を下げます。マルチスレッドを使用して自分で「流れる」ことをしたいので、これは問題を引き起こします。

NTFS では、継承されたアクセス許可が異なる 2 つの親フォルダー間で同じボリューム上でフォルダー/ファイルが移動され、古いアクセス許可が「継承」されているため、継承されたアクセス許可の一貫性が「許可」されていることはわかっています。

質問

1)現在のフォルダーとすべての子に適用される ACL (標準の「ファイル、フォルダー、およびサブフォルダーに適用」ACL) を設定する方法はありますが、自動的に子オブジェクトに流れないようにする方法はありますか? 基本的には、「はい、この ACL を子オブジェクトに適用する必要がありますが、今のところ、このオブジェクトに直接設定するだけです」と Windows に伝えられるようにしたいと考えています。

明確にするために、「このフォルダーのみ」に適用するための ACL オプションについて知っていますが、要件である継承を失うため、そのオプションは私のユースケースでは有効ではありません。

2) マルチスレッド方式で ACL の変更を実行するための優れたアルゴリズムまたは方法論を知っている人はいますか? 私の直感では、ファイルシステムの再帰的トラバーサルは、特に最上位フォルダーに新しい ACL を定義していて、すべてのサブフォルダーを「クリーンアップ」したい場合は特に、理論的には機能するはずです。最上位に新しい ACL をスタンプしてから、明示的な ACE を削除してから、継承されたアクセス許可を「フロー」ダウンして再帰します。

(参考までに、この質問は、実際にはシステム管理者とプログラミングの問題の両方であるため、ServerFault から部分的に複製されています。他の質問では、ネットワーク経由で高速な ACL 設定を実行できるツールを誰かが知っているかどうかを尋ねていました。)

4

1 に答える 1

0

MS KB記事で答えを見つけました:

Active Directory サービス インターフェイス (ADSI) と ADSI リソース キット ユーティリティ ADsSecurity.DLL を使用してファイルとフォルダーに設定されたファイル アクセス許可は、サブツリーを下って既存のフォルダーとファイルに自動的に反映されません。

ADSI を使用して ACE を既存のファイルやフォルダーに伝達するように設定できない理由は、ADSSecurity.dll が低レベルの SetFileSecurity 関数を使用してフォルダーにセキュリティ記述子を設定するためです。SetFileSecurity を使用して ACE を既存のファイルやフォルダーに自動的に伝達するために設定できるフラグはありません。SE_DACL_AUTO_INHERIT_REQ 制御フラグは、フォルダーに関連付けられているセキュリティ記述子で SE_DACL_AUTO_INHERITED フラグのみを設定します。

そのため、低レベルの SetFileSecurity Win32 API 関数 ( MSDN エントリでは廃止されているとマークされています) を使用して ACL を設定する必要があり、これにより ACL が自動的に流れないようにする必要があります。

もちろん、古い Win32 API を P/Invoke してすべての疣贅に対処しようとするよりも、スプーンで眼球を引き裂きたいので、FILEACLと呼ばれる古い NT4 ツールを使用することになるかもしれません。 SetFileSecurity API を使用するオプションを使用して、変更が自動的に伝達されないようにします。

于 2009-06-11T14:23:56.047 に答える