[英]What is the magic to Windows impersonation with LOGON32_LOGON_NEW_CREDENTIALS?
从我在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();
}
}
}
但这不起作用。 输出从nt_user_name
和SUSER_NAME()
报告我 (我的基础登录用户SUSER_NAME()
。 (并且SQL事件探查器报告的内容完全相同;代码中的查询只是查看SQL事件探查器告诉我的简便方法。)
如果我从LogonType.NewCredentials
更改为LogonType.Interactive
(这些枚举具有您期望的值,如pinvoke.net上所定义),那么它确实有效 - 上面的代码报告正确的DOMAIN和USER模拟。 但这也意味着当前会话被模仿,我不想要 - 我只希望模拟数据库连接被模拟。
我以为我在上面发现了一个小故障 - 当LogonUser API明确指出LOGON32_PROVIDER_WINNT50
登录提供程序仅支持LOGON32_LOGON_NEW_CREDENTIALS
登录类型时,Johnson的模拟包装器将登录提供程序硬编码为LOGON32_PROVIDER_DEFAULT
。 所以我抓住了源代码并添加了一个参数来允许指定必需的登录提供程序......但这并没有什么区别。
那我错过了什么?
我很惭愧地说,答案一直在我面前。 LogonUser API指出:
此登录类型允许调用者克隆其当前令牌并为出站连接指定新凭据。 新登录会话具有相同的本地标识符,但对其他网络连接使用不同的凭据。 [强调我的]
但我的数据库与我正在运行的程序在同一台机器上,因此根据定义它不会显示新的凭据! 我相信,一旦我将数据库移动到另一个框,模拟将与LOGON32_LOGON_NEW_CREDENTIALS
一起正常工作。 叹。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.