抓取域用户的中文名

发布于 2020-06-02  366 次阅读


嗯,需要写一个需求管理工具。

Winform,免登陆

头疼,需要抓到User Name 公司电脑都是加域,

所以登录的时候会显示中文名

于是乎,我试着抓取本机的用户名,然而出来的是账户名,也就是登录的英文名

想要的效果如下:

百思不得其解,然后看到一段获取域用户资料的代码,似乎有了点头绪

添加程序集引用 System.DirectoryServices.AccountManagement

IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
string hostName = ipGlobalProperties.HostName;
string domainName = ipGlobalProperties.DomainName;
//获取指定域中的用户的查找对象
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, domainName);
UserPrincipal userPrincipal = new UserPrincipal(principalContext);
PrincipalSearcher principalSearcher = new PrincipalSearcher(userPrincipal);

//查找域中用户及其信息。
StringBuilder sb = new StringBuilder();
foreach (UserPrincipal userPrincipalSearchResult in principalSearcher.FindAll())
{
sb.AppendLine(string.Format("UPN:{0}", userPrincipalSearchResult.UserPrincipalName));
sb.AppendLine(string.Format("姓氏Last Name:{0}", userPrincipalSearchResult.Surname));
sb.AppendLine(string.Format("中间名:{0}", userPrincipalSearchResult.MiddleName));
sb.AppendLine(string.Format("Given Name/First Name名:{0}", userPrincipalSearchResult.GivenName));
sb.AppendLine(string.Format("名称:{0}", userPrincipalSearchResult.Name));
sb.AppendLine(string.Format("上次登录时间:{0}", userPrincipalSearchResult.LastLogon));
}
userPrincipal.Dispose();
Console.WriteLine(sb.ToString());

查找域中计算机及其信息,类似于查找用户。首先使用域上下文对象实例化一个计算机对象,然后使用该对象实例化一个查找对象。

查找的结果,即为计算机对象,循环获取信息即可。

ComputerPrincipal computerPrincipal = new ComputerPrincipal(principalContext);
principalSearcher = new PrincipalSearcher(computerPrincipal);
//
foreach (ComputerPrincipal computerPrincipalSearchResult in principalSearcher.FindAll())
{
    sb.AppendLine(string.Format("UPN:{0}", computerPrincipalSearchResult.UserPrincipalName));
    sb.AppendLine(string.Format("描述:{0}", computerPrincipalSearchResult.Description));
    sb.AppendLine(string.Format("是否启用:{0}", computerPrincipalSearchResult.Enabled));
    sb.AppendLine(string.Format("SAM账号名:{0}", computerPrincipalSearchResult.SamAccountName));
    sb.AppendLine(string.Format("名称:{0}", computerPrincipalSearchResult.Name));
    sb.AppendLine(string.Format("上次登录时间:{0}", computerPrincipalSearchResult.LastLogon));
}
computerPrincipal.Dispose();
Console.WriteLine(sb.ToString());

然后又去翻阅https://docs.microsoft.com/zh-tw/dotnet/api/system.directoryservices.accountmanagement.userprincipal?view=netframework-4.5.2

嗯哼,稍微改了下

IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();  //初始化IPGlobalProperties
//string hostName = ipGlobalProperties.HostName;   //獲取電腦名稱,EX: UK11_B3PC56
string domainName = ipGlobalProperties.DomainName;   //獲取網域名,EX: flexium.com.cn or flexium.com.tw
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, domainName);  //使用指定的內容型別、名稱和容器,初始化 PrincipalContext 類別的新執行個體
UserPrincipal userPrincipal = new UserPrincipal(principalContext);  //初始化 UserPrincipal
//將本機用戶名和網域合併為郵箱地址, ex : maosheng_zhou@flexium.com.cn 賦值給UserPrincipalName
userPrincipal.UserPrincipalName = System.Environment.UserName+"@" + domainName;  
PrincipalSearcher principalSearcher = new PrincipalSearcher(userPrincipal);  //初始化PrincipalSearcher搜尋模式
StringBuilder sb = new StringBuilder();
foreach (UserPrincipal userPrincipalSearchResult in principalSearcher.FindAll())   //在principalSearcher的結果里搜索 UserPrincipal值等於UserPrincipalName的條目
{
    sb.AppendLine(string.Format("{0}", userPrincipalSearchResult.Name));  //只顯示Name值
}
userPrincipal.Dispose();  //處置 userPrincipal 物件目前的執行個體
label4.Text = sb.ToString().Trim();  //將Name值在label中顯示

然后就完美的出来了~

此文仅记录,供后来者参考。


国家一级保护废物