出于某些奇怪的原因,当我编组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作为参数。您应该只使用默认的字符串封送处理,它将可以正常工作。
请参见LogonUser和pinvoke.net's declaration for a property P/Invoke of LogonUser。
关于c# - 带字符串编码(marshal)处理的LogonUser的DLLImport有什么问题? [C#],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1482569/