Как получить доступ к подключенному сетевому диску с помощью System.IO.DirectoryInfo?

Мне нужно создать каталог на подключенном сетевом диске. Я использую код:

DirectoryInfo targetDirectory = new DirectoryInfo(path);
if (targetDirectory != null)
{
    targetDirectory.Create();
}

Если я укажу путь типа "\\\\ServerName\\Directory", все пойдет нормально. Если я сопоставлю "\\ServerName\Directory" как, скажем, диск Z: и укажу путь, например, "Z:\\", произойдет сбой.

После создания объекта targetDirectory VS показывает (в режиме отладки), что targetDirectory.Exists = false, и при попытке выполнить targetDirectory.Create() выдает исключение:

System.IO.DirectoryNotFoundException: "Could not find a part of the path 'Z:\'."

Однако тот же код хорошо работает с локальными каталогами, например, C:.

Приложение представляет собой службу Windows (WinXP Pro, SP2, .NET 2), работающую под той же учетной записью, что и пользователь, подключивший диск. Qwinsta отвечает, что сеанс пользователя - это сеанс 0, поэтому он совпадает с сеансом службы.

7 ответов

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

Исходя из того, что сопоставленные буквы дисков не работают, простое решение - ввести полный сетевой путь.

Ака,

мой R:/ диск был сопоставлен с \\myserver\files\myapp\

Так что вместо использования

"R:/" + "photos"

использование

"\\myserver\files\myapp\" + "photos"

Учетная запись, под которой работает ваше приложение, вероятно, не имеет доступа к подключенному диску. Если это веб-приложение, это определенно будет проблемой... По умолчанию веб-приложение запускается под учетной записью NETWORK SERVICE, для которой не настроены подключенные диски. Попробуйте использовать олицетворение, чтобы увидеть, решит ли это проблему. Хотя вам, вероятно, нужно придумать лучшее решение, чем просто использовать олицетворение. Если бы это был я, я бы придерживался пути UNC.

Вы сопоставляете с теми же учетными данными, что и программа?

Вы работаете на Vista/Server 2k8? Обе эти сервисы изолируют в сеансе 0, а первый интерактивный сеанс - сеанс 1. Здесь больше информации об изоляции сеанса. Таким образом, даже если для службы и для интерактивного входа в систему используется один и тот же пользователь, это будут разные сеансы.

Вы можете попытаться использовать WNetConnection, чтобы преобразовать подключенный диск в сетевой путь.

У меня была такая же проблема на Win Server 2012. Отключение UAC решило ее.

Другие вопросы по тегам