0

我正在编辑 ac# 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() 方法。一个项目在后台运行,计时器调用另一个项目,该项目生成用户自定义表单。

我还有另一个相关的问题,关于为什么除了管理员帐户之外的所有用户帐户都无法显示表单,一旦我弄清楚这个问题,我将作为一个单独的问题发布。

4

3 回答 3

4

如果你想要当前登录的用户,使用可以使用WindowsIdentity对象:

string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
于 2010-09-23T13:15:23.197 回答
1

对于用户名位尝试...

字符串用户名 = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

于 2010-09-23T13:16:43.847 回答
1

当您登录到 Windows 框时,Explorer 进程始终在运行,因此始终可以找到它。如果您打开任务管理器并查看进程,您将看到它,以及启动它的帐户。它看起来像是回到 VBScript,尽管我确信也有更简单的方法。

没有充分的理由使用 WMI 来获取本地计算机上的当前用户帐户,而不是其他更简单的方法。

于 2010-09-23T13:22:05.410 回答