守护程序用户如何在调用IOHIDDeviceOpen时访问HID设备而不获取kIOReturnNotPrivileged

时间:2012-11-29 15:35:05

标签: macos hid hidapi

我正在使用hidapi来访问HID设备(不是鼠标或键盘)。最支持的操作系统版本是10.6,我目前正在使用Mac OX X 10.6.8。如果我的Mac OS X可执行文件以正常用户权限运行,它可以枚举设备,识别供应商使用的设备和产品ID,并打开它:

IOHIDDeviceRef os_dev = ...
IOReturn ret = IOHIDDeviceOpen(os_dev, kIOHIDOptionsTypeNone);
if (ret == kIOReturnSuccess) { ... } // here I get kIOReturnNotPrivileged for daemon

实际上,可执行文件应该作为守护程序运行,但IOHIDDeviceOpen失败并显示kIOReturnNotPrivileged。对于Linux,我通过udev规则解决了热插拔脚本引发的类似问题,从而更改了新连接(匹配)设备的权限。 我想坚持守护进程用户。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

我已经开通了Apple开发者支持服务单并获得了一些答案。问题不在于,我的应用程序是作为用户'守护进程'运行的。至少,不完全是......

应用程序必须作为经过身份验证的(已登录的交互式)用户运行 - 或“root”。所以,如果我可以作为'守护进程'登录它可能会运行。实际上,这没有用。 我需要一个(launchd)守护进程,因为我的应用程序的功能是一种可通过网络访问的服务器。因此,我必须以“root”用户身份运行应用程序 - 无论如何,这是lauchd守护进程的危险默认值。

答案 1 :(得分:1)

如果您的应用没有沙盒,则不需要任何权利,因此听起来这不是您的问题。而且应用程序是否是守护进程也无关紧要。

相关的是操作系统是否将您的设备视为键盘。为了降低键盘记录程序滥用的风险,OS X要求任何想要直接与键盘对话的应用程序必须以root用户身份运行。不幸的是,许多非键盘HID设备将其自身呈现为键盘(例如,无线演示器遥控器)。这可能是你所看到的。

您可以通过以root身份运行来修复此问题,或者,如果您可以通过将其使用页面值更改为7以外的其他内容(键盘)来控制硬件本身,则可以解决此问题。

答案 2 :(得分:0)

IIRC狮子队将必要的私人空间提升了一个档次......现在你需要一个sandboxing entitlement;可能是“com.apple.security.device.usb”。