Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

File Access Control   Найти похожие ветки 

 
sid   (2004-07-29 00:32) [0]

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

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(!!!).


 
Cobalt ©   (2004-07-29 09:15) [1]

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


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

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


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


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


SetFileSecurity


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

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


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.


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
1-1093532609
mouse_web
2004-08-26 19:03
2004.09.12
Ошибка String


14-1093385158
ИМХО
2004-08-25 02:05
2004.09.12
Кто работал с Lotus Notes?


4-1090929286
help
2004-07-27 15:54
2004.09.12
при попитке запустить сервис видайот сообщениє ошибка 5


14-1093261320
onix
2004-08-23 15:42
2004.09.12
Русские буквы


1-1093795545
nd
2004-08-29 20:05
2004.09.12
Помогите сделать интерфейс программы