Я пытаюсь показать в элементе управления 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;
}
Если я запускаю приложение на компьютере, являющемся контроллером домена, оно работает нормально: функция возвращает мне всех пользователей. Но если я запускаю его на другом ПК, я получаю исключение:
Specified domain does not exist or couldn't contact with it
Есть ли способ восстановить список пользователей с другого ПК?





Эта строка:
DirectoryContext dc = new DirectoryContext(DirectoryContextType.Domain, Environment.UserDomainName);
Сообщает ему подключиться к домену, в который вошел текущий пользователь. Вы вошли в систему как пользователь домена?
Может быть, проверить, чему равен Environment.UserDomainName, и убедиться, что это правильно.
Если это верно, то это может быть проблема с сетью - он не может разговаривать с доменом. Вам нужно подключиться к VPN?
Нет большой информации о OP относительно того, что компьютер находится в домене или когда он запускается под учетной записью домена. Этот ответ помогает проверить эти потенциальные проблемы :-)
Я заметил, что тестируемый мной компьютер - это еще один сервер с локальным пользователем. Как только смогу, попробую на рабочей станции и выложу результат. Спасибо :)
Вы можете просто указать доменное имя, а не пытаться вывести его от текущего пользователя.
Чтобы получить всех пользователей в домене Active Directory, вы можете использовать объект класса DirectorySearcher, чтобы запросить домен обо всех пользователях, доступных в этом домене.
Класс DirectorySearcher содержится в пространстве имен System.DirectoryServices и является классом для выполнения запросов к доменным службам Active Directory.
In this page is an example about how to do it:
... 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(); ...In DirectorySearcher, create a DirectorySearcher object which searches for all users in a domain.
search.Filter = "(&(objectClass=user)(objectCategory=person))"filters the search.The search filter syntax looks a bit complicated, but basically it filters the search results to only include users ->
"objectCategory=person"and"objectClass=user"- and excludes disabled user accounts by performing a bitwise AND of the userAccountControl flags and the "account disabled" flag.
Чтобы указать на локальный домен 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:
Запуск VPN не означает, что вы автоматически подключаетесь к домену. Пытались ли rou запустить исполняемый файл явно под пользователем домена (щелкните правой кнопкой мыши -> запустить от имени другого пользователя -> введите информацию о домене)?