Все дело было в том, что мнен нужно было дать права доступа юзверю не встроеному, а просто зарегистрированному в системе. Мне было известно его имя. И пробовал я получить его SID через LookupAccountName. В общем, с ним-то и были проблемы. Но решение нашлось. Может, кому нужно станет... Вот решение:| Код | function AddAceToAcl(Name: String; ObjectType: TSeObjectType; User: String; AccessRights: Cardinal): Cardinal; //DWORD AddAceToAcl (LPTSTR lpObjectName, SE_OBJECT_TYPE ObjectType) var dwRes: Cardinal; pOldDACL, pNewDACL: PACL; pSD: PSecurityDescriptor; ea: TExplicitAccess; begin if (Name = '') then begin Result := ERROR_INVALID_PARAMETER; Exit; end;
// get a pointer to the existing DACL dwRes := GetNamedSecurityInfo(PChar(Name), ObjectType, DACL_SECURITY_INFORMATION, nil, nil, @pOldDACL, nil, pSD);
if dwRes <> ERROR_SUCCESS then begin result := dwRes; Exit; end;
// initialize an EXPLICIT_ACCESS structure to allow access ZeroMemory(@ea, SizeOf(TExplicitAccess)); BuildExplicitAccessWithName(@ea, PChar(User), AccessRights, SET_ACCESS, NO_INHERITANCE);
// create an new ACL by merging the EXPLICIT_ACCESS structure // with the existing DACL dwRes := SetEntriesInAcl(1, @ea, pOldDACL, pNewDACL); if dwRes = ERROR_SUCCESS then begin // attach the new ACL as the object's DACL dwRes := SetNamedSecurityInfo(PChar(Name), ObjectType, DACL_SECURITY_INFORMATION, nil, nil, pNewDACL, nil); end;
result := dwRes; end; | Это переведено из С. Работает справно. И не только для файлов. Да, и еще... Я тут пользовал JEDI Win32API, так что у Вас могут возникнуть проблемы с типами. |