0

単純な Windows ネットワーク共有 (SMB プロトコル) への次の UNC パスを検討してください。

  • \\host\share

System.Uriまたはのインスタンスを簡単に作成するには、System.IO.DirectoryInfoそのパスを文字列としてコンストラクターに渡します。

ここで、すべてのセキュリティの問題を脇に置いて、次の 2 つのパスを検討してください。

  • \\username@host\share
  • \\username:password@host\share

これらのパスを Uri または DirectoryInfo コンストラクターに単純に渡すことはできません。これらのパスは、主に Linux システムで使用されます。さらに、仮にそうしたとしても、ログオン資格情報を保存しない可能性が高いです。

最終的には、これらをSystem.Uri実際のパスを表す のインスタンスとSystem.Net.NetworkCredential、ログオン情報を格納する のインスタンスに変換する方法が必要です。

では、どうすればこの問題に取り組むことができるでしょうか。どこから始めればよいかさえわかりません。から継承System.UriParserすることは、開始するのに適しているようですが、MSDN によると、推奨されていません。

Microsoft は、.NET Framework に同梱されているパーサーを使用することを強くお勧めします。独自のパーサーを構築すると、アプリケーションの複雑さが増し、出荷されたパーサーほどのパフォーマンスは得られません。

ありがとう。

編集

簡単な解決策 (以下に掲載) は、「@」記号の前のすべてがログオン資格情報の一部であり、その後のすべてが実際のパスであると想定することです。ただし、ファイル名に「@」記号が含まれている場合、これは問題になる可能性があります。

\\credential@host\path: 問題なし

\\credential@host\path@mystorage: 最初の @ より前のすべてがログオンの一部であるため、これも問題ありません。

\\host\path@mystorage:今、私たちは逮捕されました。これは、引数として渡されると、間違いなく引数例外をスローします。

4

1 に答える 1

1

これらの 2 つのスキームだけを処理する必要がある場合、パーサーを拡張するのはやり過ぎのように思えます。とにかく、独自のユーティリティ クラスを作成する方が簡単です。

あなたが示した2つの例のように本当に単純な場合は、力ずくで実行します. ("@" の存在と場所に基づいて) パスをそれぞれのコンポーネントに分割できる単純なクラスを作成し、Uri と NetworkCredential を別々に作成します。文字列に「@」が含まれていない場合、NetworkCredential は null になる可能性があります。

これよりも複雑な場合、私はベースから外れている可能性がありますが、これは、単純な解決策でおそらくうまくいく場合の1つのように聞こえます.

私の性急なコードを許してください。それは完全に耐障害性があるわけではありませんが、要点を説明する必要があります。

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
于 2012-05-30T20:37:53.817 に答える