2013-07-11 3 views
2
var di = new DirectoryInfo(Root); 
var diList = di.GetDirectories(); 

Вышеупомянутый сбой при доступе к текстовому пути «Root», который находится в сети. Я нахожусь только тогда, когда пользователь сначала входит в Windows 7 (не тестируется на других ОС). Если пользователь использует проводник Windows для перехода к указанному пути, то di может получить каталоги.var di = new DirectoryInfo (путь) генерирует исключение, пока я не использую проводник Windows, чтобы открыть путь в первый раз

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

Исключение:

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 

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

+0

Можете ли вы поделиться фактическим исключением, которое происходит, когда оно «сработает»? – Scottie

+0

{System.IO.IOException: имя сети не найдено. на System.IO .__ Error.WinIOError (Int32 ERRORCODE, String maybeFullPath) в System.IO.FileSystemEnumerableIterator'1.CommonInit() на System.IO.FileSystemEnumerableIterator'1..ctor (пути String, String originalUserPath, струнного searchPattern , SearchOption searchOption, SearchResultHandler'1 resultHandler, Boolean checkHost) в System.IO.DirectoryInfo.InternalGetDirectories (String searchPattern, SearchOption searchOption) в Controls.ValidationControl.LoadDBox (отправитель объекта, RoutedEventArgs e) в c: \ Controls \ ValidationControl.xaml.cs: строка 1010 – Cyphryx

+0

Примечание: private const string Root = @ "\\ networkPath"; – Cyphryx

ответ

2

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

Process.Start(dir); 

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

1

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

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

+0

Вы правы. Аутентификация Windows требуется для доступа к ресурсу, который не предоставляется до тех пор, пока пользователь не будет использовать Проводник для перехода к сетевому пути. Как мне вызвать Windows для доступа к разрешениям вручную из моего кода с помощью C#? – Cyphryx

+0

И да, локальные папки работают нормально. – Cyphryx

1

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

EDIT: - Как указано Scottie, в другом ответе на учетные данные, под которыми запускается программа, также может потребоваться доступ к общей папке.

EDIT # 2: - Вы можете использовать P/Invoke для передачи данных [Ref]. Или вы можете вызвать метод LogonUser для выполнения олицетворения, как описано here. Более подробную информацию о олицетворении и LogonUser можно найти в this question and its answers.

+0

Итак, в C#, как мне позвонить, чтобы получить доступ к сетевому пути, используя существующий логин пользователя? var user = WindowsIdentity.GetCurrent(); ..... – Cyphryx

+0

Я пробовал оба выше, и ни один из них не предоставил бы мне доступ. Благодарю за помощь. – Cyphryx