出于某些奇怪的原因,当我编组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,它可以正常工作,而且如果我切换到LogonType.NETWORK,它也可以工作,为什么会有所不同与INTERACTIVE

可悲的是,我需要将其保留下来,因为我将其与其他功能(例如LoadUserProfile)一起使用时需要将其编组(这是我可以使其正常工作并且不显示未知的Windows字符[正方形]的唯一方式)。我是否需要对字符串进行一些时髦的封送处理或进行正确的验证?

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

最佳答案

LogonUser使用LPTSTR,而不是LPSTR作为参数。您应该只使用默认的字符串封送处理,它将可以正常工作。

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

关于c# - 带字符串编码(marshal)处理的LogonUser的DLLImport有什么问题? [C#],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1482569/

10-11 20:51