var di = new DirectoryInfo(путь) выдает исключение, пока я не использую Windows Explorer, чтобы открыть путь в первый раз

var di = new DirectoryInfo(Root);
var diList = di.GetDirectories();

Выше описывается сбой при доступе к текстовому пути "Root", расположенному в сети. У меня возникает только когда пользователь впервые заходит в Windows 7 (не тестировался на других ОС). Если пользователь использует Windows Explorer для перехода по указанному пути, он может извлечь каталоги.

Я знаю, что делать уловки и предлагать пользователю щелкнуть ссылку, которая открывает проводник Windows и перейти к пути, можно, но я не один для обходных путей. Я хочу, чтобы моя программа могла устанавливать соединение с сетевым путем, не требуя, чтобы проводник Windows сделал это первым.

Исключение:

System.IO.IOException: The network name cannot be found.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileSystemEnumerableIterator`1.CommonInit()
at System.IO.FileSystemEnumerableIterator`1..ctor(String path,string originalUserPath,
  String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler,
  Boolean checkHost)
at System.IO.DirectoryInfo.InternalGetDirectories(String searchPattern,
 SearchOption searchOption) at Controls.ValidationControl.LoadDBox(Object sender,
 RoutedEventArgs e)
in c:\Controls\ValidationControl.xaml.cs:line 1010

Заранее спасибо за поддержку, Джон

3 ответа

Решение

Безопасность Microsoft не позволит вам получить доступ к SharePoint через UNC с использованием учетных данных, зафиксированных приложением. Поэтому, после попытки всех вышеупомянутых решений и 3 других классов доступа к сети, никто не будет видеть путь и позволит мне войти, поэтому я просто использовал

Process.Start(dir);

и подскажите пользователю, что происходит. Проводник Windows запускается с использованием учетных данных пользователя и указывает путь, по которому Windows затем использует учетную запись домена пользователя для входа в SharePoint. Windows может сделать это. Программисты, которые не работают на Microsoft, не могут.

Поскольку вы сказали, что это происходит в сетевых папках, я склоняюсь к тому, что процесс Windows, под которым выполняется это приложение, не имеет безопасного доступа для чтения информации каталога. Когда пользователь просматривает эту папку, безопасность аутентифицируется, и теперь ваше приложение может читать ее.

Работает ли приложение, если Root является локальной папкой?

Наиболее вероятная причина - пользователь должен войти в систему, чтобы получить доступ к сетевому пути. Это, кажется, не происходит, пока путь не доступен через Explorer, Попробуйте сопоставить сетевую папку как диск на локальном компьютере и настроить ее на автоматический вход в систему. Это может помочь

РЕДАКТИРОВАТЬ:- Как указал Скотти в другом ответе, учетные данные, под которыми запускается программа, также могут нуждаться в доступе к общей папке.

РЕДАКТИРОВАТЬ № 2:- Вы можете использовать P/Invoke передать полномочия [Ref]. Или вы можете позвонить LogonUser способ сделать олицетворение, как описано здесь. Дальнейшие детали относительно олицетворения и LogonUser можно найти в этом вопросе и его ответах.

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