всем привет!! Кто знает как при создании файла на диске, под w2k, в доступе указать его включение в группу SYSTEM. Нужен API код и по возможности полный, ну или хотябы API функции которые позволяют осуществить включение в группу SYSTEM. Заранее благодарен
Здравствуйте Kiton, вы писали:
K>всем привет!! Кто знает как при создании файла на диске, K>под w2k, в доступе указать его включение в группу SYSTEM.
Вообще-то SYSTEM это не группа, и файлы в группу не включаются, а даются
те или иные разрешения тем или иным группам или пользователям. Это я так,
занудствую.
Так какие разрешения мы хотим дать SYSTEM? Нужно ли добавить эти разрешения
в дополнение к тем разрешениям, которые будут пронаследованы от родительского
каталога или же это должны быть единственные разрешения для файла?
K>Нужен API код и по возможности полный, ну или хотябы API функции которые позволяют K>осуществить включение в группу SYSTEM. Заранее благодарен
SetEntriesInAcl, SetNamedSecurityInfo. В качестве примера можно использовать
AclAPI sample from Platform SDK.
Спасибо Алекс за помощь!
Возникла такая проблема, при предоставлении прав на файл наследуются некоторые права от родительского объекта, и поэтому кроме SYSTEM появляется ещё куча разрешений. В функцию BuildExplicitAccessWithName передаётся флаг NO_INHERITANCE, но наследование всё равно происходит. Файл создаётся через CreateFile в которую передаётся SECURITY_ATTRIBUTES поле bInheritHandle которой равно FALSE. Вроде наследование прав везде отключено. Кто знает что делать?
Здравствуйте 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);