Доступ к съемному диску в сеансе служб терминалов - PullRequest
1 голос
/ 26 февраля 2010

У меня есть приложение в трее, которое регистрируется в оболочке для получения уведомлений, когда в систему добавляется диск или когда в него вставляется носитель (через 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, пытаясь выяснить, могу ли я дать удаленному входу в систему доступ на чтение дисков.

1 Ответ

0 голосов
/ 02 марта 2010

Мне кажется, я нашел ответ. Из Microsoft white paper о съемных устройствах хранения данных в Vista:

Диспетчер ввода-вывода и списки ACL для съемных носителей

Когда стек драйверов создает объект устройства, диспетчер ввода-вывода устанавливает ACL по умолчанию, основанный на типе устройства. ACL по умолчанию предоставляет Полный доступ к SYSTEM и Администраторам, и он предоставляет только доступ на выполнение всем остальным.

  • По умолчанию в Windows Vista диспетчер ввода-вывода предоставляет группе IU Полный доступ для объектов устройств для съемных носителей, таких как дисководы компакт-дисков, и для тех объектов дисковых устройств, которые имеют характеристики FILE_REMOVABLE_MEDIA. Примечание. В более ранних версиях Windows запись для IU отсутствовала в ACL, установленном диспетчером ввода-вывода. Диспетчер ввода-вывода Windows Vistas предоставляет полный доступ к группе IU, так что приложения могут получать прямой доступ к тому, не требуя повышения привилегий, как обсуждалось ранее. Однако устройства UFD, для которых не установлено свойство Removable, не получают от этого преимущества, поскольку диспетчер ввода-вывода не рассматривает их как съемные.
  • Драйвер класса дисков устанавливает характеристику FILE_REMOVABLE_MEDIA, если для данных идентификации, полученных с устройства в ответ на команду SCSI INQUIRY, установлено свойство Removable. Поскольку некоторые устройства UFD устанавливают это свойство, даже если они не являются действительно сменными носителями, диспетчер ввода-вывода рассматривает такие устройства как съемные диски и предоставляет группе IU доступ на чтение и запись к томуу.
  • По умолчанию диспетчер ввода-вывода Windows Vista предоставляет только доступ «Выполнить» для удаленно подключенных пользователей для объектов съемных носителей (устройств CD) и для тех объектов дисковых устройств, для которых установлены характеристики FILE_REMOVABLE_MEDIA. Из-за этого удаленные пользователи не могут записывать данные с помощью привода CD или DVD, выполнять резервное копирование на оптический носитель или форматировать съемный диск. Администраторы могут установить групповую политику доступа к съемному хранилищу, чтобы переопределить поведение по умолчанию. Когда эта политика установлена, диспетчер ввода-вывода предоставляет полный доступ удаленному пользователю для этих устройств, предоставляя возможности чтения и записи.

Итак, Vista по-разному устанавливает ACL на устройствах для интерактивного пользователя и удаленного пользователя. Я подумал, что это будет что-то вроде этого.

...