2016-12-16 5 views
2

Я создал приложение, которое посылает ввод с клавиатуры на cmd.exe. Это работает при запуске cmd как обычный пользователь, но не выполняется, когда cmd запускается как администратор.Как отправить ввод в cmd, когда cmd запущен как администратор?

Это мой код:

Var 
    Wnd:hwnd; 
begin 
    wnd:=FindWindow('ConsoleWindowClass',0); 
    if wnd <> 0 then 
    begin 
     setforegroundWindow(wnd); 
     keybd_event(Ord('A'),0,0,0); 
    end; 
end; 

Обратите внимание, что ConsoleWindowClass это имя класса cmd.

Как я могу отправить ввод cmd, когда cmd работает под управлением?

+1

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

+2

Комментарий от удаленного ответа: * Вы можете включить UIAccess = true в запрошенные разрешения манифеста приложения - с оговорками. Это позволяет обходить UIPI для не-повышенных приложений, но приложение, о котором идет речь, должно быть аутентифицировано и должно быть выполнено из защищенного каталога (например,% programfiles% и т. Д.). Однако, удовлетворив это, приложение может быть установлено с помощью установщика с повышенными правами, но после этого может выполняться с разрешениями пользователя, сохраняя при этом разрешение на отправку ввода в приложения с повышенными правами. * –

+0

Спасибо. Ваше право, но мы можем отправить ввод с помощью экранной клавиатуры после запуска cmd в качестве администратора? –

ответ

2

Как я могу ввести этот код внутри cmd, когда cmd запускается как администратор?

Вы не можете. Это по дизайну. Процесс cmd выполняется с более высоким уровнем целостности, чем ваш процесс. Единственный способ преодолеть это - организовать процесс, который подделывает ввод, также выполняется как администратор.

+0

Вы также можете включить 'UIAccess = true' в запрошенные разрешения манифеста приложения - с оговорками. Это позволяет обходить [UIPI] (https://en.wikipedia.org/wiki/User_Interface_Privilege_Isolation) для не-приподнятых приложений, но рассматриваемое приложение должно быть аутентифицировано и должно выполняться из защищенного каталога (например, '% programfiles % 'и т. д.).Однако, удовлетворив это, приложение может быть установлено с помощью установщика с повышенными правами, но после этого может выполняться с разрешениями пользователя, сохраняя при этом разрешение на отправку ввода в приложения с повышенными правами. –

+0

@J ... Да, но приложение является cmd, который находится вне нашего контроля. –

+0

'cmd' является * мишенью * ввода - указанные выше шаги являются требованиями к приложению * отправки *, которое находится под нашим контролем, чтобы получить разрешение, не требуя полной высоты, для отправки ввода в программы с повышенным уровнем. –

0

Наконец-то выяснилось, что если мы запустим базовое приложение как администратор, а затем попробуем отправить ввод в cmd, он отлично работает.

+4

Странно, что вы нашли его сейчас. Удаленный ответ, о котором вы прокомментировали, сказал то же самое более дня назад. –