使用String Marshaling我的DLLImport LogonUser有什么问题? [C#]

时间:2009-09-27 01:30:39

标签: c# marshalling dllimport

由于一些奇怪的原因,当我编组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的调用失败了(Logon Exception: Logon failure: unknown user name or bad password),但是如果我从[MarshalAs(UnmanagedType.LPStr)]中移除了DLLImport它就可以正常工作,如果我切换到{{ 1}}它工作正常,为什么它与LogonType.NETWORK不同?

可悲的是,我需要保留它,因为我将其与其他函数一起使用,例如INTERACTIVE需要将其编组(只有这样才能让它工作并且不显示未知的窗口字符[square])。我是否需要对字符串或其他东西进行一些时髦的编组以使其正确验证?

任何帮助将不胜感激。 谢谢,

2 个答案:

答案 0 :(得分:2)

LogonUser将LP T STR而不是LPSTR作为参数。你应该只使用默认的字符串编组,它将正常工作。

请参阅LogonUserpinvoke.net's declaration for a property P/Invoke of LogonUser

答案 1 :(得分:0)

我有同样的问题,但原因不同。然后我意识到,在我工作的地方,我们必须使用数字证书而不是用户和密码登录我们的机器。

我忘记了我们对域名的限制。

所以我必须使用另一个域帐户而不是我的帐户来测试我的应用程序。

我不知道这些信息是否会有所帮助,但它们可能对其他人有用。