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

네트워크에있는 텍스트 경로 '루트'에 액세스 할 때 위의 오류가 발생합니다. 사용자가 Windows 7에 처음 로그인 할 때만 발생합니다 (다른 OS에서는 테스트되지 않음). 사용자가 Windows 탐색기를 사용하여 지정된 경로를 탐색하면 di가 디렉토리를 검색 할 수 있습니다.var di = 처음 Windows 탐색기를 사용하여 경로를 처음 열 때까지 새로운 DirectoryInfo (path)가 예외를 throw합니다.

나는 캐치를 수행하고 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 

당신의 지원을위한 미리 감사합니다, 존

+0

"충돌"할 때 실제로 발생하는 예외를 공유 할 수 있습니까? – Scottie

+0

{System.IO.IOException : 네트워크 이름을 찾을 수 없습니다. System.IO.FileSystemEnumerableIterator'1..ctor에서 System.IO .__ Error.WinIOError (INT32의 errorCode, 문자열 maybeFullPath) System.IO.FileSystemEnumerableIterator'1.CommonInit() 에서 (문자열 경로, 문자열 originalUserPath, 문자열의 searchPattern에서 System.IO.DirectoryInfo.InternalGetDirectories (String searchPattern, SearchOption searchOption), Controls.ValidationControl.LoadDBox (Object sender, RoutedEventArgs e)에서 c : \ Controls \ ValidationControl.xaml의 SearchOption searchOption, SearchOption searchOption, SearchResultHandler를 호출합니다.cs : line 1010 – Cyphryx

+0

참고 : private const string Root = @ "\\ networkPath"; – Cyphryx

답변

2

Microsoft 보안은 응용 프로그램에서 캡처 한 자격 증명을 사용하여 UNC를 통해 SharePoint에 액세스하지 못하게합니다. 따라서, 위의 모든 솔루션 및 3 개 다른 네트워크 액세스 클래스를 시도한 후, 아무도 경로를 볼 날이 로그인 할 수 있으므로 단순히

Process.Start(dir); 

을 사용하고 무슨 일이 일어나고 있는지에 관해서는 사용자에게 메시지를 표시합니다. 사용자의 자격 증명을 사용하여 Windows 탐색기를 시작하고 Windows가 사용자의 도메인 계정을 사용하여 SharePoint에 로그인하는 경로로 이동합니다. Windows에서 할 수 있습니다. Microsoft에서 작동하지 않는 프로그래머는 그렇게 할 수 없습니다.

1

당신이 네트워크 폴더에 무슨 일이 일어나고 말했다 때문에, 나의 첫번째 성향은 윈도우 프로세스가이 응용 프로그램을 실행하는 것입니다 아래에 디렉토리 정보를 읽는 보안 액세스 권한이 없습니다. 사용자가이 폴더를 탐색하면 보안이 인증되므로 앱에서 읽을 수 있습니다.

루트가 로컬 폴더 인 경우 앱이 작동합니까?

+0

정확합니다. Windows 인증은 사용자가 Explorer를 사용하여 네트워크 경로를 탐색 할 때까지 부여되지 않는 리소스에 액세스해야합니다. Windows에서 C#을 사용하여 코드에서 수동으로 사용 권한을 요청하려면 어떻게해야합니까? – Cyphryx

+0

그리고 예, 로컬 폴더는 정상적으로 작동합니다. – Cyphryx

1

대부분의 경우 사용자가 네트워크 경로에 액세스하려면 로그인해야합니다. 이 경로는 Explorer을 통해 액세스해야만 발생합니다. 네트워크 폴더를 로컬 컴퓨터의 드라이브로 매핑하고 자동으로 로그인하도록 설정하십시오. 이것은 도움이 될 것입니다.

EDIT : Scottie에 의해 다른 답변에서 가리키는대로 프로그램이 실행되는 자격 증명도 공유 폴더에 대한 액세스가 필요할 수 있습니다. 당신은 자격 증명 [Ref]을 통과 P/Invoke을 사용할 수 있습니다 - : 2

편집 #. 또는 here과 같이 가장을 수행하는 방법은 LogonUser입니다. 가장 및 LogonUser에 대한 자세한 내용은 this question and its answers에서 확인할 수 있습니다.

+0

C#에서는 기존 사용자의 로그인을 사용하여 네트워크 경로에 액세스하려면 어떻게해야합니까? var user = WindowsIdentity.GetCurrent(); ..... – Cyphryx

+0

나는 위의 두 가지를 시도했지만 둘 다 나에게 접근 권한을 부여하지 않았다. 그래도 도움을 주셔서 감사합니다. – Cyphryx