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



我正在使用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 规则绕过了热插拔脚本触发的类似问题,从而更改了新连接(匹配)设备的权限。我想坚持守护程序用户。我怎样才能做到这一点?

我已经打开了Apple开发人员支持票并得到了一些答案。问题不在于我的应用程序以用户"守护程序"身份运行。至少,不完全是...

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

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

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

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

IIRC Lion将必要的私人提升了一个档次......现在,您将需要沙盒权利;可能是"com.apple.security.device.usb"。

最新更新