2012-05-28 6 views
0

고려 간단한 윈도우 네트워크 공유에 다음 UNC 경로 (SMB 프로토콜) : 쉽게의 인스턴스를 만들 수 있습니다는 기본 클래스 라이브러리 유형에 자격 증명을 사용하여 네트워크 경로를 구문 분석

  • \\host\share

System.Uri 또는 System.IO.DirectoryInfo에 해당 경로를 문자열로 전달하여 생성자에 전달합니다.

지금 옆으로 모든 보안 문제를 떠나, 다음과 같은 두 가지 경로를 고려하십시오

당신은 단순히 열린 우리당이나의 DirectoryInfo 생성자에 다음을 전달할 수 없습니다 그들은 돈 때문에 리눅스 시스템에서 주로 사용되는 이러한 경로를 처리하는 방법을 알지 못합니다. 게다가, 그들이 수행 한 경우에도 로그온 자격 증명을 유지하지 못할 가능성이 큽니다.

궁극적으로 나는 이것을 실제 경로를 나타내는 System.Uri의 인스턴스와 로그온 정보를 저장하는 System.Net.NetworkCredential의 인스턴스로 변환하는 방법을 원합니다.

그래서이 문제를 어떻게 해결할 수 있습니까? 나는 어디서부터 시작해야할지 모른다. System.UriParser에서 상속하는 것이 좋은 출발점이지만 MSDN에 따르면 권장하지 않습니다.

.NET Framework와 함께 제공되는 파서를 사용하는 것이 좋습니다. 자신의 파서를 작성하면 응용 프로그램의 복잡성이 증가하고 파서와 같이 잘 수행되지 않습니다.

감사합니다.

편집

(아래 게시 된) 간단한 솔루션은 실제 경로입니다 후 '@'기호가 로그온 자격 증명의 일부가 다되기 전에 그냥 모든 것을 가정하는 것입니다. 그러나 파일 이름에 '@'기호가 포함 된 경우 문제가 될 수 있습니다.

\\[email protected]\path : 아무 문제

\\[email protected]\[email protected] : 첫 번째 @ 전에 모든 로그온의 일부이기 때문에 다시 아무 문제.

\\host\[email protected] : 이제 우리가 체포되었습니다. 이것은 인수로 전달 될 때 반드시 인수 예외를 발생시킵니다.

+0

Erm은 UNC 경로가 아닙니다. UNC 경로는 사용자 이름과 암호 정보를 포함하지 않습니다. 따라서 자격 증명이있는 UNC 경로는 없습니다. – Joey

+0

아, 죄송합니다. 나는 네가 맞다고 생각하지만, 다른 말로 생각할 수는 없다. –

답변

1

이 두 가지 스키마 만 처리하면 파서를 확장하는 것이 과도한 것처럼 보입니다. 어쨌든 자신의 유틸리티 클래스를 만드는 것이 더 쉬울 것입니다.

만약 당신이 준 두 예제처럼 간단하다면, 나는 그것을 무차별 적으로 적용 할 것이다. "@"의 존재 및 위치에 따라 경로를 해당 구성 요소로 분리하고 Uri 및 NetworkCredential을 별도로 만들 수있는 간단한 클래스를 만듭니다. 문자열에 "@"이 포함되어 있지 않으면 NetworkCredential은 null 일 수 있습니다.

이보다 더 복잡하면 기본이 아닐 수도 있지만 단순한 해결책이 아마 잘 될 때가 있습니다.

용의주도, 내 견해가 딱딱한 것은 아니지만 중요한 부분을 말해야합니다.

Public Class CredentialedPath 

    Public Property Uri As Uri 
    Public Property Credential As NetworkCredential 

    Public Shared Function GetFromString(ByVal path As String) As CredentialedPath 

     Dim CP As CredentialedPath = New CredentialedPath() 

     Dim pathParts() As String = path.Split("@"c) 

     If pathParts.Length > 1 Then 

      CP.Uri = New System.Uri("\\" & pathParts(1)) 

      Dim credParts() As String = pathParts(0).TrimStart("\"c).Split(":"c) 
      CP.Credential = New NetworkCredential() 
      CP.Credential.UserName = credParts(0) 
      If (credParts.Length > 1) Then 
       CP.Credential.Password = credParts(1) 
      End If 

     Else 
      CP.Uri = New System.Uri(path) 
     End If 

     Return CP 

    End Function 

End Class 
+0

실용적인 코드 솔루션에 대해서는 +1이지만 이름에 '@'기호가있는 파일이나 디렉토리를 어떻게 예측합니까? 이것은 실제로이 질문을 게시하는 주요 관심사이자 이유입니다. 저는 실제 경로와는 다른 자격 증명을 말하는 방법에 관해서는 단서가 없습니다. –

+0

사실 이것이 정규 표현식이 만들어진 이유의 좋은 예라고 생각합니다 ... 조사 할 시간입니다! –

+0

첫 번째 @가 슬래시로 어떻게 배열되었는지 자세히 설명해야합니다. 나는 이것을 정규 표현식 (주로 연습을하기 위해)으로 대답하려고 노력했지만, 산만 해졌다. 그 (것)들을 잘 아는 누군가는 그것을 상당히 쉽게 발견 할지도 모르다. – Rich