Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c