.NET Directory.Exists отрицает существование подключенного сетевого диска при запуске от имени администратора

Я пишу небольшую .NET-программу для Windows 7. Единственное, что ей нужно сделать, это создать символические ссылки, что, кажется, требует от меня прав администратора. Он также должен уметь работать с подключенными сетевыми дисками (например, R: \, который в моей системе сопоставляется с \\titanium\Private\).

Я использую Directory.Exists(path), чтобы убедиться, что путь существует.

При запуске программы от имени обычного пользователя (учетная запись администратора, но не «как администратор») это отлично работает на подключенном сетевом диске.

При запуске программы от имени администратора (с UAC) она не может найти существующие каталоги. В результате программа отказывается признать, что R:\Steam Games\ действительно существует.

Я немного сбит с толку, почему это происходит. Использование полного пути UNC (\\titanium\Private\Steam Games\) также не работает.

Кто-нибудь сталкивался с этим раньше? Есть ли хорошее решение? Должен ли я форматировать пути по-разному (примечание: большинство из них в настоящее время отформатированы с помощью Path.Combine, поэтому они должны быть правильными).

Спасибо за вашу помощь.

(Например, Directory.Exists(@"R:\Steam Games\") возвращает false при запуске от имени администратора, но эта папка существует. Вызов функции правильно возвращает true при регулярном запуске).

Изменить: проблема действительно в том, что администратор технически является другой учетной записью пользователя. Я даже не мог использовать пути UNC, потому что я был авторизован на своем файловом сервере только под своим обычным пользователем, а не под «Администратором». В качестве обходного пути (относительно хакерского) я просто запускаю свою программу с обычными привилегиями, а затем использую Process.Start для вызова экземпляра cmd.exe с аргументами для создания символической ссылки (и глаголом «runas» для получения приглашения UAC).


person Ethan    schedule 23.07.2011    source источник
comment
Проголосовал за закрытие как не по теме. Проблема здесь в UAC (и в том, что пользователь UAC не находится в том же сеансе, что и пользователь, не являющийся пользователем UAC), и это не имеет ничего общего с программированием.   -  person Lucero    schedule 24.07.2011
comment
Я думаю, что это очень по теме, как программисту вы должны избегать проблем, которые могут возникнуть, если конечный пользователь решит улучшить вашу программу.   -  person Scott Chamberlain    schedule 24.07.2011
comment
Я согласен со Скоттом. Это обычная проблема программирования, и, на мой взгляд, это отличный сайт для ее решения.   -  person Charlie Flowers    schedule 24.07.2011


Ответы (3)


Подключенные диски в Windows привязаны к пользовательскому контексту. Диск, подключенный к учетной записи: UserA, не будет доступен пользователю UserB. Однако вы можете создать один и тот же путь unc, сопоставленный с той же буквой диска, под разными пользователями.

Однако использование полного пути unc должно работать.

Дополнительная информация на support.microsoft.com: 1, 2.

person mservidio    schedule 23.07.2011
comment
Полные пути UNC, похоже, тоже не работают. Я подозреваю, что каким-то образом мой вход в общий сетевой ресурс привязан только к моему пользователю, поэтому, если я попытаюсь получить доступ к тому же общему ресурсу, что и, скажем, администратор, он будет ожидать, что я повторно авторизуюсь. Это можно обойти? - person Ethan; 24.07.2011
comment
Независимо от того, под каким пользователем запущено приложение, ему требуется разрешение на путь unc. Если вы можете получить доступ к пути при входе в систему как этот пользователь, то приложение должно иметь возможность получить доступ к тому же пути программно через Directory.Exists ... - person mservidio; 24.07.2011
comment
Вы используете учетную запись администратора, но это учетная запись локального администратора? Есть ли у этой учетной записи администратора доступ к удаленному пути? Не могли бы вы это проверить? - person mservidio; 24.07.2011
comment
Я просто попробовал это в PowerShell, запущенном от имени администратора: `cd \\ titanium \ Private`, но это не сработало (не существует). Почему это могло быть? Как я могу это обойти? Я полагаю, я мог бы написать отдельную программу, которая создает символические ссылки, и моя программа просто запускает ее от имени администратора по требованию, но это кажется ужасно большим объемом работы для такой простой задачи. - person Ethan; 24.07.2011
comment
Я считаю, что в окнах командной строки (и сценариях bat / cmd) вы не можете напрямую ссылаться на пути unc. Вы должны использовать подключенные диски. Я вернусь к вам через несколько минут. Собираюсь загрузить свою машину с Windows и проверить. - person mservidio; 24.07.2011
comment
Вот почему я использовал PowerShell - PowerShell поддерживает UNC-пути (я использовал их раньше, но не как администратор). - person Ethan; 24.07.2011
comment
Вы определенно не можете использовать UNC-путь в командной строке. Нет никаких причин, по которым Directory.Exists не работает для вас, кроме проблемы с разрешением. Вам необходимо убедиться, что пользователь, под которым вы запускаете приложение, имеет доступ к каталогу, к которому вы пытаетесь получить доступ. Или вам нужно выдать себя за пользователя, у которого есть доступ к каталогу. - person mservidio; 24.07.2011
comment
Командная строка (cmd.exe) поддерживает путь UNC, но с ограничениями. У вас не может быть UNC-пути в качестве текущего каталога, но вы можете скопировать файл с UNC-пути на локальный диск. - person Alexey Ivanov; 24.07.2011
comment
Это похоже на проблему с разрешением. Пользователь без повышенных прав имеет доступ к сетевому диску. Тот же пользователь с активированным токеном администратора также должен иметь доступ к сетевому диску, и подключенные диски также должны быть видны. Но если вы вводите другое имя пользователя / пароль при повышении, то приведенные выше пункты неверны: другой пользователь имеет другие разрешения и ему может быть отказано в доступе к сетевому пути, и нет подключенного диска R: или он может быть привязан к другому сетевому пути. - person Alexey Ivanov; 24.07.2011

Основная причина, по которой это не работает, заключается в том, что у пользователя IIS нет разрешения на доступ к пути. При запуске от имени обычного пользователя доступ предоставляется пользователю, то есть для его работы вам необходимо предоставить разрешение на папку для IIS. Следуйте приведенным ниже инструкциям для UNC-пути для работы в службах, запускаемых iis:

Свойства -> Безопасность -> Изменить -> Добавить -> IIS_WPG

person moses mathew    schedule 23.06.2014

Это обсуждалось здесь. По-видимому, в более ранних версиях .Net Framework в документации прямо упоминается, что это невозможно («Метод Exists не выполняет сетевую аутентификацию. Если вы запросите существующий сетевой ресурс без предварительной аутентификации, метод Exists вернет false». ). Документация 4.0 больше не содержит этого предложения, но поведение не изменилось.

Я нашел обходной путь здесь (но решил не использовать).

person cdonner    schedule 16.08.2011