У меня есть приложение в трее, которое регистрируется в оболочке для получения уведомлений, когда в систему добавляется диск или когда в него вставляется носитель (через SHChangeNotifyRegister). После получения этих уведомлений я пытаюсь открыть диск, чтобы запросить у него некоторые свойства. Для тестирования я использую простую флешку. Это работает нормально, когда я вошел в систему на физической консоли, но если я вошел в систему через удаленный рабочий стол, то вызов 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 на диске из моего приложения в трее. Я знаю, что мое приложение в трее вызывает его, потому что я записываю файл журнала и вижу вызовы CreateFile для файла журнала в журнале Process Monitor. Как будто он даже не заходит достаточно далеко, чтобы подключиться к Process Monitor.
Аппарат - Windows 7 со всеми настройками по умолчанию (т.е. UAC). Моя учетная запись является локальным администратором. В обоих сценариях (локальный и удаленный рабочий стол) я запускаю приложение в трее как обычный пользователь (то есть без повышения прав). Однако, если я поднимаю свое приложение в трее, сценарий удаленного рабочего стола успешно открывает диск.
Это может в конечном итоге стать сценарием, который мы просто не будем поддерживать, но я все равно хотел бы знать, что здесь происходит. Есть идеи?
РЕДАКТИРОВАТЬ 1: После повторного просмотра, похоже, это происходит для ВСЕХ дисков (не только съемных). Наблюдаемое поведение такое же: ошибка CreateFile с ошибкой ERROR_ACCESS_DENIED и отсутствием журналов в Process Monitor.
РЕДАКТИРОВАТЬ 2: Кажется, удаленному входу в систему отказано в доступе для чтения; если я заменил GENERIC_READ на 0, то он успешно откроет диск (хотя вызовы DeviceIoControl завершаются с ошибкой ERROR_ACCESS_DENIED). Я играю с WinObj, пытаясь выяснить, могу ли я дать удаленному входу в систему доступ на чтение дисков.