我正在编辑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()方法。一个项目在后台运行,其中一个计时器调用另一个项目,该项目生成用户自定义表单。
我还有另一个相关的问题,为什么表单无法显示给所有用户帐户,但管理员帐户除外,我将在发现此问题时将其作为单独的问题发布。
答案 0 :(得分:4)
如果您想要当前登录的用户,请使用WindowsIdentity
对象:
string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
答案 1 :(得分:1)
对于用户名,请尝试...
string username = System.Security.Principal.WindowsIdentity.GetCurrent()。Name;
答案 2 :(得分:1)
当您登录Windows框时,Explorer进程始终在运行,因此始终可以找到它。如果您打开任务管理器并查看您将看到它的进程以及启动它的帐户。它看起来像是对VBScript的回击,虽然我确信它也有一种更简单的方法。
没有充分的理由使用WMI来获取本地计算机上的当前用户帐户而不是其他更简单的方法。