2016-06-13 68 views
0

我正在处理一个应用程序,作为一个接口,要求提供用户名作为组件(第一,中,最后)。得到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用户对话框有一些不同。它似乎缺少用于提供(第一,中间,最后)名称的文本框,并且只有全名文本框。

回答

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> 
+0

感谢提示确定系统是否在域中。非常有用,但没有解决问题。 +1 – denver

+0

然后我没有正确理解这个问题。当你说与域名断开连接时,这意味着什么?它从来不是域的一部分,或者它是域的一部分。 如果它不是域的一部分,则只剩下一个选项,即WMI。我试图给出这个答案。 –

+0

问题在于如何获取名字和姓氏。 UserPrincipal在您处于域并连接时提供给您。其他方法只提供显示名称。 – denver