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