вопрос. С помощью какой функции WinAPI можно выставить политики безопасности к какталогу тоесть пользоватей группы и их права??
SetFileSecurity/SetNamedSecurityInfo
ссылка по теме (http://www.codeproject.com/system/secntobj.asp)
Вот пример, разрешяющий всем читать, запись, выполнять файл:
procedure TForm1.Button3Click(Sender: TObject);
var
pSD : PSECURITY_DESCRIPTOR;
pDACL : PACL;
aclInfo : ACL_SIZE_INFORMATION;
ace : ^ACCESS_ACE;
sid : PSID;
i : Integer;
user, domain : array [0..200] of char;
len: DWORD;
sid_nu : SID_NAME_USE;
newAcl : TListItem;
actions:String;
sidLength, sidLengthDomain: Cardinal;
sidType: SID_NAME_USE;
sidValue: PSID;
domain1:PChar;
pNewDACL : PACL;
pNewSD : PSECURITY_DESCRIPTOR;
newSize:Integer;
begin
aclListView.Items.Clear;
if (GetNamedSecurityInfo(PChar(Edit1.Text), SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil,
pSD)<>ERROR_SUCCESS) then
begin
ShowMessage('Ошибка');
exit;
end;
if (pDACL=nil) then
begin
ShowMessage('Список доступа пуст');
exit;
end;
if (not GetAclInformation(pDACL^, @aclInfo, sizeOf(aclInfo),
AclSizeInformation)) then
begin
ShowMessage('Не получилось определить информацию об ACL');
exit;
end;
// Опредеяем SID пользователя, которому нужно дать разрешение
sidLength:=0;
sidLengthDomain:=0;
LookupAccountName(nil, 'everyone', nil, sidLength, nil, sidLengthDomain, sidType);
sidValue := AllocMem(sidLength);
domain1 := AllocMem(sidLengthDomain);
if (LookupAccountName(nil, 'everyone', sidValue, sidLength, domain1, sidLengthDomain, sidType)=false) then
exit;
// Выделяем память под новую таблицу
newSize:=AclInfo.AclBytesInUse + sizeof(ACCESS_ACE) + GetLengthSid(sidValue);
pNewDACL:=PACL(LocalAlloc(LPTR, newSize));
if not InitializeAcl(pNewDACL^, newSize, 2) then
exit;
for i:=0 to aclInfo.AceCount-1 do
begin
if not (GetAce(pDACL^, i, Pointer(ace))) then
continue;
newAcl:=aclListView.Items.Add;
sid := PSID(@((ace)^.SidStart));
len := 200;
if (LookupAccountSid(nil, sid, user, len,
domain, len, sid_nu)) then
begin
newAcl.Caption:=user;
newAcl.SubItems.Add(domain)
end
else
begin
newAcl.Caption:='Лажа';
newAcl.SubItems.Add('Лажа')
end;
case (ace^.Header.AceType) of
ACCESS_ALLOWED_ACE_TYPE: newAcl.SubItems.Add('Разрешено');
ACCESS_DENIED_ACE_TYPE: newAcl.SubItems.Add('Запрещено');
else newAcl.SubItems.Add('Другое');
end;
actions:='';
if (ace^.Header.AceType=ACCESS_ALLOWED_ACE_TYPE) or
(ace^.Header.AceType=ACCESS_DENIED_ACE_TYPE) then
begin
if (ace^.Mask and $1)=1 then
actions:=actions+' Чтение';
if (ace^.Mask and $2)=2 then
actions:=actions+' Запись';
if (ace^.Mask and $4)=4 then
actions:=actions+' Выполнение';
end;
newAcl.SubItems.Add(actions);
// Добавляем запись в новый список
if not AddAce(pNewDACL^, 2, MAXWORD, ace, ace.Header.AceSize) then
exit;
end;
// Добавляем ещё одну разрешающую запись
if not AddAccessAllowedAce(pNewDACL^, 2, GENERIC_ALL, sidValue) then
exit;
// Инициализируем новый дескриптор
pNewSD := PSECURITY_DESCRIPTOR(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));
if not InitializeSecurityDescriptor(pNewSD, SECURITY_DESCRIPTOR_REVISION) then
exit;
// Устанавливаем дескриптору новый ACL список
if not SetSecurityDescriptorDacl(pNewSD, TRUE, pNewDACL, FALSE) then
exit;
// Устанавливаем дескриптор файлу
if not SetFileSecurity(PChar(Edit1.Text), DACL_SECURITY_INFORMATION, pNewSD) then
exit;
end;
//(c) flenov
Это не подойдёт? http://www.vclcomponents.com/Delphi/Components_Collection/NTSet-info.html
Всем пасиб но эт не много не то уже сам разобрался.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot