问题标签 [uipi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
743 浏览

c++ - XP SP3 中的用户界面权限隔离

经过一番确认,真的:

XP SP3 是否实现了 Vista 中的用户界面特权隔离 (UIPI) 机制?

人类兴趣的背景故事 :) 我最近将 C++ 源代码交给了一个相当大的应用程序。遗憾的是,自 90 年代中期以来,该应用程序的唯一开发人员最近去世了,这使我们处于非常紧张的境地,直到我们可以聘请新的开发人员。

最近用户报告说该应用程序随机停止工作和/或以前工作的某些功能似乎根本没有触发“尽管没有任何改变我的结局!”。“没有改变”原来是SP3 :)

知道这一点,虽然我不是 C/C++ 人,但我想我会看看源代码,看看是否能找到任何东西(花了很多时间查看防火墙、病毒扫描程序和其他外在因素)。

我追踪到一个错误是调用 Api 函数 SendMessage,然后去 MSDN 文档查看。它明确指出“Microsoft Windows Vista 及更高版本。消息发送受用户界面特权隔离 (UIPI) 的约束。进程的线程只能将消息发送到具有较低或相等完整性级别的进程中的线程的消息队列。” 虽然我不是 100% 确定,但这似乎是一个可能的原因。

干杯!

莱尼。

0 投票
2 回答
4738 浏览

c++ - 从 DLL 向 Vista 中另一个进程中的窗口发送消息

我正在把头发拉出来。我正在尝试向另一个进程中的窗口发送消息。在调用 SendMessage 或 PostMessage 或 PostThreadMessage 后,我不断从 GetLastError() 获得访问被拒绝 (0x5)。我试过关闭UAC。我还通过确保完整性级别与跨进程匹配来说明 UIPI。(我使用 SysInternals 的 Process Explorer 进行了检查,现在是 MS)我也关闭了 Windows Defender,但没有运气。我可以从进程内部向窗口发送消息就好了,但是从外部我得到了bupkus!这似乎是某种安全问题,但我不知道它是什么,因为两个进程具有相同的完整性级别(中 - 十进制 8192)

来自 DLL 的代码发送消息

从接收窗口中选择的代码

0 投票
1 回答
1228 浏览

c++ - 访问外部窗口句柄

我目前正在处理的程序有问题。这是由于 vista/Windows 7 中增加的安全性引起的,特别是 UIPI,它可以防止具有较低完整性级别的窗口与更高的“对话”。

就我而言,我想告诉具有高完整性级别的窗口移动到我们的应用程序中,它可以在 XP 或 Windows 7 上完美运行,并关闭安全性。

我已经尝试直接设置更高 IL 窗口的 HWND,而不是使用 findwindow() 函数,这工作正常,但程序在尝试移动它或通常与之交互时会失败。窗口句柄由应用程序保存,以供在较低 IL 上运行的应用程序嵌入和读取。

我还尝试将清单中的 UIaccess 设置为 TRUE 并对程序进行数字签名,但没有运气。

关于如何解决这个问题的任何想法?谢谢。

0 投票
1 回答
970 浏览

delphi - 如何从具有管理员权限的应用程序接收键盘输入到非管理员应用程序?

我编写了一个应用程序,该应用程序具有一个覆盖类型的窗口,可以通过热键显示和隐藏,而另一个应用程序具有焦点。所述其他应用程序是以管理员权限运行的 DirectX 游戏。

我已经尝试了 3 种可能的解决方案来在另一个应用程序中按下我的热键时获得通知,其中 2 种可以工作,但也要求我的应用程序具有管理权限。这是可以接受的,但我更希望有一个不需要这些特权的解决方案。我确信必须有一种方法,因为像 TeamSpeak 这样的应用程序确实可以在不以管理员身份运行的情况下接收输入。

我已经尝试过的:

  1. RegisterHotkey - 不适合,因为它在 DirectX 窗口中不起作用。
  2. SetWindowsHookEx - 用作通用键盘挂钩,但仅具有管理员权限。
  3. GetAsyncKeyState - 用于检查指定的热键,但不是没有管理员权限。

所以是的,如果有人能提供一个不同的解决方案的想法,我将非常感激,因为我想不出更多了......我正在使用 Delphi,但因为我依赖于 Windows API,所以我不认为解决方案将是特定于语言的。

