Конференция "WinAPI" » Как программно стать владельцем файла? [D6, WinXP]
 
  • Виталий (24.04.09 16:02) [0]
    Подскажите пожалуйста как программно стать владельцем файла.

    Говорят что нужно использовать SetNamedSecurityInfo, но мне пока не очень понятно как с ней работать, и как правильно передавать и наполнять их.

    Если есть другой способ просьба натолкнуть на мысль, литературой или кодом.

    Заранее спасибо.
  • Eraser © (24.04.09 16:08) [1]
    > [0] Виталий   (24.04.09 16:02)


    > Говорят что нужно использовать SetNamedSecurityInfo

    правильно говорят.

    > но мне пока не очень понятно как с ней работать, и как правильно
    > передавать и наполнять их.

    гугл не помогает?
  • Виталий (24.04.09 17:06) [2]

    > гугл не помогает?

    неа. пока не очень.
    Не пойму как там параметры наполнять. откуда их брать...
  • Eraser © (24.04.09 17:38) [3]
  • Виталий (27.04.09 11:28) [4]
    Вот сообразил такой пример:

    //****************************************************
      function SID_GetUserSID;
    var
     PSID, PRef: Pointer;
     SIDSize, RefSize, peUse: Cardinal;

    begin
     SIDSize:=0;
     RefSize:=0;
     // Первый вызов функции позволяет получить необходимые размеры буферов
     // для SID и имени домена
     LookupAccountName(PChar(Machine),PChar(AccountName),nil,SIDSize,nil,
       RefSize,peUse);
     GetMem(PSID,SIDSize);
     GetMem(PRef,RefSize);
     try
       // Получаем SID учетной записи
       if not LookupAccountName(PChar(Machine),PChar(AccountName),PSID,
         SIDSize, PRef,RefSize,peUse) then begin
         result:=0;
         exit;
       end else result:=PSID;
     finally
       FreeMem(PRef);
       FreeMem(PSID);
     end;
    end;
    //****************************************************
    ...
    begin
    sid:=SID_GetUserSID(Edit1.Text,'');
    Memo1.Lines.Text:='Взят SID из '+IntToStr(integer(sid));
    if sid<>nil then
    Memo1.Lines.Text:=Memo1.Lines.Text+' ['+SID_SidToName(sid)+']';

    SetLastError(0);
    IsValidSid(sid);
     err:=GetLastError; Memo1.Lines.Add('IsValidSid(sid); - '+SysErrorMessage(err));

    SetLastError(0);
    InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
     err:=GetLastError; Memo1.Lines.Add('InitializeSecurityDescriptor(@sd,2) - '+SysErrorMessage(err));
    {SetLastError(0);
    GetSecurityDescriptorOwner(@sd,SID,pbOwnerDefaulted);
     err:=GetLastError; Memo1.Lines.Add('GetSecurityDescriptorOwner(@sd,SID,true) - '+SysErrorMessage(err));
      Memo1.Lines.Add('SID - '+IntToStr(integer(sid)));
    {}

    SetLastError(0);
    SetSecurityDescriptorOwner(@sd,SID,pbOwnerDefaulted);
     err:=GetLastError; Memo1.Lines.Add('SetSecurityDescriptorOwner(@sd,SID,true) - '+SysErrorMessage(err));
    SetLastError(0);
    SetNamedSecurityInfo(pchar(ShellTreeView1.Path),SE_FILE_OBJECT,OWNER_SECURITY_IN FORMATION,@sid,nil,nil,nil);
     err:=GetLastError; Memo1.Lines.Add('SetNamedSecurityInfo - '+SysErrorMessage(err));
    end;



    Все функции выполняются без ошибок, но владелец не меняется. Что я не учитываю?
  • clickmaker © (27.04.09 14:34) [5]
    IsValidSid

    If the SID structure is not valid, the return value is zero. There is no extended error information for this function; do not call GetLastError.

    (c) MSDN
  • Игорь Шевченко © (27.04.09 14:42) [6]

    > Не пойму как там параметры наполнять. откуда их брать...


    Справка тоже не помогает ?
  • Виталий (27.04.09 16:04) [7]

    > clickmaker ©   (27.04.09 14:34) [5]

    Лады, согласен переписал:
    if not IsValidSid(sid) then
     Memo1.Lines.Add('IsValidSid(sid); - '+SysErrorMessage(err))
    else
     Memo1.Lines.Add('IsValidSid(sid) ok');



    Возвращает  isValidSid(sid) ok
    т.е. SID Верный, к тому же я по нему правильно получаю имя и аккаунт, так что эта функа точно вне подозрения.


    > Игорь Шевченко ©   (27.04.09 14:42) [6]

    Ну а как ты думаешь, если бы помогла, стал бы я спрашивать?
  • Виталий (27.04.09 16:04) [8]
    Удалено модератором
  • Виталий (27.04.09 16:05) [9]
    Удалено модератором
  • Игорь Шевченко © (27.04.09 18:11) [10]

    > Ну а как ты думаешь, если бы помогла, стал бы я спрашивать?


    Я не в курсе, обычно справки хватает, ее для того и пишут, чтобы хватало.
 
Конференция "WinAPI" » Как программно стать владельцем файла? [D6, WinXP]
Есть новые Нет новых   [134435   +38][b:0][p:0.001]