Имя учетной записи пользователя не обновляется в приложении c # WinForm - PullRequest
0 голосов
/ 23 сентября 2010

Я редактирую решение c # WinForm и не понимаю код, который получает имя учетной записи пользователя. Код показан ниже.

Приложение отображает настраиваемую форму для каждой учетной записи пользователя, а имя учетной записи пользователя необходимо для получения значений конфигурации для конкретного пользователя из базы данных SQL.

Что, насколько я могу судить, произойдет, если вернутое имя пользователя будет правильным для первой учетной записи, к которой был осуществлен доступ, но после переключения на другую учетную запись пользователя возвращенное имя учетной записи не обновляется, а первоначальное имя учетной записи пользователя продолжает возвращаться.

#region "Function to retrieve LoggedIn user"
/// <summary>
/// "Function to retrieve LoggedIn user"
/// </summary>
/// <returns></returns>
private string GetLoggedInUserName()
{
    ManagementClass objManClass = new ManagementClass("Win32_Process");
    ManagementObjectCollection arrManObjects = objManClass.GetInstances();
    foreach (ManagementObject objMan in arrManObjects)
    {
        if (objMan["Name"].ToString().Trim().ToLower() == "explorer.exe")
        {
            string[] arrArgs = { "", "" };
            try
            {
                objMan.InvokeMethod("GetOwner", arrArgs);
                sUserName = arrArgs[0];
                break;
            }
            catch (Exception lExp)
            {
                BusinessObject.Logger.Logger.Log(lExp);
            }
        }
    }
    return sUserName;
}
#endregion

Это приложение должно работать на XP, Vista и 7.

Мой инстинкт - просто использовать что-то вроде ...

string sUserName = Environment.UserName;

... но мои знания об ОС Windows скудны, и люди, написавшие оригинальный код, намного умнее меня.

Итак, два моих вопроса: (1) Почему этот код не обновляется до нового имени пользователя, когда я меняю учетные записи пользователей? (2) зачем использовать метод explore.exe вместо простого «Environment.UserName»?

Кроме того, два проекта в моем решении имеют метод GetLoggedInUserName (). Один проект выполняется в фоновом режиме с таймером, который вызывает другой проект, и этот проект создает настраиваемую пользователем форму.

У меня есть еще один связанный вопрос о том, почему форма не отображается для всех учетных записей пользователей, кроме учетной записи администратора, которую я опубликую как отдельный вопрос, как только выясню этот вопрос.

Ответы [ 3 ]

4 голосов
/ 23 сентября 2010

Если вы хотите, чтобы в данный момент вошел в систему пользователь, использовать можно использовать объект WindowsIdentity:

string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
1 голос
/ 23 сентября 2010

Процесс Explorer всегда запускается при входе в окно Windows, поэтому он всегда будет найден. Если вы откроете диспетчер задач и просмотрите процессы, вы увидите его и учетную запись, которая его запустила. Это похоже на возврат к VBScript, хотя я уверен, что с этим тоже есть более простой способ.

Нет веских причин использовать WMI для получения текущей учетной записи пользователя на локальном компьютере по сравнению с другими более простыми методами.

1 голос
/ 23 сентября 2010

Для бита имени пользователя попробуйте ...

string username = System.Security.Principal.WindowsIdentity.GetCurrent (). Name;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...