Конференция "WinAPI" » Повышение прав и их последствия
 
  • Cobalt © (03.03.16 18:40) [0]
    Запустил свою утилиту с повышением прав, она записала файл.

    Потом запустил свою утилиту  из под обычного пользователя - и не могу сохранить его - получаю отлуп "доступ запрещен".
    Файл сохраняется стандартным TStringlist.SaveToFile ( с нулевым SecurityDescriptor'om)

    Стал смотреть, что за фигня - получается, что в 1-ом случае файл создается с владельцем-группой ("админы") а во 2-ом - с владельцем-пользователем (входит в эту группу), а также в разрешениях есть право на запись у "прошедших проверку".

    Изменение владельца на "меня" эффекта не возымела
    помогло добавление права на запись "группе" "прошедшие проверку"

    Собственно, вопрос
    1) это мне теперь придется вручную формировать SecurityDescriptor?
    2) Как получить "дефолтный" дескриптор, чтобы в него уже добавлять SECURITY_AUTHENTICATED_USER_RID?
  • Rouse_ © (03.03.16 19:30) [1]
    А записать данные с правами обычного пользователя - не рассматривается?
  • Cobalt © (03.03.16 23:30) [2]
    Это как?
  • Rouse_ © (03.03.16 23:41) [3]
  • Rouse_ © (03.03.16 23:45) [4]
    Опс, не то - ну короче после того как записал, дай доступ к файлу из под ограниченных учеток
    https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa379577(v=vs.85).aspx
  • Cobalt © (04.03.16 06:38) [5]
    Всё-таки вопрос я задал неправильно :)

    Правильно ли я понял, чтобы обычный пользователь имел право записи, надо добавлять право на запись вот этим вот "прошедшие проверку"?
  • Cobalt © (04.03.16 09:11) [6]
    И еще один вопрос, из любопытсва -
    Если пользователь входит в группу-владельца файла, и на файл есть разрешения для этой группы - какого фига пользователь получает отлуп "Нет доступа" при изменении файла?

    Причём, проводник в свойствах файла показывает в проверке доступных для пользователя действиях, что у него есть права делать все что угодно с файлом.
  • Rouse_ © (04.03.16 11:22) [7]

    > Правильно ли я понял, чтобы обычный пользователь имел право
    > записи, надо добавлять право на запись вот этим вот "прошедшие
    > проверку"?

    Не правильно, ничего не мешает запретить этой группе доступ на запись к файлу.
    Если ты админ. то выполни вот такой код после создания файла или записи в него из под админской учетки:

    function SetEveryoneAccess(const FilePath: string): DWORD;
    const
     SECURITY_WORLD_SID_AUTHORITY: array [0..5] of Byte = (0, 0, 0, 0, 0, 1);
     ACL_REVISION = 2;
     SECURITY_WORLD_RID = 0;
     FILE_READ_DATA        = $001;
     FILE_WRITE_DATA       = $002;
     FILE_APPEND_DATA      = $004;
     FILE_READ_EA          = $008;
     FILE_WRITE_EA         = $010;
     FILE_EXECUTE          = $020;
     FILE_DELETE_CHILD     = $040;
     FILE_READ_ATTRIBUTES  = $080;
     FILE_WRITE_ATTRIBUTES = $100;
     FULL_ACCESS = FILE_READ_DATA or FILE_WRITE_DATA or FILE_APPEND_DATA or
       FILE_READ_EA or FILE_WRITE_EA or FILE_EXECUTE or FILE_READ_ATTRIBUTES or
       FILE_READ_ATTRIBUTES or FILE_WRITE_ATTRIBUTES or STANDARD_RIGHTS_ALL or
       SPECIFIC_RIGHTS_ALL or ACCESS_SYSTEM_SECURITY or MAXIMUM_ALLOWED;
    var
     pACLBuff: array [0..999] of Byte;
     ACL: TACL absolute pACLBuff[0];
     NtAuthority: TSIDIdentifierAuthority;
     Sid: PSID;
     SD: TSecurityDescriptor;
    begin
     {$WARN SYMBOL_PLATFORM OFF}
     Win32Check(InitializeAcl(ACL, Length(pACLBuff), ACL_REVISION));
     Move(SECURITY_WORLD_SID_AUTHORITY[0], NtAuthority.Value[0],
       SizeOf(TSIDIdentifierAuthority));
     Win32Check(AllocateAndInitializeSid(NtAuthority, 1, SECURITY_WORLD_RID,
       0, 0, 0, 0, 0, 0, 0, Sid));
     try
       Win32Check(AddAccessAllowedAce(ACL, ACL_REVISION, FULL_ACCESS, Sid));
       Win32Check(InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION));
       Win32Check(SetSecurityDescriptorDacl(@SD, True, @ACL, False));
       Win32Check(SetFileSecurity(PChar(FilePath), DACL_SECURITY_INFORMATION, @SD));
     finally
       Result := GetLastError;
       FreeSid(Sid);
     end;
     {$WARN SYMBOL_PLATFORM ON}
    end;


    Вот и все, Церетели - доступ на запись будет у всех.
  • DVM © (07.03.16 22:53) [8]

    > Rouse_ ©   (04.03.16 11:22) [7]

    Слушай, Саш, а какой смысл вот этой строки:

    Result := GetLastError;

    Если Win32Check выбросит исключение вряд ли мы дальше сможем использовать как то Result. А если все прошло успешно, то как бы и так ясно, что ошибок не было. Или я что-то не понимаю.
  • Rouse_ © (08.03.16 10:33) [9]
    Сначала win32check небыло и это была обычная функция
  • Лори (21.03.16 12:09) [10]
    Может тогда стоит подправить? С:

    А зачем тама absolute? И константы внутри функции? Им место в заголовочнике всё же...
  • Игорь Шевченко © (22.03.16 10:36) [11]
    Лори   (21.03.16 12:09) [10]

    Вас это всерьез беспокоит ? Функция не выполняет свое предназначение из-за замечаний, указанных вами ?
  • Rouse_ © (23.03.16 21:12) [12]

    > Лори   (21.03.16 12:09) [10]
    > Может тогда стоит подправить? С:
    >
    > А зачем тама absolute? И константы внутри функции? Им место
    > в заголовочнике всё же...

    По пунктам:
    1. absolute для удобства
    2. константы - для поддержки старых версий Delphi
    3. поправить можно - разрешаю.
 
Конференция "WinAPI" » Повышение прав и их последствия
Есть новые Нет новых   [134427   +35][b:0][p:0]