0 投票
0 回答
3720 浏览

c# - 由于 UIPI,SendInput 失败

我正在尝试在 Win7 上模拟鼠标事件,我的应用程序使用网站http://inputsimulator.codeplex.com/上的开源项目“Windows Input Simulator”,该项目在内部使用以下代码来模拟鼠标事件:

当我使用 Visual Studio 2010 调试它时,我的应用程序运行完美。左键单击事件、右键单击事件和鼠标移动事件都可以。但是当我通过双击 .exe 应用程序可执行文件从资源管理器启动我的应用程序时,单击事件不会发送。只有鼠标移动事件是可以的,如果我尝试模拟左键单击或右键单击,我的应用程序将收到异常并退出。我发现异常是由以下代码引发的:

这表示 UIPI 阻止了 SendInput(...)。所以我谷歌这个话题,并得到一些建议。

1) 将 uiAccess="true" 添加到我的应用程序清单中

2) 创建一个测试证书并将此证书添加到本地机器受信任的根证书颁发机构证书存储和受信任的发布者证书存储。

3) 用以前的数字签名签署我的申请

4) 将我的应用程序安装到“C:\Program Files”文件夹,这是我计算机上的安全位置之一。

我想我已经做了所有的事情来满足 UIPI 的要求,但是在我启动我的应用程序并同意 UAC 提示后问题仍然没有解决。只有鼠标移动事件是可以的。

PS:如果我不使用测试证书签署我的应用程序,并且只在清单中添加带有 uiAccess="true" 的“requestedExecutionLevel”,应用程序将无法启动,并且 Windows 会显示一个对话框,其中包含消息“从服务器返回了一个推荐。”。如果我用测试证书签署了我的应用程序,UAC 将在我开始我的应用程序时工作。该应用程序将一直工作,直到我调用 SendInput 来模拟单击事件然后抛出异常。

我已经在http://msdn.microsoft.com/en-us/library/bb625963.aspx阅读了有关“接口特权隔离 (UIPI) 和完整性”的要求,但是在完成所有这些操作之后,仍然无法正常工作。

我找到了一个博客,在这个博客中,它说

通过在 [应用程序清单] 的 requestedPrivileges 属性中指定 UIAccess=”true”,应用程序要求绕过 UIPI 对跨权限级别发送窗口消息的限制。Windows Vista 在启动具有 UIAccess 权限的应用程序之前实施以下策略检查。应用程序必须具有可以使用数字证书验证的数字签名,该数字证书链接到本地​​计算机受信任的根证书颁发机构证书存储中的受信任的根。应用程序必须安装在只能由管理员写入的本地文件夹应用程序目录中,例如 Program Files 目录。

不幸的是,如果您的应用程序可以由非管理员用户安装,这将不起作用。

我想知道如何使我的应用程序不符合最后一句“不幸的是,如果您的应用程序可以由非管理员用户安装,这将不起作用”并且可以通过在清单中添加 uiAccess="true" 来绕过 UIPI。

任何人都可以帮助我吗?

0 投票
1 回答
1955 浏览

vb.net - 当此代码不起作用时,如何以编程方式在另一个程序中单击鼠标

我是自动化的忠实拥护者,所以每当我有机会尝试自动化必须重复的任务时。以下代码通常允许我在屏幕上的任何位置(以及在任何可能的应用程序中)单击鼠标:

这通常没有问题。我已经在一系列应用程序中使用它,效果很好。但是,我现在正在尝试对似乎完全忽略鼠标和键盘命令的应用程序进行一些鼠标单击(和击键发送)。一旦鼠标移动到程序所覆盖的屏幕区域,它就不会移动、单击等,但是我手动将鼠标移开,它会继续该过程,就好像它一直在正常工作一样。

那么有没有其他方法可以以编程方式控制鼠标,以一种与我手动移动鼠标无法区分的方式模拟鼠标?

0 投票
1 回答
309 浏览

uac - 如何将窗口消息从提升的安装程序进程广播到用户窗口?

有一个 InstallShield 安装程序
,它写入新的环境变量
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
并调用
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE,...
它还在“开始”菜单中创建快捷方式,
但安装后它们不起作用因为程序需要新变量。

安装程序通常会要求系统重新启动,
但在某些配置中它不会,并且这个问题是偶然发现的。

