无法对远程计算机上的 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 帮助我解决了我的问题。