2012-05-28 5 views
0

Рассмотрят следующий путь UNC к сетевому ресурсу простых окон (SMB протокол):Синтаксических сетевой путь с учетными данными на типы библиотек базовых классов

  • \\host\share

Вы можете легко создать экземпляр System.Uri или System.IO.DirectoryInfo, передавая этот путь как строку конструктору.

Теперь рассмотрим следующие два пути, оставив все проблемы безопасности в сторону:

Вы не можете просто передать их конструкторам Ури или DirectoryInfo, потому что они надевают Не знаете, как обращаться с этими путями, которые в основном используются системами Linux. Кроме того, даже если бы они это сделали, они, скорее всего, не сохранили бы учетные данные входа.

В конечном счете, я хотел бы, чтобы преобразовать их в экземпляр System.Uri, который представляет фактический путь, и экземпляр System.Net.NetworkCredential, который хранит информацию для входа в систему.

Итак, как мне решить эту проблему? Я даже не знаю, с чего начать. Наследование с System.UriParser кажется хорошим местом для начала, но согласно MSDN, это не рекомендуется.

Корпорация Майкрософт настоятельно рекомендует использовать парсер, поставляемый с .NET Framework. Создание собственного анализатора увеличивает сложность вашего приложения и не будет работать так же, как и отправленные парсеры.

Спасибо.

EDIT

Простое решение (как размещены ниже), чтобы просто предположить, что все до «@» символ является частью учетных данных входа в систему, и все, что после того, как это реальный путь. Это может быть проблематично, однако, когда имена файлов содержат символы «@».

\\[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

 Смежные вопросы

  • Нет связанных вопросов^_^