2

奇妙な理由で、LogonUser DLLImportパラメーターをマーシャリングすると、ログオン タイプを使用しているときに正常にログインできなくなりましたが、INTERACTIVEログオン タイプで機能しNETWORKます。

これは私のコードです:

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool LogonUser
        (
        [MarshalAs(UnmanagedType.LPStr)]
        String lpszUsername,
        [MarshalAs(UnmanagedType.LPStr)]
        String lpszDomain,
        [MarshalAs(UnmanagedType.LPStr)]
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        out IntPtr hToken
        );

    bResult = LogonUser(
        "username",
        ".",
        "password",
        (int)LogonType.INTERACTIVE,     // = 2
        (int)LogonProvider.DEFAULT,     // = 0
        out hToken
        );

現在、LogonUser への呼び出しは失敗しています ( ) ですが、から sLogon Exception: Logon failure: unknown user name or bad passwordを削除すると正常に動作し、切り替えても正常に動作するのはなぜですか?[MarshalAs(UnmanagedType.LPStr)]DLLImportLogonType.NETWORKINTERACTIVE

悲しいことに、これをマーシャリングする必要があるなどの他の機能で使用するため、それを保持する必要がありLoadUserProfileます(それを機能させ、不明なウィンドウ文字[四角]を表示しない唯一の方法)。正しく検証するには、文字列のファンキーなマーシャリングなどを行う必要がありますか?

どんな助けでも大歓迎です。ありがとう、

4

2 に答える 2

2

LogonUserは、 LPSTRではなくLPTSTRをパラメーターとして受け取ります。デフォルトの文字列マーシャリングを使用するだけで、正しく機能します。

LogonUserのプロパティP/Invokeについては、 LogonUserおよびpinvoke.netの宣言を参照してください。

于 2009-09-27T02:26:47.250 に答える
0

同じ問題がありましたが、原因が異なりました。それから、私が働いている場所では、ユーザーとパスワードの代わりにデジタル証明書を使用してマシンにログオンする必要があることに気付きました。

ドメインにこの制限があることを忘れていました。

そのため、アプリケーションをテストするには、自分の代わりに別のドメインアカウントを使用する必要があります。

これらの情報が役立つかどうかはわかりませんが、他の人にとっては役立つかもしれません。

于 2012-10-31T16:34:32.567 に答える