使用LOGON32_LOGON_NEW_CREDENTIALS进行Windows模拟的魔力是什么?

Mic*_*ens 6 c# windows impersonation

从我在Windows上的用户模拟阅读中,应该正确使用LOGON32_LOGON_NEW_CREDENTIALS登录类型来模拟用户到数据库.使用马特约翰逊漂亮的冒充包装(最初发布在这里,然后擦亮了这里),我尝试测试了这一点-这里除了我的定义特定领域,USER,PWD和CONN_STRING常数我的整个程序.

using System;
using System.Data.SqlClient;
using SimpleImpersonation;

namespace ImpersonationDemo
{
    class Program
    {
        private static SqlConnection _connection;

        static void Main(string[] args)
        {
            using (Impersonation.LogonUser(
                    DOMAIN, USER, PWD, LogonType.NewCredentials))
            {
                GetOpenConnection();
                CheckDbCredentials();
                CloseConnection();
            }
            Console.WriteLine("Press return to exit");
            Console.ReadLine();
        }

        private static void CheckDbCredentials()
        {
            using (
                var command = new SqlCommand(
                    "SELECT nt_user_name, SUSER_SNAME() "
                    +"FROM sys.dm_exec_sessions WHERE session_id = @@SPID",
                    _connection))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Console.WriteLine("{0}, {1}",
                            reader.GetString(0), reader.GetString(1));
                    }
                }
            }
        }


        private static void GetOpenConnection()
        {
            _connection = new SqlConnection(CONN_STRING);
            _connection.Open();
        }

        private static void CloseConnection()
        {
            _connection.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.输出报告(我的基础登录用户)nt_user_nameSUSER_NAME().(并且SQL事件探查器报告的内容完全相同;代码中的查询只是查看SQL事件探查器告诉我的简便方法.)

如果我更改LogonType.NewCredentialsLogonType.Interactive(这些枚举具有您期望的值,如pinvoke.net上所定义),那么它确实有效 - 上面的代码报告了正确的DOMAIN和USER模拟.但这也意味着当前会话被模仿,我不想要 - 我只希望模拟数据库连接被模拟.

我以为我在上面发现了一个小问题 - LOGON32_PROVIDER_DEFAULTLogonUser API明确指出LOGON32_LOGON_NEW_CREDENTIALS登录类型仅由LOGON32_PROVIDER_WINNT50登录提供程序支持时,Johnson的模拟包装器对登录提供程序进行硬编码.所以我抓住了源代码并添加了一个参数来允许指定必需的登录提供程序......但这并没有什么区别.

那我错过了什么?

Mic*_*ens 5

我很惭愧地说,答案一直都在我面前.LogonUser API指出:

此登录类型允许调用者克隆其当前令牌并为出站连接指定新凭据.新登录会话具有相同的本地标识符,但对其他网络连接使用不同的凭据.[强调我的]

但我的数据库与我正在运行的程序在同一台机器上,因此根据定义它不会显示新的凭据!LOGON32_LOGON_NEW_CREDENTIALS一旦我将数据库移动到另一个框,我确信模拟将正常工作.叹.