.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() の組み合わせで発生します。
何か案は?