我在這裏有一個有點晦澀的問題。一個可靠的方法來確定是否繼承ntfs權限
我需要什麼:如果要判斷權限(或,嚴格來說,一個DACL的特定ACE)的文件/文件夾被繼承。
如何試圖解決這個問題:使用WINAPI綁定蟒(win32security模塊,要準確)。這裏是精簡版,就是這樣做的 - 它只是將文件路徑作爲參數,並逐個打印ACE,指出設置了哪些標誌。
#!/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 將在那裏)
- ..shake在懷疑你的頭(我知道我做的)
對不起,我有點冗長的帖子,希望這至少有一點感。
我已經更新了我的答案。這似乎是與Python庫的問題... – 2009-06-25 09:43:26