为什么组策略阻止创建 ISensorManger 实例?

为什么组策略阻止创建 ISensorManger 实例?

我有一台 Surface Pro 3,运行的是 Windows 10 Pro,版本 1803。我用这台平板电脑做的事情之一就是试用微软提供的新 API 和编程功能。

最近,我使用传感器 API 测试了一些小玩具程序,以了解它们。我有一个小程序可以枚举设备上的所有传感器,在运行 8.1 的旧 Surface 平板电脑上工作正常。但是,当我将源代码带到 Surface Pro 上,重新编译它并运行它时,我得到了错误:

“无法在 SensorManger 上执行 CoCreateInstance() 错误:此程序被组策略阻止。有关详细信息,请联系您的系统管理员”

无论我以自己或管理员身份运行,都会出现此错误。由于这是测试代码,我从不费心做任何强大的错误处理,因此此错误不会导致程序中止,因此程序继续运行并显示 GUI,显然没有发现任何传感器。

此设备是个人独立设备,未连接到域控制器。在开发人员下,我选择了“侧载应用程序”。

我的问题是,我该如何排除故障/修复上述错误?

第二个相关的问题是,由于这是一台独立计算机,我真的需要组策略吗?如果不需要,是否有办法禁用它

谢谢

答案1

我该如何排除故障/修复上述错误?

简短回答:以管理员身份运行这两个命令(使用reg add命令):

REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors" /V "DisableSensors" /T REG_DWORD /D "0" /F 
REG ADD "HKCU\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors" /V "DisableSensors" /T REG_DWORD /D "0" /F 

解释:我使用了一些 C 语言SensorManger 接口。你可以跳过此部分。一个演示程序:

#include <Windows.h>
#include <sensorsapi.h>

void func(void)
{
    HRESULT hRes = 0;
    ISensorManager *pSensorManager = NULL;

    hRes = CoInitialize(NULL);
    hRes = CoCreateInstance(&CLSID_SensorManager,
                            NULL,
                            CLSCTX_INPROC_SERVER,
                            &IID_ISensorManager,
                            &pSensorManager);

    hRes = pSensorManager->lpVtbl->Release(pSensorManager);
    CoUninitialize();
}

我如何找到?这需要一些逆向工程理念。GUIDCLSID_SensorManager引导我找到C:\Windows\System32\SensorsApi.dll文件。我在反汇编程序中打开了它。该 DLL 文件中有一个函数SensorsGroupPolicy::IsSensorsFeatureDisabled可以检查两个 REG_DWORD 值。

  • HKLM\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors\DisableSensors首先检查是否适用于所有用户。
  • 然后HKCU\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors\DisableSensors检查哪个适用于当前登录用户。
  • 可以在本地组策略编辑器 → 计算机配置 → 管理模板 → Windows 组件 → 位置和传感器 → 关闭传感器 → 禁用中禁用该设置。但注册表方法是即时的。

相关内容