1

我有一个托盘应用程序,它向外壳注册以在将驱动器添加到系统或将媒体插入驱动器时接收通知(通过 SHChangeNotifyRegister)。收到这些通知后,我尝试打开驱动器以从中查询一些属性。对于我的测试,我使用的是一个简单的 USB 闪存驱动器。当我在物理控制台登录时,这工作正常,但如果我通过远程桌面登录,则 CreateFile 调用失败并显示 ERROR_ACCESS_DENIED。

我将 CreateFile 称为:

CreateFile(szDrive, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0 NULL);

其中 szDrive 的形式为"\\\\.\\G:". 在此之后,我进行了几次 DeviceIoControl 调用。

奇怪的是,我已经在此运行了 Process Monitor,并且在远程桌面场景中,我的托盘应用程序的驱动器上没有 CreateFile 记录。我知道我的托盘应用程序正在调用它,因为我编写了一个日志文件,并且我在 Process Monitor 日志中看到了对日志文件的 CreateFile 调用。就好像它还远远没有被进程监视器所吸引。

这台机器是 Windows 7,所有默认设置(即 UAC)。我的帐户是本地管理员。在这两种情况下(本地和远程桌面),我都以标准用户身份运行我的托盘应用程序(即没有提升)。但是,如果我提升我的托盘应用程序,那么远程桌面方案将成功打开驱动器。

这最终可能会成为我们不支持的场景,但我仍然想知道这里发生了什么。有任何想法吗?

编辑1:再次查看后,所有驱动器(不仅仅是可移动驱动器)似乎都会发生这种情况。观察到的行为是相同的: CreateFile 失败并出现 ERROR_ACCESS_DENIED 并且进程监视器中没有日志。

编辑2:似乎远程登录被拒绝读取访问;如果我将 GENERIC_READ 替换为 0,那么它会成功打开驱动器(尽管 DeviceIoControl 调用失败并出现 ERROR_ACCESS_DENIED)。我正在使用 WinObj 尝试查看是否可以授予远程登录对驱动器的读取访问权限。

4

1 回答 1

0

我相信我已经找到了答案。来自关于 Vista 中可移动存储设备的 Microsoft白皮书

I/O 管理器和可移动媒体设备 ACL

当驱动程序堆栈创建设备对象时,I/O 管理器会根据设备类型设置默认 ACL。默认的 ACL 为 SYSTEM 和管理员提供完全访问权限,并且只为其他所有人提供执行访问权限。

  • 默认情况下,在 Windows Vista 中,I/O 管理器授予 IU 组对可移动媒体设备(如 CD 驱动器)的设备对象以及已定义 FILE_REMOVABLE_MEDIA 特征的磁盘设备对象的完全访问权限。注意:在早期版本的 Windows 中,I/O 管理器设置的 ACL 中不存在 IU 条目。如前所述,Windows Vistas I/O 管理器提供对 IU 组的完全访问权限,以便应用程序无需提升权限即可直接访问卷。但是,未设置 Removable 属性的 UFD 设备不会从中受益,因为 I/O 管理器不会将它们视为可移动的。
  • 如果身份数据(从设备接收以响应 SCSI INQUIRY 命令)具有可移动属性集,则磁盘类驱动程序设置 FILE_REMOVABLE_MEDIA 特征。因为某些 UFD 设备即使它们不是真正的可移动媒体也会设置此属性,因此 I/O 管理器将此类设备视为可移动磁盘并提供 IU 组对卷的读取和写入访问权限。
  • 默认情况下,Windows Vista I/O 管理器只为远程连接的用户提供可移动媒体设备对象(CD 设备)和具有 FILE_REMOVABLE_MEDIA 特征集的磁盘设备对象的执行访问权限。因此,远程用户无法使用 CD 或 DVD 驱动器刻录数据,也无法备份到光学介质或格式化可移动磁盘。管理员可以设置可移动存储访问组策略以覆盖默认行为。设置此政策后,I/O 管理器会授予远程用户对这些设备的完全访问权限,从而允许读取和写入功能。

因此,Vista 在设备上为交互式用户和远程用户设置了不同的 ACL。我想它会是这样的。

于 2010-03-02T20:36:34.390 回答