【问题标题】:get windows user first and last name获取windows用户的名字和姓氏
【发布时间】:2016-06-13 21:00:50
【问题描述】:

我正在开发一个应用程序,它作为一个界面,要求将用户名作为组件提供(第一名、中间名、最后一名)。

在 AD 中设置用户时,用户对话框有(第一个、中间、最后一个)的文本框,然后将它们组合成一个显示名称。

我可以使用 System.DirectoryServices.AccountManagement 通过执行以下操作来检索这些部分:

UserPrincipal userPrinciple = UserPrincipal.Current;
Name.GivenName = userPrinciple.GivenName;
Name.MiddleName = userPrinciple.MiddleName;
Name.FamilyName = userPrinciple.Surname;

现在不幸的是,如果系统与域断开连接,UserPrincipal 会引发异常。在那种情况下,我会退回到 GetUserNameEx。

[DllImport("secur32.dll", CharSet = CharSet.Auto)]
public static extern bool GetUserNameEx(int nameFormat, StringBuilder userName,  ref uint userNameSize);

StringBuilder fullname = new StringBuilder(1024);
uint size = (uint)fullname.Capacity;
GetUserNameEx(3, fullname, ref size)     

在这里,我只能自生自灭,将全名分解成其组成部分。有谁知道当系统与域断开连接时获取组件的方法?

同样,如果系统不是域的一部分并且正在使用本地帐户,我会求助于 WMI。

string UserName = Environment.UserName;
string query = "SELECT * FROM Win32_UserAccount Where Name=\"" + UserName + "\"";
ManagementScope mgmtScope = new ManagementScope("\\\\.\\Root\\CIMv2");
ObjectQuery oQuery = new ObjectQuery(query);
ManagementObjectSearcher mgmtSearch = new ManagementObjectSearcher(mgmtScope, oQuery);
ManagementObjectCollection objCollection = mgmtSearch.Get();
foreach (ManagementObject mgmtObject in objCollection)
{
    fullName = (string)mgmtObject["FullName"];
}

我又一次只能自己打破这个名字了。当系统在使用本地帐户的工作组中时,有人知道获取组件的方法吗?

当我查看本地用户管理对话框时,它似乎与 AD 用户对话框有些不同。它似乎缺少用于提供(名字、中间名、姓氏)名称的文本框,并且只有一个全名文本框。

【问题讨论】:

    标签: c# active-directory wmi wmi-query


    【解决方案1】:

    通过Win32_ComputerSystem,您可以确定机器是工作站还是成员服务器。一旦您获得此信息并且机器在 Workstation 中,您可以随时拨打WMI 以获取帐户详细信息,否则请调用 AD/LDAP 对象以获取信息。这只是一段 sn-p 代码,你必须为其提供结构

    query = new ObjectQuery(@"Select * from Win32_ComputerSystem");
                            searcher = new ManagementObjectSearcher(scope, query); searcher.Options.Timeout = new TimeSpan(0, 0, wbemConnectFlagUseMaxWait);
                            ManagementObjectCollection qWin32_ComputerSystem = searcher.Get();
                            foreach (ManagementObject item in qWin32_ComputerSystem)
                            {
                                windows_domain_role = item["DomainRole"].ToString();
                                if (windows_domain_role == "0") { windows_domain_role = "Standalone Workstation"; }
                                if (windows_domain_role == "1") { windows_domain_role = "Workstation"; }
                                if (windows_domain_role == "2") { windows_domain_role = "Standalone Server"; }
                                if (windows_domain_role == "3") { windows_domain_role = "Member Server"; }
                                if (windows_domain_role == "4") { windows_domain_role = "Backup Domain Controller"; }
                                if (windows_domain_role == "5") { windows_domain_role = "Primary Domain Controller"; }
                               }
    

    在从 Win32_UserAccount 获取信息时,将查询 w.r.t 发送到域,以便您可以更好地控制信息。

    Select * from Win32_UserAccount Where Domain = <machine name>
    

    【讨论】:

    • 感谢您提供有关确定系统是否在域中的提示。非常有用,但没有解决问题。 +1
    • 然后我没有正确理解这个问题。当您说与域断开连接时,这是什么意思?它从来不是域的一部分,或者它是域的一部分。如果它不是域的一部分,则只剩下一个选项,即 WMI。我试图给出这个答案。
    • 问题是如何获取名字和姓氏。当您在域中并连接时,UserPrincipal 会为您提供这些。其他方法只提供显示名称。
    • 与域断开连接意味着它是域的一部分,但与网络断开连接。换句话说,它无法访问 AD 服务器并且正在使用缓存的凭据。
    猜你喜欢
    • 2019-01-06
    • 2016-08-01
    • 1970-01-01
    • 2019-01-27
    • 2021-01-16
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多