2016-06-13 25 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