Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

File Access Control [D6, Win2k, WinXP]


sid ©   (2004-07-29 00:32:00) 

Нужно установить права доступа на файл. Пошарив интернет, вынес оттуда следующее:

const
 SECURITY_LOCAL_SYSTEM_RID = 18;
 SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
    (Value: (0, 0, 0, 0, 0, 5));
var
 MyAcl:PACL;
 ea:EXPLICIT_ACCESS;
 pSidSystem:pSID;
 sia:TSIDIdentifierAuthority;
begin
// create SYSTEM SID
 if not AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 1, SECURITY_LOCAL_SYSTEM_RID ,0, 0, 0, 0, 0, 0, 0, pSidSystem) then exit;
// 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 := nil;
 ea.Trustee.TrusteeForm := TRUSTEE_IS_SID;
 ea.Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
 ea.Trustee.ptstrName := pSidSystem;

 a:=SetEntriesInAcl(1, @ea, nil, MyAcl);
//  FreeSid(pSidSystem);
 if a<>ERROR_SUCCESS then exit;
 .......

SetEntriesInAcl возвращает ошибку 87 (ERROR_Invalid_parameter). Как ни бился с MSND и google, так задачку и не решил, а ведь это менее половины всего кода для этой цели.
Мастера, подскажите, чего поправить в коде или дайте ссылку на рабочий код на DELPHI(!!!).


sid   (2004-07-30 13:06:00) [1]

Ексцепшн,обычно, вылетает с адресом третьего параметра AddAccessAllowedAce, то есть в моём примере $FFFFFFFF. Пытался в дебаггере разобраться, не вышло...


sid   (2004-07-30 12:56:00) [2]

ОК, тогда получилось так:


procedure SetSecurity;
var
 buf:array[0..255] of Char;
 pSD:PSECURITY_DESCRIPTOR;
 myACL:ACL;
 myACL2:pACL;
 cbACL:DWord;
 sid:pSID;
 psnuType: SID_NAME_USE;
 cbSid,tmp:cardinal;
begin
 GetMem(pSD,4096);
 if not InitializeSecurityDescriptor(pSD,SECURITY_DESCRIPTOR_REVISION) then exit;
 cbACL := 4096;
 if not InitializeAcl(myACL, cbACL, 2) then exit;
 cbSID:=4096; GetMem(Sid,cbSid); tmp:=16;
//try
 if not LookupAccountName(nil,'USER',SID,cbSID,buf,tmp,psnuType) then  exit;
 if not AddAccessAllowedAce(myACL,2,$FFFFFFFF,SID) then exit;
 myACL2:=@myACL;
 SetSecurityDescriptorDacl(pSD,TRUE,myACL2,FALSE);
 if not SetFileSecurity('c:\!!!!.txt',DACL_SECURITY_INFORMATION,pSD) then exit;
//except
//end;
//  FreeMem(pSD);
//  FreeMem(SID);
 showmessage('Done');
end;


В таком виде даже работает. Но вот если поставить, например, try except (или какой-нибудь другой код, например, обработчик ошибки выполнения функции), то при выходе из моей процедуры вылетает exception, хотя Security на файл устанавливаются исправно. Может, опять чего-нибудь с памятью намудрил?
У меня WinXP,D6.


Игорь Шевченко   (2004-07-29 10:53:00) [3]


> Нужно установить права доступа на файл


SetFileSecurity


sid   (2004-07-29 10:51:00) [4]

Конечно, я пробовал нулить структуру. И это, видимо, необычная структура - у неё нет dwSize или подобного.
Спасибо за ответ.


Cobalt   (2004-07-29 09:15:00) [5]

Ну, для начала
1) принято структуры, передаваемые API-функциям, сначала заполнять нулями (FillChar, если не ошибаюсь, посмотрите в VCL, или в инете)
2) Обычно у таких структур есть ещё поле с именем типа dwSize, которым принято присваивать значение следующим образом:
  mystruct.dwSize:=SizeOf(mystruct);


Наверх

Титульная страница Поиск, карта сайта Написать письмо