C# での Windows 偽装: 詳細ガイド
偽装により、あるプロセスが一時的に別のユーザーの ID を引き受けることができます。この手法は、プロセスで高い特権が必要な場合、または特定のユーザーに制限されたリソースにアクセスする必要がある場合によく利用されます。
LocalSystem から別のユーザーへの偽装
特定のシナリオでは、 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 中国語 Web サイトの他の関連記事を参照してください。