C# 使用wtsapi32.dll进行的查询不适用于日本用户的SAM帐户名

C# 使用wtsapi32.dll进行的查询不适用于日本用户的SAM帐户名,c#,winapi,dllimport,terminal-services,wtsapi32,C#,Winapi,Dllimport,Terminal Services,Wtsapi32,我正在使用wtsapi32.dll。(窗口终端服务api) 我正在尝试从方法WTSQueryUserConfig获取用户信息 [DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool WTSQueryUserConfig(

我正在使用wtsapi32.dll。(窗口终端服务api)

我正在尝试从方法WTSQueryUserConfig获取用户信息

[DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool WTSQueryUserConfig(
                           [MarshalAs(UnmanagedType.LPStr)] string pServerName,
                           [MarshalAs(UnmanagedType.LPStr)] string pUserName,
                           WTS_CONFIG_CLASS wtsConfigClass,
                           out StringBuilder pBuffer,
                           out int dataLength);
我与SAM帐户名为日语(unicode)的用户有问题

我已使用(unicode版本)修改了我的类:

但是我用日本SAM帐户名来调用这个方法,它不起作用


没有unicode字符的用户可以使用非unicode版本的方法。

最后,我只对输入参数使用了字符集配置

[DllImport("wtsapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool WTSQueryUserConfigW(
                                    string pServerName,
                                    string pUserName,
                                    WindowsTerminalServiceConfig wtsConfigClass,
                                    out StringBuilder pBuffer,
                                    out int dataLength);

[marshallas(UnmanagedType.LPStr)]
是不必要的,在本例中是不正确的,因为
LPStr
始终是ANSI。对Unicode版本使用
LPTStr
,或者对Unicode版本使用
LPWStr
,或者省略属性(您已经指定了
CharSet
,因此封送员应该自己找出正确的类型)。Jeroen是正确的。此外,还需要调用WTSFreeMemory来释放为缓冲区分配的内存。现在这是不可能的,所以程序会泄漏内存。通过使用
out intPtr pBuffer
,Marshal.PtrToStringUni()提供了字符串。谢谢@jeroenmoster。现在它工作得很好。关于Marshal,我正试图用Han的建议改进我的代码。谢谢!!
[DllImport("wtsapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool WTSQueryUserConfigW(
                                    string pServerName,
                                    string pUserName,
                                    WindowsTerminalServiceConfig wtsConfigClass,
                                    out StringBuilder pBuffer,
                                    out int dataLength);