【问题标题】:How to send input to cmd when cmd is running as administrator?当cmd以管理员身份运行时如何将输入发送到命令?
【发布时间】:2017-05-02 08:36:00
【问题描述】:

我创建了一个将键盘输入发送到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 以管理员身份运行时,我如何向cmd 发送输入?

【问题讨论】:

  • 您很可能无法访问该窗口,因为您正在运行的程序没有这样做的权限。毕竟它是以管理员身份运行的,您无法访问不在您权限范围内的进程。
  • 已删除答案的评论:您可以在应用程序清单的请求权限中包含 UIAccess=true - 带有警告。这允许为非提升的应用程序规避 UIPI,但相关应用程序必须经过身份验证签名,并且需要从受保护的目录(如 %programfiles% 等)执行。然而,为了满足这一点,可以使用提升的安装程序安装应用程序,但此后可以使用用户权限运行,同时保留向提升的应用程序发送输入的权限。
  • 谢谢。你的权利,但我们可以在以管理员身份运行 cmd 后通过屏幕键盘发送输入?
  • @DavidHeffernan 我认为您不应该删除您的答案-通常几乎完全是这样。 uiAccess 令牌是一种深奥的解决方法,在很多情况下正确实施是相当不切实际的。
  • @m.m osk.exe 已签名。

标签: windows delphi cmd admin uipi


【解决方案1】:

当 cmd 以管理员身份运行时,如何在 cmd 中输入此代码?

你不能。此行为是设计使然。 cmd 进程以比您的进程更高的完整性级别运行。解决此问题的唯一方法是安排伪造输入的进程也以管理员身份运行。

【讨论】:

  • 您还可以在应用程序清单的请求权限中包含UIAccess=true - 带有警告。这允许对非提升的应用程序规避UIPI,但有问题的应用程序必须经过身份验证,并且需要从受保护的目录(如%programfiles% 等)执行。然而,为了满足这一点,可以使用提升的安装程序安装应用程序,但此后可以使用用户权限运行,同时保留向提升的应用程序发送输入的权限。
  • @J... 是的,但应用程序是 cmd,这是我们无法控制的
  • cmd 是输入的 target - 上述步骤是 sending 应用程序的要求,它在我们的控制之下,以获得无需完全提升即可将输入发送到提升的程序的权限。
  • 好的。我猜这就是资源管理器如何管理它。无论如何,您可能会写一个答案来说明这一点。然后我可以删除这个。
  • 谢谢大卫赫弗南。是的 cmd 是输入的目标,但现在我该怎么做?
【解决方案2】:

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

【讨论】:

  • 奇怪你现在找到了它。您评论的已删除答案在一天多前说了同样的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2015-10-09
  • 2018-02-05
  • 1970-01-01
  • 2021-03-16
  • 2011-11-28
相关资源
最近更新 更多