C# 中的 Windows 模擬:詳細指南
模擬允許一個進程暫時假設另一用戶的身分。當進程需要提升權限或需要存取僅限於特定使用者的資源時,通常會使用此技術。
從本機系統模擬到另一個用戶
在您的特定場景中,您有一個作為LocalSystem 運行的Windows 服務,需要模擬用戶XYZ 以使用集成安全性連接到資料庫。這可以在不知道 XYZ 密碼的情況下實現。
無密碼模擬
要在沒有密碼的情況下模擬,您可以利用 C# 中的安全支援提供者介面 (SSPI)。此方法使用 Kerberos 驗證,並且需要最少的程式碼:
using System.Runtime.InteropServices; ... [DllImport("secur32.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern bool LogonUserW(string user, string domain, string password, int logonType, int logonProvider, out SafeTokenHandle token); public static TokenHandle ImpersonateUser(string user, string domain = null) { // Default parameters for 'domain' and 'logonProvider' if (domain == null) domain = "."; // Default domain int logonProvider = 0; // Logon provider not used SafeTokenHandle token = null; bool success = LogonUserW(user, domain, null /* password */, LOGON32_LOGON_INTERACTIVE, logonProvider, out token); if (!success) { int err = Marshal.GetLastWin32Error(); throw new Win32Exception(err); } return token; } public class TokenHandle : SafeHandle { public TokenHandle(IntPtr handle) : base(handle, true) { } public override bool IsInvalid => handle == IntPtr.Zero; protected override bool ReleaseHandle() => CloseHandle(handle); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CloseHandle(IntPtr hObject); }
要模擬,請使用所需的使用者名稱和可選的網域建立一個 TokenHandle 物件。然後,在要模擬的執行緒上呼叫 ImpersonateUser 方法。完成後處理 TokenHandle。
使用密碼模擬
如果需要密碼,可以使用 LoadUserProfile 函數並將密碼傳遞給 ImpersonateLoggedOnUser 函數。但是,儲存和安全管理密碼超出了本回應的範圍。建議諮詢安全密碼管理實務或考慮替代身份驗證方法。
以上是如何在不知道密碼的情況下用 C# 模擬使用者?的詳細內容。更多資訊請關注PHP中文網其他相關文章!