在此先感谢您的任何帮助。
我在Stack Overflow和网络上的其他网站(包括Microsoft Docs)上看到了几篇文章,但似乎都没有帮助解决我的问题。
我正在开发一个项目,该项目从 WinPE 连接到远程文件共享上的 xml 文件。我已经使用了关于使用 XmlUriResolver 类来“适度”成功的另一篇关于 SO 的帖子的建议。
我目前面临的问题是“拒绝访问”错误(多次尝试修改 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 语句。
如果我有一个到网络共享的开放连接,该方法将完美运行,但会导致该应用程序开始失败 - 由于已经打开连接。
我有一个可能的替代方案来解决这个解决方案,但会花费额外的代码行。
不诉诸 WNetAddConnection() 解决此问题的任何帮助将不胜感激
亲切的问候
里奇
注意,我知道这是一个身份验证问题。
在研究 XmlUrlResolver 类的工作原理后,我认为它可能引用/访问了 WinPE API 框架中未包含的 API。
经过测试,我已经使用 WNetAddConnection2() API 连接到服务器并在发生任何事情之前进行身份验证,确保 NETRESOURCE 结构的本地名称留空,并且 DisplayType 设置为服务器。
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句