我有一个托盘应用程序,它向外壳注册以在将驱动器添加到系统或将媒体插入驱动器时接收通知(通过 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 尝试查看是否可以授予远程登录对驱动器的读取访问权限。