Получить имя пользователя Windows, содержащее неанглийские символы в C#
Мы используем код из этого поста, чтобы получить имя подключенного пользователя Windows, чтобы отключить их.
Вкратце, GetUserName(), GetCurrentUserName(), LogOffUser() и LogOffCurrentUser(), следующим образом.
ПРОБЛЕМА: В английской версии Windows и когда имя пользователя содержит неанглийские символы, пользователь не выйдет из системы.
После некоторой отладки мы выяснили, что имя пользователя внутри GetUserName () отображается с вопросительными знаками вместо неанглийских символов, но в LogOffCurrentUser () отображается правильно. Таким образом, пользователь остается на связи, потому что имя пользователя не может быть найдено при попытке отключиться.
Есть ли способ решить это?
public static string GetUserName(int sessionId, IntPtr server)
{
IntPtr buffer = IntPtr.Zero;
uint count = 0;
string userName = string.Empty;
try
{
WTSQuerySessionInformation(server, sessionId, WTS_INFO_CLASS.WTSUserName, out buffer, out count);
userName = Marshal.PtrToStringAnsi(buffer).ToUpper().Trim();
}
finally
{
WTSFreeMemory(buffer);
}
return userName;
}
//-------------------------------------
public static string GetCurrentUserName()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
string[] parts = username.Split(new char[] { '\\' });
if (parts[parts.Length - 1] == "SYSTEM") parts[parts.Length - 1] = "";
return parts[parts.Length - 1];
}
//-------------------------------------
public static bool LogOffUser(string userName, IntPtr server)
{
userName = userName.Trim().ToUpper();
List<int> sessions = GetSessionIDs(server);
Dictionary<string, int> userSessionDictionary = GetUserSessionDictionary(server, sessions);
if (userSessionDictionary.ContainsKey(userName))
{
return WTSLogoffSession(server, userSessionDictionary[userName], false);
}
else
{
return false;
}
}
//-------------------------------------
public static void LogOffCurrentUser()
{
LogOffUser(GetCurrentUserName(), IntPtr.Zero);
}
1 ответ
РЕШЕНИЕ:
При попытке получить имена пользователей Windows, которые содержат неанглийские (нелатинские) символы, вы должны p/ вызвать версию WTSQuerySessionInformation, которая является WTSQuerySessionInformationW, в формате Unicode.
Затем имя пользователя может быть помещено в строку с помощью Marshal.PtrToStringUni или Marshal.PtrToStringAuto.
Таким образом, WTSLogoffSession найдет имя пользователя в словаре сессии и правильно отключит пользователя.