Запуск от имени администратора блокирует onDropped объекта DropTarget - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь вызвать это:

MoveFileEx(pChar(src), pChar(dest), MOVEFILE_COPY_ALLOWED)

Программа завершает часть Copy, но не копирует файлы Delete после копирования.Я подумал, что, возможно, мне следует запустить приложение с Administrative privileges, но в тот момент, когда я это сделаю, событие onDropped моего DropTarget блокируется.

Как я могу преодолеть эту проблему?

1 Ответ

4 голосов
/ 12 марта 2019

Не могу точно сказать, почему ваши исходные файлы не удаляются.Да, у вас, скорее всего, нет прав на их удаление, только на их копирование.Это документированная возможность MoveFileEx():

MOVEFILE_COPY_ALLOWED
2 (0x2)

, если файл необходимо переместить на другой том, функция имитирует перемещение с помощью функций CopyFile и DeleteFile.

Если файл успешно скопирован на другой том и исходный файл не может быть удален, функция успешно покидает исходный файлбез изменений.

Это значение нельзя использовать с MOVEFILE_DELAY_UNTIL_REBOOT.

Однако, что касается DragTarget, когда вы запускаете приложение с повышенными правами, оно работает с более высоким уровнем целостностии «Изоляция привилегий пользовательского интерфейса» (UIPI) блокирует процессы с более низкой целостностью от взаимодействия с пользовательскими интерфейсами процессов с более высокой целостностью.В этом случае UIPI блокирует перетаскивание из процесса с более низким уровнем целостности доступа к вашему окну, поэтому DragTarget не вызывается, и нет способа (о котором я знаю) предотвратить это.

У вас есть несколько вариантов:

  1. Не повышайте уровень качества своего приложения, чтобы оно работало на том же уровне целостности, что и большинство других приложений без повышенных прав.Поднимите только тот код, который должен быть повышен, т.е. вызов MoveFileEx().Вы можете:

    • Создать отдельный процесс для вызова MoveFileEx(), используя ShellExecute/Ex() с глаголом runas.Это может быть отдельный EXE-файл или ваш основной EXE-файл с добавленными параметрами командной строки, чтобы указать ему, что делать.

    • поместите MoveFileEx() в COM-объект, который выпри необходимости создайте экземпляр с помощью COM Elevation Moniker .

  2. , если вам необходимо поднять приложение, а затем внедрить отдельное приложение без повышенных прав, чтобы приниматьотбрасывает, а затем передает отброшенные данные в ваше приложение с повышенными правами, используя механизм IPC, который не блокирует UIPI, например сокет.

  3. пусть ваше приложение обрабатывает сообщение окна WM_DROPFILES вместоиспользования DragTarget.Используйте ChangeWindowMessageFilter/Ex(), чтобы разрешить прохождение оконных сообщений WM_COPYDATA, WM_DROPFILES и WM_COPYGLOBALDATA через UIPI.Таким образом, вы сможете, по крайней мере, перетаскивать файлы в свое приложение, но никакие другие виды данных, которые DragTarget в противном случае не позволили бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...