Группа SYSTEM и файл
От: Kiton  
Дата: 10.07.01 09:39
Оценка:
всем привет!! Кто знает как при создании файла на диске, под w2k, в доступе указать его включение в группу SYSTEM. Нужен API код и по возможности полный, ну или хотябы API функции которые позволяют осуществить включение в группу SYSTEM. Заранее благодарен
Re: Группа SYSTEM и файл
От: Alex Fedotov США  
Дата: 10.07.01 20:36
Оценка:
Здравствуйте Kiton, вы писали:

K>всем привет!! Кто знает как при создании файла на диске,

K>под w2k, в доступе указать его включение в группу SYSTEM.

Вообще-то SYSTEM это не группа, и файлы в группу не включаются, а даются
те или иные разрешения тем или иным группам или пользователям. Это я так,
занудствую.

Так какие разрешения мы хотим дать SYSTEM? Нужно ли добавить эти разрешения
в дополнение к тем разрешениям, которые будут пронаследованы от родительского
каталога или же это должны быть единственные разрешения для файла?

K>Нужен API код и по возможности полный, ну или хотябы API функции которые позволяют K>осуществить включение в группу SYSTEM. Заранее благодарен


SetEntriesInAcl, SetNamedSecurityInfo. В качестве примера можно использовать
AclAPI sample from Platform SDK.
-- Alex Fedotov
Re: Группа SYSTEM и файл
От: Kiton  
Дата: 12.07.01 10:42
Оценка:
Спасибо Алекс за помощь!
Возникла такая проблема, при предоставлении прав на файл наследуются некоторые права от родительского объекта, и поэтому кроме SYSTEM появляется ещё куча разрешений. В функцию BuildExplicitAccessWithName передаётся флаг NO_INHERITANCE, но наследование всё равно происходит. Файл создаётся через CreateFile в которую передаётся SECURITY_ATTRIBUTES поле bInheritHandle которой равно FALSE. Вроде наследование прав везде отключено. Кто знает что делать?
Re[2]: Группа SYSTEM и файл
От: Alex Fedotov США  
Дата: 12.07.01 16:43
Оценка:
Здравствуйте 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 нет.

В общем, должно получиться примерно так (обработка ошибок опущена для
краткости):

SECURITY_DESCRIPTOR SecDesc;
PACL pAcl;
PSID pSidSystem;

SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
EXPLICIT_ACCESS ea;

// create SYSTEM SID
AllocateAndInitializeSid(&sia, 1, SECURITY_LOCAL_SYSTEM_RID,
0, 0, 0, 0, 0, 0, 0, &pSidSystem);

// fill entries for SYSTEM account
ea.grfAccessMode = GRANT_ACCESS;
ea.grfAccessPermissions = GENERIC_ALL;
ea.grfInheritance = NO_INHERITANCE;
ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
ea.Trustee.pMultipleTrustee = NULL;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea.Trustee.ptstrName = (LPTSTR)pSidSystem;

// create DACL
SetEntriesInAcl(1, &ea, NULL, &pAcl);
FreeSid(pSidSystem);

// initialize security descriptor
InitializeSecurityDescriptor(&SecDesc, SECURITY_DESCRIPTOR_REVISION);

#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);

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = &SecDesc;

// create new file with security descriptor assigned
HANDLE hFile = CreateFile(_T("C:\\Projects\\test\\test.dat"), 0,
FILE_SHARE_READ|FILE_SHARE_WRITE, &sa, CREATE_NEW,
0, NULL);

// cleanup
LocalFree((HLOCAL)pAcl);
CloseHandle(hFile);
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.