Здравствуйте Kiton, вы писали:
K>Возникла такая проблема, при предоставлении прав на файл наследуются K>некоторые права от родительского объекта, и поэтому кроме SYSTEM появляется K>ещё куча разрешений. В функцию BuildExplicitAccessWithName передаётся флаг K>NO_INHERITANCE, но наследование всё равно происходит. Файл создаётся через K>CreateFile в которую передаётся SECURITY_ATTRIBUTES поле bInheritHandle K>которой равно FALSE.
Флаг NO_INHERITANCE не имеет к этому никакого отношения. Он говорит, что
та ACE, которая добавляется не должна наследоваться (в данном случае она
не будет наследоваться все равно, поскольку применяется к файлу, а не
каталогу).
Чтобы защитить дескриптор от модификации наследуемыми ACL, нужно установить
в нем флаг SE_DACL_PROTECTED. Этот флаг и соответствующая функция
SetSecurityDescriptorControl существуют только в Win2K, в NT 4 автоматического
наследования ACEs нет.
В общем, должно получиться примерно так (обработка ошибок опущена для
краткости):
#if _WIN32_WINNT >= 0x500
// protects the DACL from being modified by inheritable ACEs
SetSecurityDescriptorControl(&SecDesc, SE_DACL_PROTECTED, SE_DACL_PROTECTED);
#endif
// assign the DACL to the securite descriptor
SetSecurityDescriptorDacl(&SecDesc, TRUE, pAcl, FALSE);