Delphi: приложение, работающее от имени администратора, не получает сообщения от приложения, не являющегося администратором - PullRequest
0 голосов
/ 09 мая 2019

Я хочу отправлять сообщения в другое приложение, используя SendMessage / PostMessage, но когда другое приложение работает от имени администратора, оно никогда не получает сообщения.Как я могу преодолеть это, не запуская "отправляющее" приложение в качестве администратора?

РЕДАКТИРОВАТЬ: код ответа Реми, приложение получателя

Const dummyValue = WM_USER + 71423;

  Application.HookMainWindow(AppClass.AppHookFunc);
  ChangeWindowMessageFilter(dummyValue, MSGFLT_ADD);

Type TAppClass = class
  function AppHookFunc(var Message : TMessage): Boolean;
end;

Var AppClass: TAppClass;

function TAppClass.AppHookFunc(var Message : TMessage): Boolean;
begin
  Result := False;
  Case Message.Msg of
    dummyValue: begin
      // do stuff
      //
      Result := True;
    end;
  end;
end;

1 Ответ

5 голосов
/ 09 мая 2019

Изоляция привилегий пользовательского интерфейса (UIPI) не позволяет процессу с более низкой целостностью отправлять сообщения окна в процесс с более высокой целостностью. Единственное, как вы можете справиться с этим ограничением с точки зрения программного обеспечения, это:

  • Запустите отправляющее приложение на более высоком уровне целостности (то есть запустите его с повышенными привилегиями), чтобы соответствовать целевому процессу.

  • если у вас есть доступ к изменению исходного кода для принимающего приложения, включите его для получения определенных оконных сообщений от процессов с более низким уровнем целостности, вызвав ChangeWindowMessageFilter() или ChangeWindowMessageFilterEx() на себя.

  • чтобы отправляющее приложение обошло UIPI, запросив uiaccess=true в его элементе манифеста приложения <requestedExecutionLevel>. Однако к этому предъявляются дополнительные требования:

    • Приложение должно иметь цифровую подпись с сертификатом, который можно проверить с помощью корневого сертификата, установленного на компьютере.

    • приложение должно быть установлено в "защищенной" папке в файловой системе 1 (в которую обычные пользователи не могут писать) в %ProgramFiles% и его подкаталогах или в %WinDir% и его подкаталоги (за исключением нескольких подкаталогов, к которым у обычных пользователей есть доступ для записи).

      1: это требование настраивается через системную политику .

Вне контроля программного обеспечения, единственный доступный вариант требует изменения системных политик для полного отключения контроля учетных записей пользователей (UAC) и / или UIPI на системном уровне. Что вы не должны делать.

...