Конференция "WinAPI" » SetFileSecurity [D7, WinXP]
 
  • Cj © (18.02.08 17:20) [0]
    Здраствуйте мастера! Проблема в том,что я начал изучать дескрипторы бузопасности и вот этим кодом заблокировал тестируемую папку Test. Что мне надо изменить,чтобы обратно ее разблокировать? Дело в том, что при повторе SetFileSecurity возвращает false, это что?, я для себя заблокировал папку по полной?- возвращает ведь она ERROR_ACCESS_DENIED, или все-таки ее можно разблокировать?Подскажите? Сильно плиз не пинайте.

    вот код, которым заблокировал

    procedure TForm1.Button1Click(Sender: TObject);
    var
    acl:_ACL;
    sd:SECURITY_DESCRIPTOR;
    begin
    InitializeAcl(acl,sizeof(acl),2);

    InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);  //sd

    setsecuritydescriptordacl(@sd,true,@acl,true);                   //set dacl

    windows.SetFileSecurity('Test',DACL_SECURITY_INFORMATION,@sd);

    end;

  • Джо © (18.02.08 17:27) [1]
    > Что мне надо изменить,чтобы обратно ее разблокировать

    Стать владельцем файла и выставить разрешения заново.
  • Cj © (18.02.08 17:32) [2]
    а как это программно сделать?
    или подскажите пожалуйста как заблокировать файл оставшись его владельцем?
  • Cj © (18.02.08 17:49) [3]
    точно! вы правы, немогу разблокировать файлы которые я не созвавал(были на диске) вот поэтому наверное у них ACCESS_DENIED.
    но вот только как разблокировать :( подскажите?
  • ага (18.02.08 20:36) [4]
    Админ может стать владельцем любого объекта, файла в том числе, ко бы его ни создавал. А владелец может менять все его настройки защиты.

    > а как это программно сделать?

    SetSecutityDescriptorOwner
  • ага (18.02.08 20:43) [5]
    Еще владельцем может стать обладатель привилегии SE_TAKE_OWNERSHIP, или у кого есть на объект право WRITE_OWNER. Но последний вариант не для тя, ты то пустой DACL воткнул.
  • Ins © (18.02.08 20:45) [6]

    > SetSecutityDescriptorOwner


    Думаю, привилегию SE_TAKE_OWNERSHIP_NAME получить сначала придется.
  • Ins © (18.02.08 20:47) [7]

    > Еще владельцем может стать обладатель привилегии SE_TAKE_OWNERSHIP


    Вот поэтому админ и может стать владельцем. У админского процесса в маркере по-умолчанию эта привилегия присутствует.
  • ага (18.02.08 20:57) [8]

    >Думаю, привилегию SE_TAKE_OWNERSHIP_NAME получить сначала придется
    > Вот поэтому админ и может стать владельцем

    Спасибо, я в курсях, ага.

    > У админского процесса в маркере по-умолчанию эта привилегия
    > присутствует.

    Строго говоря наоборот. Она есть у всех процессов, запущенных от имени членов группы Администраторы потому, что по умолчанию имеется у членов этой группы.

    Эта типа если придираться.
  • Cj © (19.02.08 10:16) [9]
    Вот сделал, только че требуются еще какие-то дополнительные привилегии, что-ли? получил все какие знаю.Выдает  { Not all privileges referenced are assigned to the caller. }
     ERROR_NOT_ALL_ASSIGNED = 1300;
    вот код. подскажите че не так?

    type
    PTOKEN_USER = ^TOKEN_USER;
    _TOKEN_USER = record
      User : TSidAndAttributes;
    end;
    TOKEN_USER = _TOKEN_USER;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    acl:_ACL;
    sd:SECURITY_DESCRIPTOR;
     HT: THandle;
     PR, prpr: TOKEN_PRIVILEGES;
     cp: dword;
    var
    lpDomain : PWideChar;
    Sid : PSID;
    cbDomain,cbSid : Cardinal;
    peUse : Cardinal;
    begin
    cbSid:=128;
    cbDomain:=64;

    GetMem(Sid,cbSid);
    GetMem(lpDomain,cbDomain*SizeOf(WideChar));

    begin
      ReAllocMem(Sid,cbSid);
     
      ReAllocMem(lpDomain,cbDomain*SizeOf(WideChar));
     
      LookupAccountNameW(nil,'Cj',Sid,cbSid,lpDomain,cbDomain,peUse);
     end;            

     OpenThreadToken(GetCurrentThread, TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES, false, hT);
     OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES, hT);
     Pr.PrivilegeCount := 28;

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'secreatetokenprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seassignprimarytokenprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'selockmemoryprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seincreasequotaprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seunsolicitedinputprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'semachineaccountprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'setcbprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesecurityprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'setakeownershipprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seloaddriverprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesystemprofileprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesystemtimeprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seprofilesingleprocessprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seincreasebasepriorityprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'secreatepagefileprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'secreatepermanentprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sebackupprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'serestoreprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seshutdownprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sedebugprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seauditprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesystemenvironmentprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sechangenotifyprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seremoteshutdownprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seundockprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesyncagentprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seenabledelegationprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'semanagevolumeprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     CloseHandle(hT);

    InitializeAcl(acl,sizeof(acl),2);

    InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);  //sd

    windows.SetSecurityDescriptorOwner(@sd,sid,false);

    windows.SetFileSecurity('text_programs\BSOD',OWNER_SECURITY_INFORMATION,@sd);
    caption:=inttostr(getlasterror);

    end;
  • Cj © (19.02.08 10:16) [10]
    Вот сделал, только че требуются еще какие-то дополнительные привилегии, что-ли? получил все какие знаю.Выдает  { Not all privileges referenced are assigned to the caller. }
     ERROR_NOT_ALL_ASSIGNED = 1300;
    вот код. подскажите че не так?

    type
    PTOKEN_USER = ^TOKEN_USER;
    _TOKEN_USER = record
      User : TSidAndAttributes;
    end;
    TOKEN_USER = _TOKEN_USER;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    acl:_ACL;
    sd:SECURITY_DESCRIPTOR;
     HT: THandle;
     PR, prpr: TOKEN_PRIVILEGES;
     cp: dword;
    var
    lpDomain : PWideChar;
    Sid : PSID;
    cbDomain,cbSid : Cardinal;
    peUse : Cardinal;
    begin
    cbSid:=128;
    cbDomain:=64;

    GetMem(Sid,cbSid);
    GetMem(lpDomain,cbDomain*SizeOf(WideChar));

    begin
      ReAllocMem(Sid,cbSid);
     
      ReAllocMem(lpDomain,cbDomain*SizeOf(WideChar));
     
      LookupAccountNameW(nil,'Cj',Sid,cbSid,lpDomain,cbDomain,peUse);
     end;            

     OpenThreadToken(GetCurrentThread, TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES, false, hT);
     OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES, hT);
     Pr.PrivilegeCount := 28;

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'secreatetokenprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seassignprimarytokenprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'selockmemoryprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seincreasequotaprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seunsolicitedinputprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'semachineaccountprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'setcbprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesecurityprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'setakeownershipprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seloaddriverprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesystemprofileprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesystemtimeprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seprofilesingleprocessprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seincreasebasepriorityprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'secreatepagefileprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'secreatepermanentprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sebackupprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'serestoreprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seshutdownprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sedebugprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seauditprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesystemenvironmentprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sechangenotifyprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seremoteshutdownprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seundockprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'sesyncagentprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'seenabledelegationprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     Pr.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
     LookupPrivilegeValue(nil, 'semanagevolumeprivilege', Pr.Privileges[0].Luid);
     AdjustTokenPrivileges(hT, false, Pr, SizeOf(Pr), Prpr, cp);

     CloseHandle(hT);

    InitializeAcl(acl,sizeof(acl),2);

    InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);  //sd

    windows.SetSecurityDescriptorOwner(@sd,sid,false);

    windows.SetFileSecurity('text_programs\BSOD',OWNER_SECURITY_INFORMATION,@sd);
    caption:=inttostr(getlasterror);

    end;
  • Cj © (19.02.08 10:18) [11]
    чета Опера тормозит sorry
  • ага (19.02.08 18:03) [12]

    > только че требуются еще

    Еще требуется книжки всякие читать, MSDN, статьи разные. И ваще научиться с WinApi работать, прежде чем за такие вещи браться.

    > получил все какие знаю

    Откуда такая уверенность? Я дык в упор не вижу, чтобы ты "получил" хоть одну привилегию. И даже, что гарантированно включил уже имеющуюся, не вижу.
  • Cj © (20.02.08 14:05) [13]

    > Откуда такая уверенность? Я дык в упор не вижу, чтобы ты
    > "получил" хоть одну привилегию. И даже, что гарантированно
    > включил уже имеющуюся, не вижу.


    в ProcessViewer-е проверял
  • ага (20.02.08 16:35) [14]

    > в ProcessViewer-е проверял

    Да проверяй чем хош. Нет у тя кода получения привилегий, понятно? Просто нет. У тя тут попытки включить для текущего маркера кучу привилегий. Разбирайся в чем разница.

    И что самое смешное, тя совершенно не интересует успешность этих попыток. Спрашивается, нафига тогда включать? ProcessViewer-ом он проверял. А юзеру тож предложишь ProcessViewer юзать?

    У тя ваще ни одной проверки вызовов нет, а за такое нать прилюдно розгами сечь в назидание. Вот ты вызвал SetSecurityDescriptorOwner, а откель ты знаешь
    1) что ты туда нормальный SID передал
    2) Что Owner сменился
    А нифига ты этого не знаешь.

    Ну ладно, нагородил ты этот код, пусть он даже успешно отработал. А хочешь-то чего? Как вставлял пустой список контроля доступа, так и продолжаешь вставлять. А пустой список - запрет для всех. Чего нать то? доступ получить? Ну так и давай себе разрешения.

    > я начал изучать дескрипторы бузопасности

    Нифига ты еще не начал изучать. та начал тыкаться наугад, авось чего получится. а эт не та область, где можно обойтись методом тыка.
  • Ins © (22.02.08 10:55) [15]

    > А хочешь-то чего? Как вставлял пустой список контроля доступа,
    >  так и продолжаешь вставлять. А пустой список - запрет для
    > всех. Чего нать то? доступ получить? Ну так и давай себе
    > разрешения.


    Мы же вроде уже разобрались, что можно никому не давать доступ, но будучи Owner-ом DACL все равно можно подменить. А Owner-ом может стать любой, имеющий привилегию SE_TAKE_OWNERSHIP_NAME.


    > Cj ©   (19.02.08 10:18) [11]

    Ты что-то слишком много телодвижений делаешь ненужных. Ты владелец объекта? Если да, то установить новый DACL ты сможешь в любом случае, ничего для этого не нужно. Если нет - то сначала владельцем ужно стать. Для этого нужно включить привелегию SE_TAKE_OWNERSHIP_NAME (если ты обычный юзер - ты не сможешь этого сделать, если конечно явно не изменить набор привилегий учеток по-умолчанию. У не-админских процессов этой привилегии в маркере попросту нет и включать там нечего). После включения привилегии - установить Owner-ом себя. Советую почитать хотя бы Соломона и Руссиновича, у них написано что как и почему.
  • ага (22.02.08 16:32) [16]

    > Мы же вроде уже разобрались, что можно никому не давать
    > доступ, но будучи Owner-ом DACL все равно можно подменить

    Я не знаю, кто там с чем разбирался/разобрался, мне тут разбираться не с чем.
    Но стать владельцем - не самоцель. Для того и делают себя владельцем, шоб иметь возможность назначить необходимые разрешения себе, любимому. И хрена толку, что он владелец, если список доступа назначает опять пустой?

    Владелец имеет возможность управлять настройками безопасности - все, список исчерпывающий. А чтоб иметь возможность что-то полезное делать с объектом, нужны конкретные права. А сам факт владения тут не приделах.

    Эт я и сказал в предыдущем посте. Че не понятно-то?
  • ага (22.02.08 16:54) [17]
    2 Ins

    > можно никому не давать доступ, но будучи Owner-ом DACL все
    > равно можно подменить

    Хе, сразу не заметил:) А в чем разница-та? Между "права давать" и "DACL"подменить". DACL-то, эт че? Не права чтол-ли, кому чего можно?
  • Ins © (22.02.08 17:48) [18]

    > Хе, сразу не заметил:) А в чем разница-та? Между "права
    > давать" и "DACL"подменить". DACL-то, эт че? Не права чтол-
    > ли, кому чего можно?


    Что-то я не совсем понял, что Вы хотитие этим сказать... Автор спрашивает, можно ли как-нибудь получить доступ к папке, для которой закрыт абсолютно любой вид доступа и абсолютно для всех. Ответ - можно. Так как владелец имеет право изменять DACL, даже если в самом DACL это явно запретить. Согласны?

    Если да, то задача сводится к тому, чтобы стать владельцем объекта (если владелец изначально некто другой).
  • ага (23.02.08 05:20) [19]

    > Что-то я не совсем понял, что Вы хотитие этим сказать


    Я хочу сказать, что фраза "можно никому не давать доступ, но будучи Owner-ом DACL все равно можно подменить" в свете обсуждаемого вопроса звучит абсурдно - замена DACL и есть "дача" прав или запретов.

    Вопрос озвучен так:

    > вот этим кодом заблокировал тестируемую папку Test. Что
    > мне надо изменить,чтобы обратно ее разблокировать?

    Из кода видно, что автор заблокировал доступ, назначив пустой DACL. Соответственно, чтобы снять эту блокировку, ему надо назначить непустой DACL, с правами для себя. А вклинившийся в обсуждение Qwner - всего лишь средство решения данной задачи. И в контексте этого, а также последующего обсуждения, замечание

    > Мы же вроде уже разобрались, что можно никому не давать
    > доступ, но будучи Owner-ом DACL все равно можно подменить.
    >  А Owner-ом может стать любой, имеющий привилегию SE_TAKE_OWNERSHIP_NAME.
    >

    звучит как минимум странно.

    Причем ответ-то правильный емы был дан сразу же, в первом посте. А во втором посте он (автор) уточнил направление

    > а как это программно сделать?
  • Ins © (23.02.08 13:05) [20]

    > А вклинившийся в обсуждение Qwner - всего лишь средство
    > решения данной задачи....
    > Причем ответ-то правильный емы был дан сразу же, в первом
    > посте.

    Снова либо я не понимаю суть вашей претензии, либо вы сами себе противоречите, так как Owner "вклинился" в первом же посте, который вы (и я) считаете правилным ответом.


    > звучит как минимум странно.

    ОК. Если это неочевидно, то уточню, фразу следует читать так:

    Мы же вроде уже разобрались, что можно никому не давать доступ изначально, но будучи Owner-ом...

    Хотя на этот вопрос можно ответить и в духе "надо было изначально не запрещать, не пришлось бы выеживаться".
 
Конференция "WinAPI" » SetFileSecurity [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]