我试图在ComboBox
控件中显示来自网络上Active Directory的用户。为此,我有下一个功能:
public static List<Usuario> MostrarUsuariosDominio()
{
List<Usuario> rst = new List<Usuario>();
try
{
DirectoryContext dc = new DirectoryContext(DirectoryContextType.Domain, Environment.UserDomainName);
Domain domain = Domain.GetDomain(dc);
DirectoryEntry de = domain.GetDirectoryEntry();
DirectorySearcher adSearcher = new DirectorySearcher(de);
adSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
adSearcher.PropertiesToLoad.Add("samaccountname");
SearchResult result;
SearchResultCollection iResult = adSearcher.FindAll();
Usuario item;
if (iResult != null)
{
for (int counter = 0; counter < iResult.Count; counter++)
{
result = iResult[counter];
if (result.Properties.Contains("samaccountname"))
{
item = new Usuario();
item.Nombre = (String)result.Properties["samaccountname"][0];
rst.Add(item);
}
}
}
adSearcher.Dispose();
}
catch (Exception ex)
{
Usuario item = new Usuario();
item.Nombre = "No se pudo recuperar la lista de usuarios";
rst.Add(item);
}
return rst;
}
如果我在PC中运行应用程序的域控制器,它可以正常工作:该函数将返回给我所有用户。但如果我在另一台PC上运行它,我会得到例外:
指定的域名不存在或无法与其联系
有没有办法从另一台PC恢复用户列表?
答案 0 :(得分:3)
这一行:
DirectoryContext dc = new DirectoryContext(DirectoryContextType.Domain, Environment.UserDomainName);
告诉它连接到当前用户登录的域。您是以域用户身份登录的吗?
也许检查Environment.UserDomainName
等于什么,看看它是否正确。
如果它是对的,则可能是网络问题 - 它无法与域通信。你需要连接到VPN吗?
答案 1 :(得分:0)
要获取Active Directory域中的所有用户,您可以使用DirectorySearcher
类对象查询该域中有关该域中所有可用用户的信息。
类DirectorySearcher
包含在System.DirectoryServices
命名空间中,是一个用于对Active Directory域服务执行查询的类。
在此page中有一个关于如何操作的示例:
... string DomainPath = "LDAP://DC=xxxx,DC=com" DirectoryEntry searchRoot = new DirectoryEntry(DomainPath); DirectorySearcher search = new DirectorySearcher(searchRoot); search.Filter = "(&(objectClass=user)(objectCategory=person))"; search.PropertiesToLoad.Add("samaccountname"); search.PropertiesToLoad.Add("mail"); search.PropertiesToLoad.Add("usergroup"); search.PropertiesToLoad.Add("displayname");//first name SearchResultCollection resultCol = search.FindAll(); ...
在DirectorySearcher中,创建一个搜索的DirectorySearcher对象 对于域中的所有用户。
search.Filter = "(&(objectClass=user)(objectCategory=person))"
过滤搜索。搜索过滤器语法看起来有点复杂,但基本上就是这样 将搜索结果过滤为仅包含用户 - &gt;
"objectCategory=person"
和"objectClass=user"
- 并且不包括在内 用户帐户通过执行userAccountControl的按位AND 标志和“帐户禁用”标志。
要指向本地Active Directory域,您可以使用此功能:
DirectoryEntry searchRoot = new DirectoryEntry("WinNT://" + Environment.MachineName);
您可以将此示例与使用foreach
的代码结合使用,而不是使用页面示例中的for
循环:
foreach (SearchResult result in resultCol)
{
yourComboBox.Items.Add(result.Properties["displayname"]);
}
我从Microsoft MSDN和codeproject.com网站留下了一些页面: