Я пишу приложение на C ++, работающее под управлением Windows Service (Win XP, Vista, 7, 8, серверы).
В моем приложении используется библиотека третьего патри, которая отображает локальную папку на диск, и этот диск должен быть доступен в пользовательском режиме (для всех пользователей). Проблема возникает, когда пользователь имеет сетевой ресурс, сопоставленный с локальным диском, и сторонняя библиотека не распознает указанную букву диска как уже используемую.
Вопрос в том, как определить (из приложения-службы), доступна ли требуемая буква диска?
я использую
GetLogicalDrives
QueryDosDevice
определить логические устройства. я пробовал
WNetGetConnection
WNetGetUniversalName
чтобы получить информацию о сетевом ресурсе, но эти функции не возвращают ничего для требуемой буквы диска, несмотря на то, что были общие ресурсы, сопоставленные с указанными буквами диска.
Я думаю, что проблема в привилегиях. Поскольку мое приложение запускается как служба, оно не может получить информацию об общих ресурсах, отображаемых в пользовательском режиме (что мне кажется очень странным).
Итак, последний вопрос — как определить, не используется ли указанная буква диска для сопоставления общего сетевого ресурса каким-либо пользователем?
Проблема в том, что может быть разница с общими ресурсами, которые пользователь может хранить, и общими ресурсами, которые может иметь администратор.
В реестре есть флаг, который контролирует это:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
EnableLinkedConnections = 1 (DWord)
Здесь также Статья MSDN-KB это объясняет это. С помощью EnableLinkedConnections
значение 1 должно исправить это. Обычно он установлен в 1.
Фон: Когда был изобретен UAC, это изменение было одним из побочных эффектов.