0

考虑以下简单 Windows 网络共享(SMB 协议)的 UNC 路径:

  • \\host\share

您可以轻松地创建一个实例,System.Uri或者System.IO.DirectoryInfo通过将该路径作为字符串传递给构造函数。

现在考虑以下两条路径,将所有安全问题放在一边:

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

您不能简单地将这些传递给 Uri 或 DirectoryInfo 构造函数,因为它们不知道如何处理这些路径,这些路径主要由 linux 系统使用。此外,即使他们这样做了,他们也很可能不会保留登录凭据。

最终,我想要一种将这些转换为System.Uri代表实际路径的实例的方法,以及System.Net.NetworkCredential存储登录信息的实例。

那么我该如何解决这个问题呢?我什至不知道从哪里开始。继承 fromSystem.UriParser似乎是一个不错的起点,但根据 MSDN,不建议这样做。

Microsoft 强烈建议您使用 .NET Framework 附带的解析器。构建自己的解析器会增加应用程序的复杂性,并且不会像交付的解析器那样执行。

谢谢。

编辑

简单的解决方案(如下所示)是假设“@”符号之前的所有内容都是登录凭据的一部分,而它之后的所有内容都是实际路径。但是,当文件名包含“@”符号时,这可能会出现问题。

\\credential@host\path: 没问题

\\credential@host\path@mystorage: 同样没问题,因为第一个 @ 之前的所有内容都是登录的一部分。

\\host\path@mystorage: 现在我们破产了。当作为参数传递时,这肯定会引发参数异常。

4

1 回答 1

1

如果这些是您需要处理的仅有的两个方案,那么扩展解析器似乎有点过头了。无论如何,制作自己的实用程序类会更容易。

如果它真的像你给出的两个例子一样简单,我会暴力破解它。制作一个简单的类,可以将路径拆分为其各自的组件(基于“@”的存在和位置)并分别创建 Uri 和 NetworkCredential。如果字符串不包含“@”,则 NetworkCredential 可以为空。

如果它比这更复杂,我可能会偏离基础,但这听起来像是一个简单的解决方案可能会很好的时候。

请原谅我草率的代码,它不是完全容错的,但它应该说明问题。

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 回答