2010-02-26 132 views
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调用。

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

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

这可能最终会被我们只是不支持的场景,但我还是想知道是怎么回事。有任何想法吗?

编辑1:再次看到这一点后,它似乎发生所有驱动器(不只是可移动的)。观察到的行为是相同的:CreateFile与ERROR_ACCESS_DENIED一起失败,并且在Process Monitor中没有日志。

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

回答

0

我相信我找到了答案。从微软white paper关于Vista的移动存储设备:

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

当驱动程序堆栈创建设备对象时,I/O管理器设置一个默认的ACL是基于设备类型。默认ACL提供对SYSTEM和Administrators的完全访问权限,并且只对其他人执行访问。

  • 默认情况下,在Windows Vista中,I/O管理器授予为可移动媒体设备,如CD驱动器,并为已定义FILE_REMOVABLE_MEDIA特点这些磁盘设备对象设备对象的IU组完全访问权限。 注意:在早期版本的Windows中,IU条目未出现在由I/O管理器设置的ACL中。 Windows Vistas I/O管理器提供对IU组的完全访问权限,以便应用程序可以在不需要提升权限的情况下直接访问卷,如前所述。但是,未设置可移动属性的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的不同设备的交互式用户VS远程用户。我觉得它会是这样的。