如何在c#中将输入发送到winlogon

Posted

技术标签:

【中文标题】如何在c#中将输入发送到winlogon【英文标题】:how to send inputs to winlogon in c# 【发布时间】:2013-11-25 12:25:43 【问题描述】:

如何更改桌面?我有兴趣将鼠标事件发送到 winlogon 桌面(我将在系统帐户上运行应用程序)。问题是当我调用 mouse_event(或任何其他函数(keybd_event、sendinput、sendkeys 等)时没有任何反应 即使我仍在默认桌面上,也没有任何反应。 setthreaddesktop 返回 true,这意味着更改成功。 我什至尝试放置一个具有相同结果的消息框。

我创建了一个新线程,否则 setthreaddesktop 返回 170 错误代码(正在使用的资源)。

      bool dd = false;
      StringBuilder name = new StringBuilder(200, 200);

       uint sss = 0;
      IntPtr hDesktop = OpenInputDesktop(1, true, desktop_ReadObjects | desktop_WriteObjects);

      System.Threading.Tasks.Task.Factory.StartNew(() =>
           dd = SetThreadDesktop(hDesktop);
            CloseDesktop(hDesktop);
            bool get = GetUserObjectInformation(hDesktop, 2, name, 100, ref sss);
                SendKeys.Send("X");
            mouse_event(MOUSEEVENTF_LEFTDOWN, 400, 400, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, 400, 400, 0, 0);
            mouse_event(MOUSEEVENTF_RIGHTDOWN, 400, 400, 0, 0);
            mouse_event(MOUSEEVENTF_RIGHTUP, 400, 400, 0, 0);
).Wait();

编辑:如果我不使用 SetThreadDesktop mouse_event 正在工作

谢谢,

【问题讨论】:

我对此有两个想法:1)系统帐户可能是非交互式的(它没有鼠标) 2)Winlogon 可能是安全关键,所以你不应该弄乱它.你还想归档什么? 当我在默认桌面上时也会发生同样的事情。如果仅在 Winlogon 桌面上是这种情况,我会理解,但事实并非如此。 为什么要切换用户?如果需要以其他用户身份运行进程,可以使用“runas”命令。 我想做一个远程桌面应用。我需要处理 UAC 提示。这是主要问题。 UAC-Prompt 在“受保护的桌面”中运行 - 您可能不会被允许在那里发送输入。 【参考方案1】:

Windows 登录桌面受到保护,需要特殊权限才能运行进程和消息循环。

如果您在 SYSTEM 下运行,您可以复制自己的安全令牌并使用 SetTokenInformation 更改 SessionId 以在目标用户会话的 WinSta0\Winlogon 桌面上创建一个新进程(使用 CreateProcessAsUser)。

或者,您可以在目标用户会话中复制另一个以 SYSTEM 身份运行的进程的安全令牌,例如 winlogon.exe 和 lsass.exe。见:Running a process at the Windows 7 Welcome Screen

无论哪种方式,您都将进行大量 Win32 调用来完成此任务。

【讨论】:

以上是关于如何在c#中将输入发送到winlogon的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Nest 中将日期值发送到 elasticsearch 聚合查询

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?

C#:如何在 Blazor Wasm 托管中将动态 Razor 组件从服务器发送到客户端?

如何在 C# 中将用户输入添加到二维数组

在 C# 中将 MIDI 消息发送到 DAW

如何使用Angular 6在一个输入中将多个对象发送到嵌套子组件