我有一台 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 组件 → 位置和传感器 → 关闭传感器 → 禁用中禁用该设置。但注册表方法是即时的。