Конференция "WinAPI" » Как стать владельцем для файла или папки? [D7]
 
  • Nikfel (12.02.11 20:15) [0]
    Пробовал так, но всё время ошибка 87:
         
    function SetPrivilege(privilegeName: string; enable: boolean): boolean;
    var
     tpPrev,
     tp        : TTokenPrivileges;
     token      : THandle;
     dwRetLen  : DWord;
    begin
     result := False;

     try
     OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token); //i"получаем маркер безопасности процесс- токен

     tp.PrivilegeCount := 1;
     if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then //получаем идентификатор привилегии - LUID
     begin
       if enable then
         tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED  //устанавливаем атрибуты привилегии
       else
         tp.Privileges[0].Attributes := 0;

       dwRetLen := 0;
       result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen); //включаем или отключаем привилегию
     end;

     finally
     try
     CloseHandle(token);
     except
     end;
    end;
    end;

    function SID_GetUserSID(Machine,AccountName:string):Pointer;
         var
           PSID, PRef: Pointer;
           SIDSize, RefSize, peUse: Cardinal;
         
         begin
           SIDSize:=0;
           RefSize:=0;
           LookupAccountName(PChar(Machine),PChar(AccountName),nil,SIDSize,nil,
             RefSize,peUse);
           GetMem(PSID,SIDSize);
           GetMem(PRef,RefSize);
           try
             if not LookupAccountName(PChar(Machine),PChar(AccountName),PSID,
               SIDSize, PRef,RefSize,peUse) then begin
               result:=nil;
               exit;
             end else result:=PSID;
           finally
             FreeMem(PRef);
             FreeMem(PSID);
           end;
         end;
         
         
         procedure TForm1.Button2Click(Sender: TObject);
         var Sid:Pointer;
             Sd:PSecurityDescriptor;
             i:integer;
         begin
         SetPrivilege('SeTakeOwnershipPrivilege', true);//включаем привилегию
           sid:=SID_GetUserSID('','Администратор');
           if sid<>nil then begin
             GetMem(Sd,1024);
                InitializeSecurityDescriptor(Sd,SECURITY_DESCRIPTOR_REVISION);
                SetSecurityDescriptorOwner(Sd,Sid, False);
                i:=SetNamedSecurityInfo('E:\',SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,@sid,nil ,nil,nil);
                if i = ERROR_SUCCESS then caption:='1' else caption:=inttostr(i);
             FreeMem(Sd);
           end;
         SetPrivilege('SeTakeOwnershipPrivilege', false);//выключаем привилегию
         end;



    Где ошибка? Заранее спасибо.
  • clickmaker © (12.02.11 20:50) [1]
    if i = ERROR_SUCCESS then caption:='1' else caption:=SysErrorMessage(i);
  • Nikfel (12.02.11 20:57) [2]
    Выдаёт что неверно задан параметр, а вот какой именно так и не ясно.
  • Nikfel (12.02.11 21:03) [3]
    Мне почему-то кажется что неверно я получаю Sid, но вот что там не так не понятно.
  • Nikfel (12.02.11 21:37) [4]
    Код не работал потому что было в SetNamedSecurityInfo @Sid, а надо просто Sid
  • Anatoly Podgoretsky © (12.02.11 21:58) [5]
    В какой строке, ну не искать же нам самим.
  • Nikfel (12.02.11 22:09) [6]
    Вот в этом ошибка:

    i:=SetNamedSecurityInfo('E:\',SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,@sid,nil  ,nil,nil);

    надо так:

    i:=SetNamedSecurityInfo('E:\',SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,sid,nil ,nil,nil);
  • Nikfel (12.02.11 22:12) [7]
    в Windows7 работает этот код только под правами администратора, но возможно ли его заставить работать под обычной учётной записью? Наверно какие-то ещё нужны права доступа, т.к. пишет отказано в доступе.
  • KilkennyCat © (12.02.11 22:46) [8]

    > Наверно какие-то ещё нужны права доступа

    наверное.
    если б не наверное, то тогда вся идеология прав нахрен не нужна.
  • han_malign (14.02.11 13:45) [9]
    A standard user account contains only the following Windows privileges:
    SeChangeNotifyPrivilege
    SeShutdownPrivilege
    SeUndockPrivilege
    SeIncreaseWorkingSetPrivilege
    SeTimeZonePrivilege

    Note
    What Windows privileges the filtered access token contains are based on whether the original access token contained any of the restricted RIDS listed above. If any of the restricted RIDs were in the access token, all of the Windows privileges are removed except:
    SeChangeNotifyPrivilege
    SeShutdownPrivilege
    SeUndockPrivilege
    SeReserveProcessorPrivilege
    SeTimeZonePrivilege
    If no restricted RIDs were in the access token, only the following Windows privileges are removed:
    SeCreateTokenPrivilege
    SeTcbPrivilege
    SeTakeOwnershipPrivilege
    SeBackupPrivilege
    SeRestorePrivilege
    SeDebugPrivilege
    SeImpersonatePrivilege
    SeRelabelPrivilege
    The first access token, called the filtered access token, has the previous RIDs (if present) marked as USE_FOR_DENY_ONLY in the access token and the administrative Windows privileges, not listed previously, removed. The filtered access token will be used by default when the user launches applications. The unmodified full administrator access token is then attached to the filtered access token and is used when requests are made to launch applications with a full administrator access token.
 
Конференция "WinAPI" » Как стать владельцем для файла или папки? [D7]
Есть новые Нет новых   [134465   +2][b:0][p:0.002]