用户帐户名称在c#中未更新WinForm应用程序
我在编辑c#WinForm解决方案,但我不明白获取用户帐户名的代码。代码如下所示。用户帐户名称在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()方法。一个项目在后台运行,并使用一个调用其他项目的计时器,该项目会生成用户定制的表单。
我有另一个相关的问题,关于为什么表单不能出现所有用户帐户,除非管理员帐户,我会发布作为一个单独的问题,一旦我找出这个问题。
当您登录Windows窗口时,浏览器进程始终运行,因此始终可以找到它。如果您打开任务管理器并查看过程,您将看到它以及启动它的帐户。它看起来像是回到了VBScript,尽管我确信也有更简单的方法。
没有很好的理由使用WMI通过其他更简单的方法获取本地计算机上的当前用户帐户。
如果你想在当前登录的用户,使用可以使用WindowsIdentity
对象:
string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
我注意到使用这三个函数返回当前用户:System.Security.Principal.WindowsIdentity.GetCurrent()。Name,Environment.UserName和SystemInformation.UserName。但是,使用上面显示的“explorer.exe”方法只会返回初始用户帐户,但在更改帐户时不会更新。在确定它的工作原理和原始编码器使用它的原因之前,我不想删除一个方法。 – Frederick 2010-09-23 13:24:51
@Frederick:我不确定'SystemInformation.UserName',但在'WindowsIdentity.GetCurrent'和'Environment的情况下。UserName',它们会返回运行程序的用户(所以如果你使用'runas'启动程序,它将返回你正在运行的用户,而不是在Windows中登录的用户)。它们的区别在于'Environment.UserName'返回没有域的用户名。 – 2010-09-23 13:47:56
对于用户名位尝试...
字符串的用户名= System.Security.Principal.WindowsIdentity .GetCurrent()的名称。;
这是愚蠢的代码,只是死了错。查出来 – 2010-09-23 14:04:25
@Hans - 你从来没有误导过我。代码将被删除! – Frederick 2010-09-23 19:18:19