[英]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.