获取Windows用户的姓氏

时间:2016-06-13 21:00:51

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

我正在处理一个应用程序,该应用程序需要将用户的名称作为组件提供(第一个,中间的,最后一个)。

在AD中设置用户时,用户对话框中包含(first,middle,last)文本框,然后将这些文本框组合成显示名称。

我可以使用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用户对话框有一些差异。它似乎缺少提供(第一个,中间的,最后一个)名称的文本框,只有一个全名文本框。

1 个答案:

答案 0 :(得分:1)

Win32_ComputerSystem,您可以确定计算机是工作站还是成员服务器。获得此信息并且计算机位于Workstation后,您始终可以进行WMI调用以获取帐户详细信息,否则请调用AD / LDAP对象以获取信息。这只是一段代码,你必须为它提供结构

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>