无法将XMLReader用于远程计算机上的xml文件

问题描述

我在远程计算机上有一个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帮助我了解我的问题。