- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在准备一个Delphi模块,它在线程中设置一个钩子(Hook)来记录宏:
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);
这在 WinXP 上工作正常,但在 Vista/Windows 7 上失败,并显示 ERROR_ACCESS_DENIED
。我在 Google ( this ) 中发现引用 ( that )。引用:
A lower privilege process cannot: … Use Journal hooks to monitor a higher privilege process.
尝试过但没有成功:
代码示例:
if LogonUser(PWideChar(sAdminUser), PWideChar(sDomain), PWideChar(sPwd),
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then
begin
if not ImpersonateLoggedOnUser(hToken) then
raise Exception.Create('Error impersonating the user');
end;
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
LogonUser
和 ImpersonateLoggedOnUser
执行时没有错误。
其他可以尝试的可能性:
您能否展示在 Visa/Windows 7 下设置 Hook 的代码或建议可行的解决方案?
最佳答案
阅读 that article 的“用户界面权限隔离”部分再次更加仔细。它指的是完整性级别,而不是用户权限。这就是为什么冒充其他用户并不能解决问题。 完整性级别是在进程首次启动时建立的,并且无法在代码中动态更改。
User Interface Privilege Isolation (UIPI) is one of the mechanisms that helps isolate processes running as a full administrator from processes running as an account lower than an administrator on the same interactive desktop. UIPI is specific to the windowing and graphics subsystem, known as USER, that supports windows and user interface controls. UIPI prevents a lower privilege application from using Windows messages to send input from one process to a higher privilege process. Sending input from one process to another allows a process to inject input into another process without the user providing keyboard or mouse actions.
Windows Vista implements UIPI by defining a set of user interface privilege levels in a hierarchical fashion. The nature of the levels is such that higher privilege levels can send window messages to applications running at lower levels. However, lower levels cannot send window messages to application windows running at higher levels.
The user interface privilege level is at the process level. When a process is initialized, the User subsystem calls into the security subsystem to determine the desktop integrity level assigned in the process’s security access token. The desktop integrity level is set by the security subsystem when the process is created and does not change. Therefore, the user interface privilege level is also set by the User subsystem when the process is created and does not change.
All applications run by a standard user have the same user interface privilege level. UIPI does not interfere or change the behavior of window messaging between applications at the same privilege level. UIPI comes into effect for a user who is a member of the administrators group and may be running applications as a standard user (sometimes referred to as a process with a filtered access token) and also processes running with a full administrator access token on the same desktop. UIPI prevents lower privilege processes from accessing higher privilege processes by blocking the behavior listed below.
- Use Journal hooks to monitor a higher privilege process.
根据this article ,您的应用需要一个指定 requestedExecutionLevel=requireAdministrator
和 uiAccess=True
的 UAC list 。 UIAccess 权限很重要:
By specifying UIAccess=”true” in the requestedPrivileges attribute, the application is stating a requirement to bypass UIPI restrictions ... A process that is launched with UIAccess rights:
- Can set journal hooks.
关于delphi - WH_JOURRNALRECORD 的 SetWindowsHookEx 在 Vista/Windows 7 下失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9165666/
我想捕获用户键盘输入以对键盘媒体键做出良好 react :播放/暂停,尤其是下一个和上一个。我尝试将 SetWindowsHookEx 与低级 WH_KEYBOARD_LL 参数一起使用,以确保我可以
我正在使用 SetWindowsHookEx 将 dll 注入(inject)另一个进程。但是,当注入(inject)程序退出时,dll 会从其他进程中卸载。无论如何我可以停止卸载吗?基本上,无论注入
我正在尝试向类中添加低级鼠标 Hook 。我可以通过将这个函数放在我的 CPP 文件中来做到这一点: LRESULT CALLBACK MouseHookProc(int nCode, WPARAM
我不太了解SetWindowsHookEx() 的文档。我知道要在第一个参数中放入什么,但对于第二个、第三个和第四个我感到困惑。 第二个参数询问 HOOKPROC 是不是就像一个普通的 windows
我想在创建窗口之前使用 SetWindowHookEx 在进程中捕获 WM_CREATE(或 HCBT_CREATEWND)消息。 使用 hMod 和 dwThreadId 可以定义 Hook 是否在
好吧,我尝试了不同的解决方案来解决我的问题,但它就是行不通。 我调用了 SetWindowsHookExA,然后当我按下一个键时,消息框没有显示。怎么办? 这是我的代码(这是一个由程序加载的另一个 D
动态链接库代码: LRESULT CALLBACK CBTNewProc(int nCode, WPARAM wParam, LPARAM lParam) { std::ofstream fi
我的键盘记录器有问题。直到今天,每个经过测试的系统都运行良好,除了 Windows 7 Embedded Standard 32 位,它显然与当前版本不符。 我需要做的是记录从键盘输入的按键,直到我得
我在 WM_MOUSE 上定义了一个全局钩子(Hook),它可以完美运行一段时间。每次鼠标移动时,它都会向特定窗口发送一条消息。 在某个随机时间后, Hook 停止发送消息。如果我注销并注册 Hook
首先:我在 Windows XP - 32 位上使用 Visual Studio 2010。 现在我正在尝试编写一个 DLL,它将使另一个应用程序能够使用低级键盘 Hook 。 即使我让它工作了 -
我正在尝试升级旧应用程序以在 Windows 7 上运行,但我在使用 Journal Hooks 的“宏录制”功能时遇到问题。我已遵循在 Windows 7 上执行此操作所需的所有步骤,即设置 uiA
我正在Delphi中编写笑话程序(当用户使用鼠标或键盘时发出奇怪的声音),它使用全局钩子(Hook)来捕获鼠标和键盘事件。 这是负责处理这个钩子(Hook)的函数: procedure MKHOOK(
我正在使用以下代码获取当前进程的鼠标消息。 using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule
HHOOK WINAPI SetWindowsHookEx( __in int idHook, __in HOOKPROC lpfn, __in HINSTANCE hMod, __in
我正在尝试修改一款旧游戏,更具体地说,我想通过 Xbox Controller 输入来模拟键盘输入。我已经让游戏 handle 输入正常工作,但游戏忽略了我用 PostMessage 创建的假输入(我
您好,在此先感谢所有愿意提供帮助的人。我正在尝试设置一个 CBT windows Hook ,当我在全局设置它时效果很好,但每当我尝试将它附加到单个线程时都会失败。据我所知,我按照这本书做每件事:-
我在 C# 中创建了简单的控制台,它使用 SetWindowsHookEx 和 LowLevelKeyboardProc 来捕获键盘事件并将它们记录在 Windows 上。 这很有效,但是我知道我想创
我有这段代码,它为低级事件设置键盘钩子(Hook),然后显示一个消息框。 HHOOK keyboardHook = SetWindowsHookEx (WH_KEYBOARD_LL, HookKey,
我有一个带有嵌入式 v8 引擎的小型控制台应用程序,我想添加一个 Hook 来注册按键事件。这一切在我使用 Qt 和 QtScript 之前都有效,但我将它全部移植到 VC++ 2008 中的直接 C
我正在创建一个控制台应用程序,我想在其中记录按键操作(例如向上箭头)。我创建了一个低级键盘 Hook ,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用。当我按下一个键时,程序会暂停一点
我是一名优秀的程序员,十分优秀!