问题描述
我在远程计算机上有一个xml文件,无法通过XMLReader
访问。在本地,它可以快速而有效地工作,但是对于我一生来说,无法弄清楚如何在远程计算机上进行访问。
我尝试将XMLSecureResolver
用于:
XmlSecureResolver resolver = new XmlSecureResolver(new XmlUrlResolver(),uriPath);
resolver.Credentials = new NetworkCredential(user,password,domain);
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
但出现错误Request for the permission of type 'System.Security.Permissions.FileIOPermission,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089' Failed.
我尝试过:
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = new NetworkCredential(user,domain);
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
但是我得到The user name or password is incorrect.
使用的凭据绝对正确,因为它们来自相同的运行设置文件以登录到该远程PC。
关于using (XmlReader reader = XmlReader.Create(uri,settings))
,我在想uri的格式不正确。我正在使用的是\\FullQualifiedDomainName\C$\SpecifiedDir\TheFile.xml
,它在我的本地计算机上(对远程设备-手动)适用于我。
非常感谢您的帮助。
解决方法
因此,归结为使用效果很好的powershell Invoke-Command。让我开始我想要做的事情。以下内容采用了非常大的XML文件,该文件负责保存可以导入数据库的各种表和定义。导入过程可能会花费很长的时间,尤其是如果您需要对导出进行测试时。这就是要解决的问题:
XmlReaderSettings settings = new XmlReaderSettings();
settings.Async = true;
string table = string.Empty;
using (XmlReader reader = XmlReader.Create(sourcePath,settings))
{
while(await reader.ReadAsync())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name.Equals({theElementToCheckAgainst}))
{
if (reader.GetAttribute("Name").Equals(tableOfInterest))
{
table = reader.ReadInnerXml();
break;
}
}
break;
}
}
}
return table;
}
上面的内容确实不需要异步,因此,如果需要,可以使用reader.Read()而不是reader.ReadAsync()。无论如何,当我需要测试在不同域中的远程计算机上进行的导出时,这是行不通的。
我们有一种使用Powershell Invoke-Command访问我们的远程计算机的方法,它看起来像这样:
string script =
$"$password = ConvertTo-SecureString '{password}' -AsPlainText -Force; " +
$"$cred = New-Object System.Management.Automation.PSCredential('{username}',$password); " +
$"Invoke-Command -ComputerName '{hostname}' -Credential $cred -ScriptBlock ";
主机名是不带斜杠的FQDN。
然后我们将脚本附加
script += $"{{ {scriptBlock} }};";
在我的情况下,scriptBlock =
$@"$xmlfile = ""{sourcePath}""
$reader = [System.Xml.XmlReader]::Create($xmlfile)
while ($reader.read())
{{
switch ($reader.NodeType)
{{
([System.Xml.XmlNodeType]::Element)
{{
if ($reader.Name -eq ""{theElementToCheckAgainst}"")
{{
if ($reader.GetAttribute(""Name"") -eq ""{tableOfInterest}"")
{{
$null = [System.Reflection.Assembly]::Load(""System.Xml.Linq,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"") #This was added because I kept getting an error with System.Xml.Linq without it. You may not need it.
$result = [System.Xml.Linq.XElement]::ReadFrom($reader)
return $result.ToString()
}}
break
}}
break
}}
}}
}}";
最后,我们使用Invoke-Command来执行所有操作:
PowerShell powerShellInstance = PowerShell.Create();
powerShellInstance.AddScript(script);
return powerShellInstance.Invoke();
现在,我们的方法中有一些公司特定的东西,我无法显示,但我希望这对需要此东西的人有所帮助。
感谢@ADyson帮助我了解我的问题。