使用XmlUriResolver为远程共享提供凭据

时间:2018-11-10 20:40:34

标签: c# xml winpe

在此先感谢您的帮助。

我在Stack Overflow和网络上的其他网站(包括Microsoft Docs)上看到了几则帖子,但似乎没有一个可以解决我的问题。

我正在一个项目上,该项目连接到WinPE上的远程文件共享上的xml文件。我从SO的另一篇文章中获得了有关使用XmlUriResolver类“适度”成功的建议。

我当前面临的问题是“访问被拒绝”错误(多次尝试修改XmlUriResolver.Credentials类)或完全失败而没有任何失败原因。我以为这将是另一个“访问被拒绝”错误,但是我的try / catch(异常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语句,包含所有方法。

如果我与Network Share的连接是开放的,则该方法将正常运行,但会导致该应用程序的应用程序失败-由于已经建立了连接。

我有解决该解决方案的替代方法,但会花费额外的代码行。

在不诉诸WNetAddConnection()的情况下解决此问题的任何帮助都将得到感谢

亲切问候

Richie

我知道这是身份验证问题。

1 个答案:

答案 0 :(得分:0)

在研究XmlUrlResolver类的工作方式后,我认为它可能是在引用/访问WinPE API框架中未包含的API。

在测试之后,我使用WNetAddConnection2()API连接到服务器并在发生任何事情之前进行身份验证,确保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);