我用谷歌搜索可能原因是在 UAC 和 UIPI 中:
安装程序运行提升并且消息没有来到用户的窗口
和开始菜单快捷方式也不知道新变量
只有在注销登录后它们才能工作

所以问题是:
是否可以广播到所有用户的窗口?

我很惊讶,看起来很奇怪,“广播”不是真正的广播
还是我错过了什么?

顺便说一句
,如果打开 UAC,Visual Studio Spy++ 消息监视器似乎不起作用

0 投票
2 回答
520 浏览

c# - 使用 uiAccess=True 安装桌面 WPF 应用程序时的注意事项

背景:

我需要在另一台显示器上创建调光效果。我想我通过使用一个 WPF 窗口解决了这个问题,该窗口使用Topmostand AllowsTransparency= True 占据了整个屏幕尺寸。它具有内部黑色发光效果,并WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW应用了样式(除其他外),以​​允许用户点击进入其背后的应用程序。

我监视EVENT_OBJECT_REORDERWindows 中的事件并调用SetWindowPos强制 Topmost 状态高于其他 Topmost 窗口。到目前为止,它似乎在我的概念验证测试中运行良好。

我发现的问题是这个变暗(窗口)会覆盖任务栏,但如果我单击“开始”菜单则不会。我目前正在使用 Windows 10 进行测试。如果单击“开始”菜单,则会导致“开始”菜单和任务栏出现在变暗(窗口)上方。我希望一切都保持昏暗,永远。

我通过uiAccess在应用程序清单中设置 =true、生成自签名证书并将 exe 复制到“c:\program files*”解决了这个问题。这使我可以强制我的窗口处于最顶层状态,甚至在开始菜单上方。

我的问题:

  • 有没有办法在没有开始菜单的情况下定位一个窗口uiAccess?或者甚至是另一种在不使用窗口的情况下强制使屏幕变暗的方法(但不依赖于显示器驱动程序或硬件功能)?

  • 如果没有,在分发 WPF 应用程序(通过 WiX 设置项目或类似的东西)时,我需要记住哪些注意事项,即使用uiAccess=True 绕过 UIPI 限制?我可以在设置过程中简单地安装我的自签名证书吗?用户会遇到任何额外的障碍吗?作为开发人员,我会在构建它时遇到任何额外的障碍(除了我已经提到的)吗?

谢谢!

0 投票
1 回答
3268 浏览

c++ - 跨进程 PostMessage、UIPI 限制和 UIAccess="true"

出于安全原因,我的应用程序的 UI 模块以high 强制完整性级别运行。它里面的一切都很好,除了一件事。为了与旧版本兼容,我需要能够让用户向 UI 模块发出命令行调用。

目前这个机制是这样工作的:

  1. Windows 资源管理器中的快捷方式调用我的模块,如下所示:

    /li>
  2. 当进程解析此命令行时,它会使用FindWindow通过其唯一的类名module.exe来定位 UI 模块的运行副本(或 self 的另一个副本) 。然后它使用PostMessage API向它发送一条已注册的消息。

  3. 然后正在运行的 UI 模块(具有high完整性级别),当它收到消息时,会相应地处理它。

问题是由于UI模块的运行副本具有high完整性级别,它无法接收来自较低完整性级别的消息,或者当它被Windows资源管理器运行以解析快捷命令时,它无法接收到该模块的副本,从而使其medium完整运行等级。

为了解决这个问题,我找到了这个UIAccess标志(请参阅此处,并向下滚动到它显示“ UIAccess for UI automation applications ”的位置。)

所以我的假设是,如果我设置这个标志并对我的 UI 模块进行代码签名:

在此处输入图像描述

它将能够绕过我上面描述的 UIPI 限制。

它运行得很好:

在此处输入图像描述

但是我看到的是,当我从以完整性级别PostMessage运行的模块调用它时,我上面描述的算法中的 API 仍然失败并出现 ERROR_ACCESS_DENIED 。medium

我在那里错过了什么?

0 投票
2 回答
502 浏览

windows - 当cmd以管理员身份运行时如何将输入发送到cmd?

我创建了一个将键盘输入发送到cmd.exe. 这在cmd以普通用户身份运行时有效,但在cmd以管理员身份运行时失败。

这是我的代码:

请注意,这ConsoleWindowClass是 的类名cmd

如何将输入发送到cmdcmd管理员身份运行的时间?