我正在尝试将面向 .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() 的组合。
有任何想法吗?