Penyamaran Windows dalam C#: Panduan Terperinci
Penyamaran membenarkan satu proses untuk mengambil alih identiti pengguna lain buat sementara waktu. Teknik ini sering digunakan apabila proses memerlukan keistimewaan yang tinggi atau perlu mengakses sumber yang terhad kepada pengguna tertentu.
Penyamaran daripada LocalSystem kepada Pengguna Lain
Dalam senario khusus anda, anda mempunyai Perkhidmatan Windows berjalan sebagai LocalSystem yang perlu menyamar sebagai pengguna XYZ untuk menyambung ke pangkalan data menggunakan keselamatan bersepadu. Ini boleh dicapai tanpa mengetahui kata laluan XYZ.
Penyamaran Tanpa Kata Laluan
Untuk menyamar tanpa kata laluan, anda boleh memanfaatkan Antara Muka Penyedia Sokongan Keselamatan (SSPI) dalam C#. Kaedah ini menggunakan pengesahan Kerberos dan memerlukan kod minimum:
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); }
Untuk menyamar sebagai, cipta objek TokenHandle dengan nama pengguna yang dikehendaki dan domain pilihan. Kemudian, panggil kaedah ImpersonateUser pada urutan yang anda ingin jadikan sebagai. Buang TokenHandle apabila selesai.
Penyamaran dengan Kata Laluan
Jika kata laluan diperlukan, anda boleh menggunakan fungsi LoadUserProfile dan hantar kata laluan kepada fungsi ImpersonateLoggedOnUser. Walau bagaimanapun, menyimpan dan mengurus kata laluan dengan selamat adalah di luar skop respons ini. Adalah disyorkan untuk merujuk kepada amalan pengurusan kata laluan selamat atau mempertimbangkan kaedah pengesahan alternatif.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyamar sebagai Pengguna dalam C# Tanpa Mengetahui Kata Laluan Mereka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!