У меня есть несколько неясный вопрос.Надежный способ определить, были ли права наследования ntfs унаследованы
Что мне нужно: Чтобы определить, унаследовано ли разрешение (или, строго говоря, конкретное ACE файла DACL) файла/папки.
Как я попытался это решить: используя привязки winapi для python (точнее, модуль 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. Здесь действительно важный бит - это флаг доступа INHERITED_ACE. Он должен быть установлен, когда ACE наследуется и не устанавливается явно.
Когда вы создаете папку/файл, его ACL заполняется ACE в соответствии с ACE родительского объекта (папки), которые настроены для распространения на дочерние. Однако, если вы не внесете каких-либо изменений в список доступа, флаг INHERITED_ACE НЕ будет установлен! Но унаследованные разрешения есть, и они работают.
Если у вас есть какие-либо незначительные изменения (скажем, добавьте запись в список доступа, примените изменения и удалите ее), появляется волшебный значок (поведение никоим образом не меняется, хотя оно работало до этого и работает потом)! Я хочу найти источник этого поведения флага INHERITED_ACE и, может быть, найти другой способ , чтобы определить, была ли ACE унаследована или нет.
Как воспроизвести:
- Создать объект (файл или папку)
- Проверьте права доступа в проводнике Windows видеть, что они распространяются от родительского объекта (используя, например, вкладка безопасности файла диалог свойств окна Explorer).
- Проверьте флаги, используя, например, скрипт, который я использовал (INHERITED_ACE НЕ будет установлено ни на какие ACE).
- Изменение разрешений объекта (применить изменения), изменить их обратно.
- Проверьте флаги (INHERITED_ACE будет там)
- ..shake головой в неверии (я знаю, что я сделал)
Извините за несколько длительный пост, надеюсь, что это делает по крайней мере, немного смысл.
Я обновил свой ответ. Это, кажется, проблема с библиотеками Python ... –