Текущий архив: 2003.07.17;
Скачать: CL | DM;
ВнизSecurityDescriptor, инициализация Найти похожие ветки
← →
hope (2003-05-12 08:10) [0]Привет всем.
Два приложения запускаются под разными пользователями.
Одно из них (перевое запущенное) создаёт общую область в памяти (CreateFileMapping) для обмена данными. Как выяснилось в ХП появляется проблема (отсутствует в 2000): второе приложение не может получить доступ к этой области. Ежу понятно проблема в системе защиты. Соот-но пытаюсь создать этот мепинг с общим доступом. Вот тут я и встала.
Не хочет м.. его итить отработать по-чел-ски SetEntriesInAcl вываливает 83 ошибку. Возможно ошибка закралась ранее и я чего-то не понимаю, возможно не правильно инициализирован TSIDIdentifierAuthority (я в нём очень сомневаюсь) поэтому с вашего позволения приведу код. Может быть кто-нить мне что-нить объяснит. :)
Вот код:
class procedure SecurityFuncs.CreateNewSD(const SIDAuth: TSIDIdentifierAuthority;
RIDAuth: DWORD; out SD: TSecurityDescriptor);
var
pEveryoneSID: pSid;
AclPtr: PAcl;
EA: EXPLICIT_ACCESS;
dwRes: DWord;
begin
try
AclPtr := nil;
pEveryoneSID := nil;
// Create a well-known SID for the Everyone group.
if not AllocateAndInitializeSid(SIDAuth, 1, RIDAuth, 0, 0, 0, 0, 0, 0, 0, pEveryoneSID)
then
SysFuncs.SysError;
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(@EA, Sizeof(EXPLICIT_ACCESS));
EA.grfAccessPermissions := KEY_READ; //FILE_MAP_ALL_ACCESS; //GENERIC_ALL;
EA.grfAccessMode := SET_ACCESS;
EA.grfInheritance := NO_INHERITANCE;
EA.Trustee.TrusteeForm := TRUSTEE_IS_SID;
EA.Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
EA.Trustee.ptstrName := pEveryoneSID;
// Create a new ACL that contains the new ACEs.
dwRes := SetEntriesInAcl(1, @EA, Nil, AclPtr);
if ERROR_SUCCESS <> dwRes then
SysFuncs.SysError;
// Initialize a security descriptor.
if not InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) then
SysFuncs.SysError;
// Add the ACL to the security descriptor.
if not SetSecurityDescriptorDacl(@SD, True, AclPtr, False) then
SysFuncs.SysError;
except
if pEveryoneSID <> nil then
FreeSid(pEveryoneSID);
end;
end;
Вот вызов:
procedure CreateSecurityDescriptor;
var
SIDAuthWorld: TSIDIdentifierAuthority;
begin
ZeroMemory(@SIDAuthWorld, SizeOf(TSIDIdentifierAuthority));
SIDAuthWorld.Value[0] := 1; {SECURITY_WORLD_SID_AUTHORITY}
SecurityFuncs.CreateNewSD(SIDAuthWorld, 0 {SECURITY_WORLD_RID}, FSD);
FSa.nLength := SizeOf(FSa);
FSa.lpSecurityDescriptor := @FSD;
FSa.bInheritHandle := True;
end;
Други, не дайте захлебнуться в этих непонятках.
Буду рада ссылкам на документацию, пояснениям т.д.
← →
Игорь Шевченко (2003-05-12 10:06) [1]Ссылка на документация - Рихтер, Кларк - программирование серверных приложений для Windows 2000. Там вопросы безопасности и управление доступом к объектам очень неплохо освещены.
← →
hope (2003-05-13 02:34) [2]Спасибо, будем искать.
Может быть Вы знаете, где есть он-лайн версия этих шедевров? :о)
← →
ZZ (2003-05-13 09:33) [3]Скажи что ты хочешь сделать то? Дать полный доступ для всех или кому-то определенному? А может что-то другое?
← →
hope (2003-05-14 03:39) [4]Вообще-то всё что мне нужно - это создать отображение файла в памяти без защиты, что бы оно было дуступно всем. Просто, "беззащитный" объект. Я понимаю это плохо, но пока меня это устроит.
← →
hope (2003-05-14 03:43) [5]Господа, прошу прощения. Ручонки кривые. Всё тема закрыта. :о)
← →
hope (2003-05-15 02:01) [6]Это снова, я - открываю тему, но с изменениями в коде.
procedure CreateSecurityDescriptor;
var
SIDAuthWorld: TSIDIdentifierAuthority;
begin
ZeroMemory(@SIDAuthWorld, SizeOf(TSIDIdentifierAuthority));
SIDAuthWorld.Value[5] := 1; {SECURITY_WORLD_SID_AUTHORITY}
SecurityFuncs.CreateNewSD(SIDAuthWorld, 0 {SECURITY_WORLD_RID}, FSD);
FSa.nLength := SizeOf(FSa);
FSa.lpSecurityDescriptor := @FSD;
FSa.bInheritHandle := True;
end;
← →
ZZ (2003-05-15 10:37) [7]Creating a Null DACL
The following example creates a mutex with a null DACL.
If you are creating one of these objects in an application and the object will be shared with a service, you could also use a null DACL to grant everyone access. As an alternative, you could add an access-control entry (ACE) to the DACL that grants access to the user account that the service is running under. This would restrict access to the object to the service.
PSECURITY_DESCRIPTOR pSD;
SECURITY_ATTRIBUTES sa;
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH);
if (pSD == NULL)
Error(...);
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
Error(...);
// Add a null DACL to the security descriptor.
if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE))
Error(...);
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = TRUE;
mutex = CreateMutex(&sa, FALSE, "SOMENAME");
(c)MSDN
Так устроит?
← →
hope (2003-05-16 04:29) [8]zz - спасибо.
Страницы: 1 вся ветка
Текущий архив: 2003.07.17;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.008 c