【问题标题】:Current user name if account name has changed当前用户名(如果帐户名已更改)
【发布时间】:2013-06-27 06:40:57
【问题描述】:

我尝试在 c# 中获取当前登录用户的名称 - 而不是我可以在 Environment.UserName 中轻松找到的帐户名称。 我想像资源管理器那样枚举 MyComputer 上的文件夹。我该怎么做,或者有其他方法可以获取用户的正确名称吗?

提前致谢。

【问题讨论】:

  • 提供你所做的。
  • 我不确定您在这里要求什么。您能否提供一个更具说明性的示例来说明您正在尝试做什么?我特别不知道“我想像资源管理器那样枚举 MyComputer 上的文件夹”是什么意思,以及它如何与您的其他问题相匹配。

标签: c# .net windows-authentication


【解决方案1】:

尝试使用:

System.Security.Principal.WindowsIdentity.GetCurrent().Name 这应该返回当前登录用户的帐户,以及他们的姓名。

如果在用户名更改后这不起作用,另一种方法是获取当前用户的 SID,然后查找与该 SID 匹配的用户名。

using System.Security.Principal;
string sid = WindowsIdentity.GetCurrent().Owner.ToString();
return new SecurityIdentifier(sid).Translate(typeof(NTAccount)).ToString();

如果失败,请获取 SID 并尝试通过 WMI 或通过注册表找到匹配的用户。有关如何手动执行此操作的说明在这里:http://pcsupport.about.com/od/registry/ht/find-user-security-identifier.htm

如果您可以手动确认这些方法中的任何一个返回新用户名,那么只需在代码中使用 WMI 调用或注册表访问来实现它。

【讨论】:

  • 应该用这个来捕捉SecurityException(可能返回环境名称,因为你现在正在使用它作为后备)
  • 您的链接将我引向解决方案: SelectQuery query = new SelectQuery("Win32_UserAccount", string.Format("Domain='{0}'", Environment.MachineName)); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); foreach (ManagementObject mObject in searcher.Get()) { Console.WriteLine((string)mObject["Name"] + "\t" + (string)mObject["FullName"]); “FullName”是我搜索过的属性。非常感谢。
  • 您应该发布该解决方案作为答案。很好的解决办法
【解决方案2】:

使用它,

string windowLoging = WindowsIdentity.GetCurrent().Name;

string windowsLogin = Page.User.Identity.Name;

string windowsLogin = Environment.GetEnvironmentVariable("USERNAME");

【讨论】:

  • 假设我们在机器上有一个名为“Admin”的帐户。如果用户在控制面板中更改此用户帐户的名称,即更改为“Harald”,则资源管理器会将我的文档文件夹显示为“Harald”而不是“Admin”。 Identity.name 或 Environment.UserName 等所有函数的结果都是“Admin”。如何获取当前登录用户更改后的用户名(即“Harald”)?
  • 所有这些代码都提供原始用户名 - 而不是更改后的帐户名。在示例中,所有这些代码都提供“Admin”——但我正在寻找一种方法来获取“Admin”的当前名称——这是 Explorer 显示的“Harald”。
  • 您能告诉我您的代码吗?您是如何更改帐户名的?
  • 没有代码。我使用控制面板 - 用户管理并在那里“更改自己的用户名”。这就是登录屏幕上显示的名称(即“Harald”)。帐户本身保持在“管理员”状态。
【解决方案3】:

@damienc88 您的链接将我引向解决方案:

    SelectQuery query = new SelectQuery("Win32_UserAccount", string.Format("Domain='{0}'", Environment.MachineName)); 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
    foreach (ManagementObject mObject in searcher.Get()) 
    { 
        Console.WriteLine((string)mObject["Name"] + "\t" + (string)mObject["FullName"]); 
    } 

“FullName”是我搜索过的属性。非常感谢。 ——哈拉尔德·皮特罗

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2012-06-09
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多