在终端服务会话中访问可移动驱动器

时间:2010-02-26 19:40:05

标签: windows permissions removable-drive

我有一个托盘应用程序,它向shell注册,以便在将驱动器添加到系统或将介质插入驱动器时(通过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对日志文件的调用。它就像它甚至没有足够的东西被Process Monitor所吸引。

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

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

编辑1:再次查看此内容后,似乎所有驱动器(不仅仅是可移动驱动器)都会发生。观察到的行为是相同的:CreateFile因ERROR_ACCESS_DENIED而失败,并且Process Monitor中没有日志。

编辑2:似乎远程登录被拒绝读取访问;如果我将GENERIC_READ替换为0,则它​​会成功打开驱动器(尽管DeviceIoControl调用因ERROR_ACCESS_DENIED而失败)。我正在玩WinObj试图看看我是否可以给驱动器提供远程登录读取权限。

1 个答案:

答案 0 :(得分:0)

我相信我找到了答案。来自Microsoft white paper关于Vista中的可移动存储设备:

  

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

     

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

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

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