在此先感谢您的帮助。
我在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
我知道这是身份验证问题。
答案 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);