Использование XmlUriResolver для предоставления учетных данных для удаленного общего ресурса - PullRequest
0 голосов
/ 10 ноября 2018

Заранее благодарим за любую помощь.

Я видел несколько постов на Переполнение стека и других сайтах в сети (включая Документы Microsoft ), но ни один из них не помог мне решить мою проблему.

Я работаю над проектом, который подключается к XML-файлу на удаленном общем файловом ресурсе из WinPE. Я использовал предложения из другого поста об использовании класса XmlUriResolver для «умеренного» успеха.

Проблема, с которой я сейчас сталкиваюсь, это либо ошибка «Отказано в доступе» (несколько попыток изменить класс XmlUriResolver.Credentials), либо полный сбой без какой-либо причины сбоя. Я предполагаю, что это будет еще одна ошибка «Отказано в доступе», но моя попытка / улов (исключение e) не фиксирует причину.

Ниже приведен фрагмент и соответствующая часть метода, который я пытаюсь реализовать:

relativeSysData = relativeSysData.Replace(@"\", "/");
SysdataXml = $"file://{_globaldata.Server}/{_globaldata.Share}/{relativeSysData}";

XmlUrlResolver XmlResolver = new XmlUrlResolver();
XmlResolver.Credentials = new NetworkCredential(_UserName, 
                                                _Password);

XmlReaderSettings xmlSettings = new XmlReaderSettings();
xmlSettings.XmlResolver = XmlResolver;
LogWriter.WriteLogFile((int)LogWriter.EventID.Xml, (int)LogWriter.EventType.Info,
                      $"Connecting to (remote) System information store at: {SysdataXml}");

xDoc = XDocument.Load(XmlReader.Create(SysdataXml, xmlSettings));
if (xDoc == null)
{
    LogWriter.WriteLogFile((int)LogWriter.EventID.XmlError, (int)LogWriter.EventType.Error,
                          $"Unable to connect to the (remote) data store located at: {SysdataXml}");
    deploy = false;
    capture = false;
    return result;
}

Эта часть метода предназначена для доступа к удаленным данным. У меня есть оператор try / catch, охватывающий все методы.

Если у меня открытое подключение к сетевому ресурсу, метод будет работать безупречно, но приведет к сбою приложения, из-за которого уже открывается приложение.

У меня есть возможная альтернатива, чтобы обойти это решение, но это будет стоить дополнительных строк кода.

Любая помощь в решении этого вопроса без обращения к WNetAddConnection () будет с благодарностью получена

С уважением

Richie

N.B. Я знаю, что это проблема аутентификации.

1 Ответ

0 голосов
/ 11 ноября 2018

После исследования того, как работает класс XmlUrlResolver, я думаю, что это могут быть ссылки на API, которые не включены в структуру WinPE API.

После тестирования я использовал API WNetAddConnection2 () для подключения к Серверу и аутентификации до того, как что-либо произойдет, гарантируя, что локальное имя структуры NETRESOURCE останется нулевым, а DisplayType будет установлен на Server.

public static int ConnectToServer()
    {
        int result = 0;

        var _netresource = new NetResource()
        {
            scope = _ResourceScope.GlobalNetwork,
            ResourceType = _ResourceType.Any,
            DisplayType = _ResourceDisplayType.Server,
            RemoteName = $@"\\{Program._globaldata.Server}"
        };

        string _username = $@"{Program._globaldata.Server}\RemoteDKBuild";
        string _passsword = "Hic3nuasno6epyndtenars4yDifrts";

        var _connectiontype = (int)_ConnectionType.Interactive | (int)_ConnectionType.Temporary;

        LogWriter.WriteLogFile((int)LogWriter.EventID.NetMan, (int)LogWriter.EventType.Info,
                                $@"Attempting to connect to: \\{_netresource.RemoteName}");
        result = WNetAddConnection2(_netresource, _passsword, _username, _connectiontype);
        var res = Marshal.GetLastWin32Error();
        if (result !=0)
        {
            LogWriter.WriteLogFile((int)LogWriter.EventID.NetMan, (int)LogWriter.EventType.Error,
                                    $@"Failed to connect to: \\{_netresource.RemoteName}, Return Result: {result.ToString()}, Win32 Error Code: {res.ToString()}");
            result = res;
        }
        else
        {
            LogWriter.WriteLogFile((int)LogWriter.EventID.NetMan, (int)LogWriter.EventType.Info,
                                    $@"Connection to: \\{_netresource.RemoteName} has been successfull.");
        }

        return result;
    }

[DllImport("mpr.dll", SetLastError = true)]
private static extern int WNetAddConnection2(NetResource netResource, string password, string username, int flags);
...