无法对远程计算机上的 xml 文件使用 XMLReader
Unable to use XMLReader for an xml file on a remote machine
我有一个位于远程机器上的 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, password, domain);
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
但我得到 The user name or password is incorrect.
并且使用的凭据绝对正确,因为它们来自同一个 runsettings 文件以登录到该远程电脑。
至于 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();
现在,我们的方法中有一些 company-specific 内容我无法展示,但我希望这对任何需要它的人有所帮助。
感谢@ADyson 帮助我解决了我的问题。
我有一个位于远程机器上的 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, password, domain);
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
但我得到 The user name or password is incorrect.
并且使用的凭据绝对正确,因为它们来自同一个 runsettings 文件以登录到该远程电脑。
至于 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();
现在,我们的方法中有一些 company-specific 内容我无法展示,但我希望这对任何需要它的人有所帮助。
感谢@ADyson 帮助我解决了我的问题。