我正在编辑 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() 方法。一个项目在后台运行,计时器调用另一个项目,该项目生成用户自定义表单。
我还有另一个相关的问题,关于为什么除了管理员帐户之外的所有用户帐户都无法显示表单,一旦我弄清楚这个问题,我将作为一个单独的问题发布。