2009-04-15 4 views
3

네트워크 공유에 액세스하는 "문제"로 자주 실행되는 씩 (thick-client) 응용 프로그램에서 작업합니다. 서버와 IO를 수행하기 전에 내 응용 프로그램은 공유 (일반적으로 \\ server \ share $ 형식)가 존재하는지 여부를 테스트합니다. 이것은 클라이언트가 서버와의 연결을 잃어 버렸지 만 숨겨진 공유가 있지만 공유 내에서 읽을 수있는 권한이없는 이상한 시나리오가있는 시나리오를 탐지하는 데는 잘 작동합니다. 현재 사용자가 공유 파일을 읽을 수 있는지 여부를 테스트하는 데 필요한 C# 코드를 공유 할 수 있습니까? 공유의 ACL 또는 공유 내의 파일을 쿼리해야합니까? 공유가 비어 있다면 어떻게 될까요? 사용자가 혼합 환경 (XP Pro 워크 스테이션, Novell 네트워크에 도메인이없는 Windows 2003 서버)의 비 관리자 로컬 인 경우 어떻게해야합니까?C# app에서 사용자가 네트워크 공유에 대한 "읽기"액세스 권한을 가지고 있는지 테스트 할 수 있습니까?

답변

8

가장 쉬운 방법은 파일을 읽는 것입니다 (예 : 파일 읽기). Jared가 언급했듯이 앞으로 읽을 수있는 방법은 없습니다 (네트워크 오류, 사용 권한 변경 등).

 string remotePath = @"\\server\share$"; 
     bool haveAccess = false; 

     DirectoryInfo di = new DirectoryInfo(remotePath); 
     if (di.Exists) 
     { 
      try 
      { 
       // you could also call GetDirectories or GetFiles 
       // to test them individually 
       // this will throw an exception if you don't have 
       // rights to the directory, though 
       var acl = di.GetAccessControl(); 
       haveAccess = true; 
      } 
      catch (UnauthorizedAccessException uae) 
      { 
       if (uae.Message.Contains("read-only")) 
       { 
        // seems like it is just read-only 
        haveAccess = true; 
       } 
       // no access, sorry 
       // do something else... 
      } 
     } 

등 위의 코드에서 많은 단점이 (가있는 하드 코딩 "읽기 전용"

지금까지 코드가 간다, 당신은 대답에 약간의 시도에 대한 DirectoryInfo 클래스를 사용할 수 있습니다 테스트),하지만 그것은 당신이 할 수있는 것을 설명하기 위해 사용 된 예일뿐입니다. DirectoryInfo에는 폴더의 파일을 나열하는 데 사용할 수있는 몇 가지 다른 도우미 메서드가 있습니다. 액세스 권한이없는 경우 액세스가 실패한 이유를 테스트하는 데 사용할 수있는 UnauthorizedAccessException 예외가 발생합니다. throw되는 예외에 대한 자세한 내용은 GetAccessControl에 대한 정보를 확인하십시오.

+4

이것은 네트워크에서 인증되지 않은 경우 false를 반환하기 때문에'if (di.Exists)'를 꺼내야한다는 것을 제외하고는 저에게 적합합니다. '.GetAccessControl()'을 시도하면,'InvalidOperationException'을 캐치 할 수 있습니다. 제 경우에는, 다음과 같이하십시오 : * Logon의 Windows 에러 코드 인'if (ioe.Message.Contains ("1326"))' 실패 : 알 수없는 사용자 이름 또는 잘못된 암호 * –

+0

Nice!'di.Exists'는'Directory.Exists()'와는 다르며'\\ tsclient \ C'의 가용성 보장을 위해 작동합니다 –

3

# 1 가장 신뢰할 수있는 방법은 당신 이 공유에서 읽을 수 권한이 사용되는 경우

  1. 보는 것입니다 확인하고 공유에서 읽는 동안 발생할 수
  2. 핸들 읽기 오류 및 당신이 결정하려는 귀하의 설명에 따라 비록 당신 읽기 권한이 있어야합니다 경우 시도가 실패한 불행하게도

것을 고려 몫에. 이것을 확실하게 결정할 방법이 없습니다.

얼마나 많은 ACL, 디렉토리 등이 있더라도 상관없이 여러 메커니즘을 통해 공유에 액세스 할 수 있습니다. 가장 분명한 것은 네트워크 점유율이 떨어지는 것입니다. 당신이 결정할 수있는 건 은 공유에 대한 액세스 권한이이었습니다.

+0

나는 그것이 오류를 기다리고 읽는 것이 더 정확하다는 것을 이해하지만, 사용자에게는 꽤 짜증나지 않을 것이다. 미리 한 ACL을 읽으면 확실한 좌절을 피할 수 있습니다. 샘플 코드를 가르쳐 주시겠습니까? – flipdoubt

+0

@flipdoubt하지만 ACL 읽기가 중단 될 가능성이 있습니다. 둘 다 공유에서 읽어야합니다. 항상 정지 될 것이라는 가정하에 FS 작업 (특히 원격)을 설계해야합니다. 일반적으로 백그라운드 스레드는 가장 친한 친구입니다. 어떤 유형의 샘플 코드를 찾으십니까? – JaredPar

+0

답장을 보내 주셔서 다시 한번 감사드립니다. 에릭의 코드는 아마도 충분할 것이다. 그런데 "FS 작업"은 "오류 복구 작업"의 줄임말입니까? – flipdoubt

관련 문제