Перемещение в корзину из процесса с повышенными правами

Я использую функцию SHFileOperationW с параметром FO_DELETE для перемещения файла в корзину (если корзина не отключена).

Проблема заключается в том, что я вхожу в систему как пользователь не администратор и запускаю свое приложение как администратор. Файлы перемещаются в корзину администратора.

Можно ли сделать так, чтобы файлы перемещались в корзину текущего зарегистрированного пользователя, не являющегося администратором?

Моя идея состояла в том, чтобы запустить отдельный процесс без повышенных прав и переместить его оттуда в корзину. Но я не уверен, что существует лучшее решение. Я пытался найти ответ в Интернете, но безуспешно.


person Community    schedule 12.11.2013    source источник
comment
Кажется, правильно было бы не запускать ваше приложение от имени администратора. Если у вас есть задача, требующая прав администратора, создайте отдельный процесс, который запрашивает повышение прав.   -  person Bill_Stewart    schedule 24.11.2013
comment
спасибо, я решил это, как вы говорите.   -  person    schedule 04.12.2013


Ответы (2)


Я бы предложил следующую процедуру - проверено на Delphi XE 10.

function File2Trash(const FileName: string): boolean;
var
    fos: TSHFileOpStruct;
begin
      FillChar(fos, SizeOf(fos), 0);
      with fos do
      begin
        wFunc  := FO_DELETE;
        pFrom  := PChar(ExpandFileName(FileName)+#0#0);
        fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI;
      end;
      Result := (0 = ShFileOperation(fos));
end;

Важны некоторые детали:

  • не следует использовать относительный путь, существующий путь следует расширить до полного;
  • добавление #0#0 в конец имени файла является обязательным;
  • чтобы эта операция была тихой, я бы предложил использовать еще один флаг FOF_NOERRORUI.
person Sergey Ryvkin    schedule 22.11.2017

Когда мне нужно было использовать эту процедуру, я использовал следующие команды. Я надеюсь, что это полезно.

Тесты с Delphi 2010 и Windows 8.

procedure TForm2.Button1Click(Sender: TObject);
var
  vMsg : string;
begin
  // If want permanently delete
  //deletefile(edit1.text);

  SendFileToTrash(edit1.Text, vMsg);

  if (vMsg = '') then
  begin
    ShowMessage('File sent to the trash.');
  end else begin
    ShowMessage(vMsg);
  end;

end;


procedure TForm2.SendFileToTrash(const aFileName: TFileName; var MsgError: string);
var
  Op: TSHFileOpStruct;
begin
  {Very importante
     Include in Uses  SysUtils and ShellAPI;
  }
  MsgError := '';

  if not (FileExists(aFileName)) then
  begin
    MsgError := 'File not found.';
    Exit;
  end;

  FillChar(Op, SizeOf(Op), 0);

  Op.wFunc := FO_DELETE;
  Op.pFrom := PChar(aFileName+#0);
  Op.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;

  if (ShFileOperation(Op) <> 0) then
  begin
      MsgError := 'Could not send the file to the trash.';
  end;

end;
person Anderson Silva    schedule 17.11.2013
comment
Спасибо, но, к сожалению, это не ответ на мой вопрос. Я использую почти такой же код. - person ; 20.11.2013
comment
см. подробности этой строки [Op.pFrom := PChar(aFileName+#0);], но конкретно +#0. Без этого фрагмента кода не работает. - person Anderson Silva; 20.11.2013
comment
Я думаю, что вы не поняли вопроса. Пожалуйста, прочитайте мой вопрос еще раз. Спасибо. - person ; 21.11.2013