gpt4 book ai didi

c# - 使用 LOGON32_LOGON_NEW_CREDENTIALS 模拟 Windows 有什么魔力?

转载 作者:可可西里 更新时间:2023-11-01 13:26:15 25 4
gpt4 key购买 nike

根据我对 Windows 用户模拟的阅读,应该正确使用 LOGON32_LOGON_NEW_CREDENTIALS 登录类型来模拟用户到数据库。使用 Matt Johnson 的漂亮模拟包装器(最初发布 here 然后完善 here ),我试图对此进行测试——这是我的整个程序,除了定义我的特定域、用户、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_nameSUSER_NAME( )。 (SQL 事件探查器报告完全相同的内容;代码中的查询只是一种查看 SQL 事件探查器告诉我的内容的便捷方式。)

如果我从 LogonType.NewCredentials 更改为 LogonType.Interactive(这些枚举具有您期望的值,如 pinvoke.net 中所定义),那么它确实有效--上面的代码报告了正确的域和用户模拟。但这也意味着当前 session 正在被模拟,这是我不希望的——我只希望模拟数据库连接。

我想我在上面发现了一个小故障——Johnson 的模拟包装器将登录提供程序硬编码为 LOGON32_PROVIDER_DEFAULT,当 LogonUser API明确指出 LOGON32_LOGON_NEW_CREDENTIALS 登录类型仅受 LOGON32_PROVIDER_WINNT50 登录提供程序支持。因此,我获取了源代码并添加了一个参数以允许指定必需的登录提供程序……但这没有任何区别。

那我错过了什么?

最佳答案

这个答案,不好意思说,一直就在我眼前。 LogonUser API 声明:

This logon type allows the caller to clone its current token and specify new credentials for outbound connections. The new logon session has the same local identifier but uses different credentials for other network connections. [emphasis mine]

但是我的数据库和我正在运行的程序在同一台机器上,所以根据定义它不会显示新的凭据!我相信一旦我将数据库移动到另一个盒子,模拟将与 LOGON32_LOGON_NEW_CREDENTIALS 一起正常工作。 叹气。

关于c# - 使用 LOGON32_LOGON_NEW_CREDENTIALS 模拟 Windows 有什么魔力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18091923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com