Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не удается задать SetFileSecurity. Code: 1336. Список управления доступом (ACL) имеет неве / 5 сообщений из 5, страница 1 из 1
11.02.2022, 22:30
    #40133647
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается задать SetFileSecurity. Code: 1336. Список управления доступом (ACL) имеет неве
Подскажите, почему получаю ошибку
Code: 1336. Список управления доступом (ACL) имеет неверную структуру

при вызове последнего SetFileSecurity(
По справке, ACL создается самой функцией, а потом мне тыкают, что у неё какая-то не такая структура (((
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
procedure SetSpecialAccessRigths(const AFileName: string);
const
  WellKnownSID_SECURITY_LOCAL_SYSTEM_RID_S = 'S-1-5-18';
  WellKnownSID_Creator_Owner_ID = 'S-1-3-0';
  DOMAIN_ALIAS_RID_ADMINS_S    = 'S-1-5-32-544';
  DOMAIN_ALIAS_RID_USERS_S     = 'S-1-5-32-545';
  SIDSCount = 4;
  SIDsArr: array [0..SIDSCount-1] of string = (
    WellKnownSID_SECURITY_LOCAL_SYSTEM_RID_S, //NT AUTHORITY\система
    WellKnownSID_Creator_Owner_ID, //СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ
    DOMAIN_ALIAS_RID_ADMINS_S, //BUILTIN\Администраторы
    DOMAIN_ALIAS_RID_USERS_S  //BUILTIN\Пользователи
    );
var
  SD: TSecurityDescriptor;
  ACL: PACL;
  i: Integer;
  NewSIDs: array [0..SIDSCount-1] of PSID;
  ea: array [0..SIDSCount-1] of EXPLICIT_ACCESS_A;
  dwNewAclSize: Integer;
begin
  ForceDirectories(AFileName);
  try
    FillChar(NewSIDs, SizeOf(NewSIDs), 0);
    FillChar(ea, SizeOf(ea), 0);
    ACL := nil;
    for i := 0 to SIDSCount-1 do
    begin
       Win32Check(ConvertStringSidToSidW(DOMAIN_ALIAS_RID_USERS_S, NewSIDs[i]));
       ea[i].grfAccessPermissions := GENERIC_ALL;
       ea[i].grfAccessMode := GRANT_ACCESS;
       ea[i].grfInheritance := SUB_CONTAINERS_AND_OBJECTS_INHERIT;
       ea[i].Trustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
       ea[i].Trustee.pMultipleTrustee := nil;
       ea[i].Trustee.TrusteeForm := TRUSTEE_IS_SID;
       ea[i].Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
       ea[i].Trustee.ptstrName := PAnsiChar(NewSIDs[i]);
    end;

    CheckOSError(SetEntriesInAclW(SIDSCount, @ea, nil, ACL));
    Win32Check(InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION));
    Win32Check(SetSecurityDescriptorDacl(@SD, True, @ACL, False));
    Win32Check(SetFileSecurity(PChar(AFileName), DACL_SECURITY_INFORMATION, @SD));
  finally
    LocalFree(HLocal(ACL));
    for i := 0 to SIDSCount-1 do
    begin
      FreeSid(NewSIDs[i]);
    end;
  end;
end;

...
Рейтинг: 0 / 0
12.02.2022, 01:09
    #40133664
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается задать SetFileSecurity. Code: 1336. Список управления доступом (ACL) имеет неве
Cobalt747
Код: pascal
1.
2.
3.
Win32Check(ConvertStringSidToSidW(DOMAIN_ALIAS_RID_USERS_S, NewSIDs[i]));
....
ea[i].Trustee.ptstrName := PAnsiChar(NewSIDs[i]);


Cobalt747
Код: pascal
1.
2.
3.
4.
  ea: array [0..SIDSCount-1] of EXPLICIT_ACCESS_A;
begin
  ..........
    CheckOSError(SetEntriesInAclW(SIDSCount, @ea, nil, ACL));


Я бы писал так (при условии, что логически код верен)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
procedure SetSpecialAccessRigths(const AFileName: string);
const
  WellKnownSID_SECURITY_LOCAL_SYSTEM_RID_S = 'S-1-5-18';
  WellKnownSID_Creator_Owner_ID = 'S-1-3-0';
  DOMAIN_ALIAS_RID_ADMINS_S    = 'S-1-5-32-544';
  DOMAIN_ALIAS_RID_USERS_S     = 'S-1-5-32-545';
  SIDSCount = 4;
  SIDsArr: array [0..SIDSCount-1] of string = (
    WellKnownSID_SECURITY_LOCAL_SYSTEM_RID_S, //NT AUTHORITY\система
    WellKnownSID_Creator_Owner_ID, //СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ
    DOMAIN_ALIAS_RID_ADMINS_S, //BUILTIN\Администраторы
    DOMAIN_ALIAS_RID_USERS_S  //BUILTIN\Пользователи
    );
var
  SD: TSecurityDescriptor;
  ACL: PACL;
  i: Integer;
  NewSIDs: array [0..SIDSCount-1] of PSID;
  ea: array [0..SIDSCount-1] of EXPLICIT_ACCESS;
  dwNewAclSize: Integer;
begin
  ForceDirectories(AFileName);
  try
    FillChar(NewSIDs, SizeOf(NewSIDs), 0);
    FillChar(ea, SizeOf(ea), 0);
    ACL := nil;
    for i := 0 to SIDSCount-1 do
    begin
       Win32Check(ConvertStringSidToSid(DOMAIN_ALIAS_RID_USERS_S, NewSIDs[i]));
       ea[i].grfAccessPermissions := GENERIC_ALL;
       ea[i].grfAccessMode := GRANT_ACCESS;
       ea[i].grfInheritance := SUB_CONTAINERS_AND_OBJECTS_INHERIT;
       ea[i].Trustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
       ea[i].Trustee.pMultipleTrustee := nil;
       ea[i].Trustee.TrusteeForm := TRUSTEE_IS_SID;
       ea[i].Trustee.TrusteeType := TRUSTEE_IS_WELL_KNOWN_GROUP;
       ea[i].Trustee.ptstrName := Pointer(NewSIDs[i]);
    end;

    CheckOSError(SetEntriesInAcl(SIDSCount, @ea, nil, ACL));
    Win32Check(InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION));
    Win32Check(SetSecurityDescriptorDacl(@SD, True, @ACL, False));
    Win32Check(SetFileSecurity(PChar(AFileName), DACL_SECURITY_INFORMATION, @SD));
  finally
    LocalFree(HLocal(ACL));
    for i := 0 to SIDSCount-1 do
    begin
      FreeSid(NewSIDs[i]);
    end;
  end;
end;

...
Рейтинг: 0 / 0
12.02.2022, 13:31
    #40133728
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается задать SetFileSecurity. Code: 1336. Список управления доступом (ACL) имеет неве
Увы, это тоже не помогло.
пришлось делать по другому:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
procedure SetSpecialAccessRigthsByACE(const AFileName: string);
const
  SIDSCount = 4;
  SIDsArr: array [0..SIDSCount-1] of string = (
    WellKnownSID_SECURITY_LOCAL_SYSTEM_RID_S, //NT AUTHORITY\система
    WellKnownSID_Creator_Owner_ID, //СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ
    DOMAIN_ALIAS_RID_ADMINS_S, //BUILTIN\Администраторы
    DOMAIN_ALIAS_RID_USERS_S  //BUILTIN\Пользователи
    );
var
  SD: TSecurityDescriptor;
  pACLBuff: array [0..999] of Byte;
  ACL: TACL absolute pACLBuff[0];
  i: Integer;
  NewSIDs: array [0..SIDSCount-1] of PSID;
  dwNewAclSize: Cardinal;
begin
  ForceDirectories(AFileName);
  try
    dwNewAclSize := SizeOf(TACL) + SizeOf(ACCESS_ALLOWED_ACE) * SIDSCount;

    FillChar(NewSIDs, SizeOf(NewSIDs), 0);
    for i := 0 to SIDSCount-1 do
    begin
       Win32Check(ConvertStringSidToSidW(PChar(SIDsArr[i]), NewSIDs[i]));
       dwNewAclSize := dwNewAclSize + GetLengthSid(NewSIDs[i]) - SizeOf(DWORD);
    end;
  // Align size to a DWORD.
    dwNewAclSize := (dwNewAclSize + (SizeOf(DWORD) - 1)) AND $fffffffc;
    Win32Check(InitializeAcl(ACL, dwNewAclSize, ACL_REVISION));
    for i := 0 to SIDSCount-1 do
       Win32Check(AddAccessAllowedAceEx(ACL, ACL_REVISION, CONTAINER_INHERIT_ACE or OBJECT_INHERIT_ACE {or INHERIT_ONLY_ACE}, FULL_ACCESS, NewSIDs[i]));

    Win32Check(InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION));
    Win32Check(SetSecurityDescriptorDacl(@SD, True, @ACL, False));
    Win32Check(SetFileSecurity(PChar(AFileName), DACL_SECURITY_INFORMATION, @SD));
  finally
    LocalFree(HLocal(@ACL));
    for i := 0 to SIDSCount-1 do
      FreeSid(NewSIDs[i]);
  end;
end;
...
Рейтинг: 0 / 0
12.02.2022, 16:59
    #40133754
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается задать SetFileSecurity. Code: 1336. Список управления доступом (ACL) имеет неве
Cobalt747,
А приложение случаем не 64-бит? А то не так давно тоже приходилось поле в классе выравнивать под вызов апишной функции. Причем в 32-бит всё работало
...
Рейтинг: 0 / 0
13.02.2022, 01:19
    #40133796
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не удается задать SetFileSecurity. Code: 1336. Список управления доступом (ACL) имеет неве
white_nigger,

Нет, приложение 32-бит.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не удается задать SetFileSecurity. Code: 1336. Список управления доступом (ACL) имеет неве / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]