네트워크 공유에 액세스하는 "문제"로 자주 실행되는 씩 (thick-client) 응용 프로그램에서 작업합니다. 서버와 IO를 수행하기 전에 내 응용 프로그램은 공유 (일반적으로 \\ server \ share $ 형식)가 존재하는지 여부를 테스트합니다. 이것은 클라이언트가 서버와의 연결을 잃어 버렸지 만 숨겨진 공유가 있지만 공유 내에서 읽을 수있는 권한이없는 이상한 시나리오가있는 시나리오를 탐지하는 데는 잘 작동합니다. 현재 사용자가 공유 파일을 읽을 수 있는지 여부를 테스트하는 데 필요한 C# 코드를 공유 할 수 있습니까? 공유의 ACL 또는 공유 내의 파일을 쿼리해야합니까? 공유가 비어 있다면 어떻게 될까요? 사용자가 혼합 환경 (XP Pro 워크 스테이션, Novell 네트워크에 도메인이없는 Windows 2003 서버)의 비 관리자 로컬 인 경우 어떻게해야합니까?C# app에서 사용자가 네트워크 공유에 대한 "읽기"액세스 권한을 가지고 있는지 테스트 할 수 있습니까?
답변
가장 쉬운 방법은 파일을 읽는 것입니다 (예 : 파일 읽기). 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에 대한 정보를 확인하십시오.
# 1 가장 신뢰할 수있는 방법은 당신 이 공유에서 읽을 수 권한이 사용되는 경우
- 보는 것입니다 확인하고 공유에서 읽는 동안 발생할 수
- 핸들 읽기 오류 및 당신이 결정하려는 귀하의 설명에 따라 비록 당신 이 읽기 권한이 있어야합니다 경우 시도가 실패한 불행하게도
것을 고려 몫에. 이것을 확실하게 결정할 방법이 없습니다.
얼마나 많은 ACL, 디렉토리 등이 있더라도 상관없이 여러 메커니즘을 통해 공유에 액세스 할 수 있습니다. 가장 분명한 것은 네트워크 점유율이 떨어지는 것입니다. 당신이 결정할 수있는 건 은 공유에 대한 액세스 권한이이었습니다.
나는 그것이 오류를 기다리고 읽는 것이 더 정확하다는 것을 이해하지만, 사용자에게는 꽤 짜증나지 않을 것이다. 미리 한 ACL을 읽으면 확실한 좌절을 피할 수 있습니다. 샘플 코드를 가르쳐 주시겠습니까? – flipdoubt
@flipdoubt하지만 ACL 읽기가 중단 될 가능성이 있습니다. 둘 다 공유에서 읽어야합니다. 항상 정지 될 것이라는 가정하에 FS 작업 (특히 원격)을 설계해야합니다. 일반적으로 백그라운드 스레드는 가장 친한 친구입니다. 어떤 유형의 샘플 코드를 찾으십니까? – JaredPar
답장을 보내 주셔서 다시 한번 감사드립니다. 에릭의 코드는 아마도 충분할 것이다. 그런데 "FS 작업"은 "오류 복구 작업"의 줄임말입니까? – flipdoubt
- 1. mysql 사용자가 루트 사용자와 같은 권한을 가지고 있는지 확인하려면
- 2. Powershell에서 네트워크 공유에 액세스 할 수 없습니다.
- 3. 사용자가 피라미드 (pylons 2)에서 권한을 가지고 있는지 확인하십시오.
- 4. 사파리로 네트워크 공유에 연결
- 5. 네트워크 공유에 .NET 배치
- 6. 사용자가 일부 파일에 대한 사용 권한을 가지고 있는지 테스트하는 효과적인 방법은 무엇입니까?
- 7. Asp.net 네트워크 공유에 액세스
- 8. 사용자가 JSP에서 특정 역할을 가지고 있는지 어떻게 확인할 수 있습니까?
- 9. 사용자가 Google 1+ URL을 가지고 있는지 쉽게 알 수 있습니까?
- 10. 서비스에서 네트워크 공유에 액세스
- 11. Windows 인증을 사용하여 네트워크 공유에 액세스
- 12. C define이 gnu Makefile에 선언되어 있는지 테스트 할 수 있습니까?
- 13. 네트워크 서비스가 로컬 시스템 계정에서 네트워크 공유에 액세스 할 수 없음
- 14. 네트워크 공유에 백업하는 방법은 무엇입니까?
- 15. Visual Studio에서 네트워크 공유에 파일을 만들거나 저장할 수 없음
- 16. 사용자가 Google 계정을 가지고 있는지 확인하는 방법.
- 17. 사용자가 게시물을 가지고 있는지 여부에 관계없이
- 18. Nant - 사용자가 특정 폴더에 대한 쓰기 권한이 있는지 확인하는 방법.
- 19. 참조 어셈블리는 ASP.Net의 네트워크 공유에 있습니다.
- 20. 응용 프로그램의 네트워크 공간을 어떻게 테스트 할 수 있습니까?
- 21. android : 로컬 네트워크 공유에 액세스
- 22. Android를 사용하여 네트워크 공유에 연결
- 23. PHP 네트워크 공유에 파일 공유하기
- 24. VB6에서 Function/Sub를 사용할 수 있는지 테스트 할 수 있습니까?
- 25. Windows 7에서 폴더 공유에 대한 응용 프로그램 요청 권한을 어떻게 만들 수 있습니까?
- 26. 네트워크 공유에 svn 저장소를 백업하는 스크립트
- 27. 네트워크 케이블의 플러그가 빠져 있는지 어떻게 알 수 있습니까?
- 28. Java RMI 객체가 생존하고 있는지 어떻게 테스트 할 수 있습니까?
- 29. "항목 추가"권한을 제한 할 수 있습니까?
- 30. 테스트 사용자가 Facebook 채팅을 사용할 수 있습니까?
이것은 네트워크에서 인증되지 않은 경우 false를 반환하기 때문에'if (di.Exists)'를 꺼내야한다는 것을 제외하고는 저에게 적합합니다. '.GetAccessControl()'을 시도하면,'InvalidOperationException'을 캐치 할 수 있습니다. 제 경우에는, 다음과 같이하십시오 : * Logon의 Windows 에러 코드 인'if (ioe.Message.Contains ("1326"))' 실패 : 알 수없는 사용자 이름 또는 잘못된 암호 * –
Nice!'di.Exists'는'Directory.Exists()'와는 다르며'\\ tsclient \ C'의 가용성 보장을 위해 작동합니다 –