5

ここでちょっとわかりにくい質問があります。

必要なもの: ファイル/フォルダーのアクセス許可 (厳密に言えば、DACL の特定の ACE) が継承されているかどうかを判断するには。

これをどのように解決しようとしたか: Python の winapi バインディングを使用する (正確には win32security モジュール)。これは、単純にファイルへのパスを引数として取り、ACE を 1 つずつ出力して、どのフラグが設定されているかを示します。

#!/usr/bin/env python
from win32security import *
import sys

def decode_flags(flags):
    _flags = {
        SE_DACL_PROTECTED:"SE_DACL_PROTECTED",
        SE_DACL_AUTO_INHERITED:"SE_DACL_AUTO_INHERITED",
        OBJECT_INHERIT_ACE:"OBJECT_INHERIT_ACE",
        CONTAINER_INHERIT_ACE:"CONTAINER_INHERIT_ACE",
        INHERIT_ONLY_ACE:"INHERIT_ONLY_ACE",
        NO_INHERITANCE:"NO_INHERITANCE",
        NO_PROPAGATE_INHERIT_ACE:"NO_PROPAGATE_INHERIT_ACE",
        INHERITED_ACE:"INHERITED_ACE"
    }
    for key in _flags.keys():
        if (flags & key):
            print '\t','\t',_flags[key],"is set!"


def main(argv):
    target = argv[0]
    print target

    security_descriptor = GetFileSecurity(target,DACL_SECURITY_INFORMATION)

    dacl = security_descriptor.GetSecurityDescriptorDacl()

    for ace_index in range(dacl.GetAceCount()):
        (ace_type,ace_flags),access_mask,sid = dacl.GetAce(ace_index)
        name,domain,account_type = LookupAccountSid(None,sid)
        print '\t',domain+'\\'+name,hex(ace_flags)
        decode_flags(ace_flags)


if __name__ == '__main__':
    main(sys.argv[1:])

簡単です。セキュリティ記述子を取得し、そこから DACL を取得してから、DACL 内の ACE を反復処理します。ここで非常に重要なのは、INHERITED_ACE アクセス フラグです。ACE が継承されたときに設定する必要があり、明示的に設定する必要はありません。

フォルダー/ファイルを作成すると、その ACL には、親オブジェクト (フォルダー) の ACE に従って ACE が入力され、子に伝達するように設定されます。ただし、アクセス リストを変更しない限り、INHERITED_ACE フラグは設定されません。ただし、継承されたアクセス許可は存在し、機能します。

わずかな変更 (アクセス リストにエントリを追加し、変更を適用して削除するなど) を行うと、フラグが魔法のように表示されます (動作はまったく変更されませんが、以前は機能し、その後も機能します)。私が望むのは、INHERITED_ACE フラグのこの動作の原因を見つけ、ACE が継承されたかどうかを判断する別の信頼できる方法を見つけることです。

再現方法:

  1. オブジェクト (ファイルまたはフォルダー) を作成する
  2. Windows エクスプローラーでアクセス許可を確認し、それらが親オブジェクトから伝達されていることを確認します (たとえば、Windows エクスプローラーのファイル プロパティ ダイアログの [セキュリティ] タブを使用します)。
  3. たとえば、私が使用していたスクリプトを使用してフラグを確認します (INHERITED_ACE はどの ACE にも設定されません)。
  4. オブジェクトの権限を変更 (変更を適用) したり、元に戻したりします。
  5. フラグを確認します (INHERITED_ACEあります)
  6. ..信じられないという気持ちで首を横に振る

やや長い投稿で申し訳ありませんが、これが少なくとも少し意味をなすことを願っています.

4

3 に答える 3

1

.Net フレームワークを使用できます

System.Security.AccessControl

これには、ACL と DACL と SACL が含まれます。

于 2009-06-24T02:32:39.537 に答える
1

元の投稿者は、詳細な動作を見ていると思います

このニュースグループの投稿

コンテナーに設定された制御フラグは、GUI で継承ボックスのチェックを外して再度チェックするだけで変更できることに注意してください。

さらに、Microsoft のツールを使用して ACE を DACL に追加するだけでも、制御フラグが変更されることに注意してください。

さらに、ニュースグループの投稿で議論されているように、多くの微妙なバグがあるため、継承に関しては GUI、cacls、icacls に依存できないことに注意してください。

継承を制御する「古い」方法は、コンテナの制御フラグを継承関連の ACE フラグと組み合わせて使用​​することだったようです。

「新しい」方法では、コンテナーで制御フラグを使用せず、代わりに重複した ACE を使用します。1 つはオブジェクトへのアクセスを制御し、もう 1 つは子オブジェクトによって継承されるものを制御します。

しかし、既存の Microsoft ツール (Vista など) はまだ「新しい」方法で動作しないようです。そのため、ツールを使用して単純な変更を行うと、コンテナーで制御フラグを使用する古い方法に頼ります。

Vista で新しいパーティションを作成し、新しいフォルダを作成して、フラグと ACE を確認すると、次のようになります。

ControlFlags : 0x8004
Owner : BUILTIN\Administrators
Group : WS1\None
S-1-5-32-544 : BUILTIN\Administrators : 0x0 : 0x0 : 0x1F01FF
S-1-5-32-544 : BUILTIN\Administrators : 0x0 : 0xB : 0x10000000
S-1-5-18 : NT AUTHORITY\SYSTEM : 0x0 : 0x0 : 0x1F01FF
S-1-5-18 : NT AUTHORITY\SYSTEM : 0x0 : 0xB : 0x10000000
S-1-5-11 : NT AUTHORITY\Authenticated Users : 0x0 : 0x0 : 0x1301BF
S-1-5-11 : NT AUTHORITY\Authenticated Users : 0x0 : 0xB : 0xE0010000
S-1-5-32-545 : BUILTIN\Users : 0x0 : 0x0 : 0x1200A9
S-1-5-32-545 : BUILTIN\Users : 0x0 : 0xB : 0xA0000000

ControlFlags と重複した ACE に注意してください。

于 2010-02-06T12:50:53.143 に答える