![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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);