Каталог .NET.Exists отрицает существование подключенного сетевого диска при запуске от имени администратора
Я пишу небольшую .NET-программу на Windows 7. Одна вещь, которую он должен сделать, это создать символические ссылки, которые, кажется, требуют от меня прав администратора. Он также должен быть способен работать с подключенными сетевыми дисками (например, R:, который в моей системе сопоставляется с \titaniumPrivate
).
Я использую Directory.Exists(path)
, чтобы проверить, что путь существует.
При запуске программы от имени обычного пользователя (учетная запись администратора, но не "от имени администратора"), это прекрасно работает в подключенной сети. водить.
При запуске программы от имени администратора (с помощью UAC)ей не удается найти существующие каталоги. В результате программа отказывается признать, что R:Steam Games
является каталогом, который действительно существует.
\titaniumPrivateSteam Games
) также не работает.
Кто-нибудь сталкивался с этим раньше? Есть ли какой-нибудь хороший обходной путь? Должен ли я форматировать пути по-разному (Примечание: большинство из них в настоящее время форматируются с помощью Path.Combine
, так что они должны быть правильными).
(например, Directory.Exists(@"R:Steam Games")
возвращает false при запуске от имени администратора, но эта папка существует. Вызов функции корректно возвращает true при регулярном выполнении).
Edit: проблема действительно заключается в том, что администратор технически является другой учетной записью пользователя. Я даже не мог использовать UNC-пути, потому что я был только зарегистрирован на моем файловом сервере под моим обычным пользователем, а не под "администратором". Как (относительно hackish) обходной путь, я просто запускаю свою программу с обычными привилегиями, а затем использую Process.Start
для вызова экземпляра cmd.exe с аргументами создать символическую ссылку (и глагол "рунас", чтобы получить контроль учетных записей).
3 ответа:
Сопоставленные диски в windows привязаны к пользовательскому контексту. Диск, сопоставленный с учетной записью: UserA, будет недоступен для пользователя UserB. Однако вы можете создать один и тот же unc-путь, сопоставленный с одной и той же буквой диска под разными пользователями.
Однако использование полного пути unc должно работать.
Это уже обсуждалось здесь. По-видимому, в более ранних версиях .Net Frameworkв документации явно указывалось, что это невозможно ("метод Exists не выполняет проверку подлинности сети. Если вы запросите существующий сетевой ресурс без предварительной проверки подлинности, метод Exists вернет false."). Документация 4.0 больше не содержит этого предложения, но поведение не изменилось.
Я нашел обходной путь здесь (но решил не использовать его).
Основная причина, по которой он не работает, заключается в том, что у пользователя IIS нет разрешения на доступ к пути. При запуске от имени обычного пользователя доступ предоставляется пользователю, т. е. чтобы заставить его работать, вам нужно дать разрешение на папку для IIS Выполните следующие действия для UNC path для работы в службах, запущенных iis:
Свойства -- > безопасность -- > редактировать-- > добавить --> IIS_WPG