Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#WinForm应用程序中未更新用户帐户名_C#_Winforms_User Accounts - Fatal编程技术网

c#WinForm应用程序中未更新用户帐户名

c#WinForm应用程序中未更新用户帐户名,c#,winforms,user-accounts,C#,Winforms,User Accounts,我正在编辑一个c#WinForm解决方案,我不理解获取用户帐户名的代码。代码如下所示 应用程序为每个用户帐户显示一个自定义表单,需要用户帐户名才能从SQL数据库中获取特定于用户的配置值 据我所知,返回的用户名对于访问的第一个用户帐户是正确的,但在切换到其他用户帐户后,返回的用户帐户名不会更新,并且会继续返回初始用户帐户名 #region "Function to retrieve LoggedIn user" /// <summary> /// "Function to retrie

我正在编辑一个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
…但我对Windows操作系统的了解很差,编写原始代码的人比我聪明得多

所以我的两个问题是: (1) 为什么在我更改用户帐户时,此代码似乎不会更新为新用户名? (2) 为什么要使用“explore.exe”方法而不是简单地使用“Environment.UserName”

另外,我的解决方案中的两个项目有一个GetLoggedInUserName()方法。一个项目在后台运行,计时器调用另一个项目,该项目生成用户自定义表单


我还有另一个相关问题,关于除了管理员帐户以外的所有用户帐户都无法显示表单的原因,我将在解决此问题后将其作为单独的问题发布。

如果您想要当前登录的用户,请使用可以使用该对象:


如果需要当前登录的用户,请使用以下对象:


对于用户名位,请尝试


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

对于用户名位,请尝试


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

当您登录到Windows框时,资源管理器进程始终在运行,因此始终可以找到它。如果打开Task Manager并查看流程,您将看到它以及启动它的帐户。这看起来像是对VBScript的一种回击,尽管我确信有一种更简单的方法可以实现它


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

当您登录到Windows框时,资源管理器进程始终在运行,因此始终可以找到它。如果打开Task Manager并查看流程,您将看到它以及启动它的帐户。这看起来像是对VBScript的一种回击,尽管我确信有一种更简单的方法可以实现它


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

我注意到,使用这三种方法中的任何一种都会返回当前用户:System.Security.Principal.WindowsIdentity.GetCurrent().Name、Environment.UserName和SystemInformation.UserName。但是使用上面显示的“explorer.exe”方法只返回初始用户帐户,但在更改帐户时不会更新。我不想先删除一个方法,然后再弄清楚它是如何工作的以及原始编码人员为什么使用它。@弗雷德里克:我不确定
SystemInformation.UserName
,但在
WindowsIdentity.GetCurrent
Environment.UserName
的情况下,它们将返回运行程序的用户(因此,如果您使用
runas
启动程序,它将返回您正在运行的用户,而不是登录Windows的用户)。它们之间的区别在于
Environment.UserName
返回不带域的用户名。我注意到使用这三种方法中的任何一种都会返回当前用户:System.Security.Principal.WindowsIdentity.GetCurrent().Name、Environment.UserName和SystemInformation.UserName。但是使用上面显示的“explorer.exe”方法只返回初始用户帐户,但在更改帐户时它不会更新。我不想在弄清楚它是如何工作的以及原始编码人员为什么使用它之前删除它。@Frederick:我不确定
SystemInformation、 用户名
,但如果是
WindowsIdentity.GetCurrent
Environment.UserName
,它们将返回运行程序的用户(因此,如果使用
runas
启动程序,它将返回您正在运行的用户,而不是登录Windows的用户)。它们之间的区别在于
环境。UserName
返回没有域的用户名。这是愚蠢的代码,完全错误。扔掉它。@Hans-你过去从来没有误导过我。代码将被扔掉!这是愚蠢的代码,完全错误。扔掉它。@Hans-你过去从来没有误导过我。T他会被扔掉的!
string sUserName = Environment.UserName;
string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;