【发布时间】: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