ホームページ >バックエンド開発 >C++ >パスワードを知らずに C# でユーザーになりすますにはどうすればよいですか?

パスワードを知らずに C# でユーザーになりすますにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-28 15:15:11539ブラウズ

How Can I Impersonate a User in C# Without Knowing Their Password?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。