3

我正在尝试将面向 .NET Framework 3.5 的现有系统更新为 .NET Framework 4.5。我已将问题简化为以下可重现的示例

class Program
{
    static void Main(string[] args)
    {
        const string username = "user";
        const string domain = "domain";
        const string password = "pass";

        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_LOGON_INTERACTIVE = 2;
        var logonToken = IntPtr.Zero;
        var logonResult = NativeMethods.LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT, out logonToken);
        if (logonResult != 0)
        {
            using (var windowsIdentity = new WindowsIdentity(logonToken))
            {
                using (var context = windowsIdentity.Impersonate())
                {
                    const string filename = @"schema.xsd";

                    using (var file = new StreamReader(filename))
                    {
                        while (file.ReadLine() != null)
                        {
                        }
                    }

                    var xss = new XmlSchemaSet();
                    xss.Add(null, filename);
                }
            }
        }
    }
}

StreamReader 不在原始程序中,但我想检查/证明文件在模拟后是否可以访问。Schema.xsd 可以是任何模式。如果无法访问架构,我会正确收到权限被拒绝错误。我创建了一个空架构以确保架构的内容没有问题,但它仍然存在问题。

如果项目目标框架更改为 .NET 3.5,则此程序无需修改即可运行。以 .NET 4.5 为目标时,会引发异常,但如果我删除 windowsIdentity.Impersonate() 调用,它可以正常工作(但显然使用了错误的凭据)。问题在于使用模拟、.NET Framework 4.0 或更高版本以及 XmlSchemaSet.Add() 的组合。

有任何想法吗?

4

0 回答 0