得到Windows用户的名字和姓氏
问题描述:
我正在处理一个应用程序,作为一个接口,要求提供用户名作为组件(第一,中,最后)。得到Windows用户的名字和姓氏
在AD中设置用户时,用户对话框具有文本框(第一,中间,最后),然后将它们组合到显示名称中。如果系统从域中断开
UserPrincipal userPrinciple = UserPrincipal.Current;
Name.GivenName = userPrinciple.GivenName;
Name.MiddleName = userPrinciple.MiddleName;
Name.FamilyName = userPrinciple.Surname;
现在不幸的是,UserPrincipal抛出一个异常:
我可以做类似下面的检索使用System.DirectoryServices.AccountManagement这些部件。在这种情况下,我会回到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用户对话框有一些不同。它似乎缺少用于提供(第一,中间,最后)名称的文本框,并且只有全名文本框。
答
从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>
感谢提示确定系统是否在域中。非常有用,但没有解决问题。 +1 – denver
然后我没有正确理解这个问题。当你说与域名断开连接时,这意味着什么?它从来不是域的一部分,或者它是域的一部分。 如果它不是域的一部分,则只剩下一个选项,即WMI。我试图给出这个答案。 –
问题在于如何获取名字和姓氏。 UserPrincipal在您处于域并连接时提供给您。其他方法只提供显示名称。 – denver