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的Logon Exception: Logon failure: unknown user name or bad password调用失败[MarshalAs(UnmanagedType.LPStr)]了(DLLImportLogonType.NETWORKINTERACTIVE

可悲的是,我需要保留它,因为我将它与其他功能一起使用,例如LoadUserProfile需要对其进行编组(只有这样我才能让它工作而不显示未知的 Windows 字符 [正方形])。我是否需要对字符串进行一些时髦的编组或其他操作以使其正确验证?

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

4

2 回答 2

2

LogonUser 将 LP T STR 而非 LPSTR 作为参数。您应该只使用默认的字符串封送处理,它会正常工作。

请参阅LogonUserpinvoke.net 的关于 LogonUser 的属性 P/Invoke 的声明

于 2009-09-27T02:26:47.250 回答
0

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

我忘记了我们的域有这个限制。

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

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

于 2012-10-31T16:34:32.567 回答