C# 使用wtsapi32.dll进行的查询不适用于日本用户的SAM帐户名
我正在使用wtsapi32.dll。(窗口终端服务api) 我正在尝试从方法WTSQueryUserConfig获取用户信息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(
[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);