大家。我正在为在Windows 7和8上运行的驱动程序(WinPcap' NDIS 6过滤器驱动程序)添加访问控制。我们只想让管理员(管理员组中的用户)使用该驱动程序。所以我使用了新的 IoCreateDeviceSecure 函数,而不是原来的 IoCreateDevice 调用。
我的代码如下:
UNICODE_STRING sddl = RTL_CONSTANT_STRING(L"D:P(A;;GA;;;SY)(A;;GA;;;BA)");
const GUID guidClassNPF = { 0x26e0d1e0L, 0x8189, 0x12e0, { 0x99, 0x14, 0x08, 0x00, 0x22, 0x30, 0x19, 0x04 } };
status = IoCreateDeviceSecure(adriverObjectP, sizeof(DEVICE_EXTENSION), &deviceName, FILE_DEVICE_TRANSPORT,
FILE_DEVICE_SECURE_OPEN, FALSE, &sddl, (LPCGUID) &guidClassNPF, &devObjP);
我的SDDL字符串是" D:P(A ;; GA ;;; SY)(A ;; GA ;;; BA)" 表示&#34 ; 允许内核,系统和管理员完全控制设备。没有其他用户可以访问该设备。"在https://msdn.microsoft.com/en-us/library/windows/hardware/ff563667(v=vs.85).aspx。但SDDL字符串中的 GA 表示" 计算机上的内置管理员组 "通过引用同一网页。因此,我不知道这是否是微软的错误,因为管理员用户与管理员组之间仍存在差异。
我的测试平台是Windows 8.1 x64。我创建了一个名为 test 的用户,将其添加到管理员组。我使用 runas 命令运行一个程序,以用户测试的方式调用驱动程序,如下所示:
失败:
runas /savecred /user:test "C:\Program Files (x86)\Nmap\nmap.exe -v -A 192.168.0.1"
命令无法打开驱动程序设备,我尝试将命令作为内置管理员用户,并且驱动程序设备打开成功。如下:
成功:
runas /savecred /user:administrator "C:\Program Files (x86)\Nmap\nmap.exe -v -A 192.168.0.1"
此测试确认" D:P(A ;; GA ;;; SY)(A ;; GA ;;; BA)" 仅允许访问确切的管理员用户,而非管理员组。
我希望有人可以指出它是否是Windows中的错误,以及如何允许管理员组使用我的驱动程序?感谢。
这似乎是UAC的问题。
此外,一般来说,我认为我们的应用场景并没有实际使用"管理员"特权。我们只想打开Administrators组作为标准组的访问权限,而不是要求管理员'特权。我认为必须有一些更优雅的方法来解决这个UAC问题。
并且,我想" BA"在SDDL中应该表示Administrators组中的所有帐户,与Administrators组中的帐户是否具有" full"访问令牌。作为目前的情况(默认政策),如果" BA"仅表示内置管理员帐户,我们只能提供管理员帐户的SID,而不是使用" BA"。所以预定义的“BA"字符串没用。