当命令提示符以管理员身份运行时,如何向其发送输入?

3

我创建了一个应用程序,可以将键盘输入发送到cmd.exe

当以普通用户身份运行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;

请注意,ConsoleWindowClasscmd 的类名。
当以管理员身份运行 cmd 时,我该如何向其发送输入?

1
很可能你无法访问窗口,因为你运行的程序没有权限这样做。毕竟它是以管理员身份运行的,你无法访问不在你权限范围内的进程。 - Paul Michael
2
已删除答案的评论:您可以在应用程序清单的请求权限中包含UIAccess=true - 但有附带条件。这允许非提升应用程序规避UIPI,但所涉及的应用程序必须是Authenticode签名,并且需要从受保护的目录(如%programfiles%等)执行。然而,满足此要求后,该应用程序可以使用提升的安装程序安装,但随后可以以用户权限运行,同时保留向提升的应用程序发送输入的权限。 - David Heffernan
https://msdn.microsoft.com/en-us/library/bb756929.aspx - J...
1
@DavidHeffernan 我认为你不应该删除你的答案 - 通常情况下,这是几乎唯一正确的情况。uiAccess令牌是一种比较神秘的解决方法,在许多情况下实现起来相当不切实际。 - J...
1
@m.m osk.exe 已签名。 - Sertac Akyuz
显示剩余5条评论
2个回答

3
当cmd以管理员身份运行时,如何在其中输入此代码?
你不能。这是设计上的行为。cmd进程以比您的进程更高的完整性级别运行。您克服这个问题的唯一方法是安排假输入的进程也以管理员身份运行。

您还可以在应用程序清单的请求权限中包括 UIAccess=true - 但需要注意。这允许非提升的应用程序绕过 UIPI,但所涉及的应用程序必须是经过 Authenticode 签名并且需要从受保护的目录(如 %programfiles% 等)执行。然而,满足此要求后,该应用程序可以使用提升的安装程序进行安装,但随后可以以用户权限运行,同时保留向提升的应用程序发送输入的权限。 - J...
@J... 是的,但该应用程序是cmd,超出我们的控制范围。 - David Heffernan
cmd 是输入的目标 - 上述步骤是发送应用程序的要求,该应用程序在我们的控制下,以获得权限,无需完全提升即可向提升的程序发送输入。 - J...
好的。我猜这就是资源管理器是如何处理它的。无论如何,你可以写一个回答来说明这一点。然后我可以删除这个回复。 - David Heffernan
谢谢David Heffernan。是的,cmd是输入的目标,但现在我该怎么办? - M.MARAMI
keybd_event()(已弃用,请改用SendInput())不受UIPI阻塞的影响,因为输入只是进入与实际键盘驱动程序相同的输入队列。按键将通过与用户手动输入相同的处理过程,并最终出现在前台窗口中。无论该窗口是否以管理员身份运行,在这种情况下都不是一个因素。这仅适用于发送应用程序使用SendMessage()PostMessage()直接向目标窗口发送键盘消息的情况,而这并非本例。 - Remy Lebeau

0
最终发现,如果我们将基础应用程序以管理员身份运行,然后尝试向 cmd 发送输入,它就可以正常工作。

4
很奇怪你现在才发现它。你评论过的那个被删除的回答已经在一天前说了同样的话。 - Sertac Akyuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接