ここでちょっとわかりにくい質問があります。
必要なもの: ファイル/フォルダーのアクセス許可 (厳密に言えば、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 が継承されたかどうかを判断する別の信頼できる方法を見つけることです。
再現方法:
- オブジェクト (ファイルまたはフォルダー) を作成する
- Windows エクスプローラーでアクセス許可を確認し、それらが親オブジェクトから伝達されていることを確認します (たとえば、Windows エクスプローラーのファイル プロパティ ダイアログの [セキュリティ] タブを使用します)。
- たとえば、私が使用していたスクリプトを使用してフラグを確認します (INHERITED_ACE はどの ACE にも設定されません)。
- オブジェクトの権限を変更 (変更を適用) したり、元に戻したりします。
- フラグを確認します (INHERITED_ACEがあります)
- ..信じられないという気持ちで首を横に振る
やや長い投稿で申し訳ありませんが、これが少なくとも少し意味をなすことを願っています.