EDYTOWANIE: Jan 4,2016 - Dodano przykładowy kod do wyszukiwania w AD.
Co nie zadziała
Przeszukiwanie GAL poprzez ResolveNames zawsze wykorzystuje prefiks-ciąg pasuje do niejednoznacznych Name Resolution (ARN). Chociaż dokumentacja EWS tego nie mówi wprost, to ma to miejsce w dokumentacji programu Exchange ActiveSync. EWS i Exchange ActiveSync to tylko protokoły; oba opierają się na ARN pod spodem, więc utknąłeś z dopasowaniem prefiksu, niezależnie od tego, czy używasz protokołu ActiveSync czy EWS.
Oto odpowiedni cytat z Exchange ActiveSync dokumentacji (https://msdn.microsoft.com/en-us/library/ee159743%28v=exchg.80%29.aspx)
ciągu kwerendy tekstowej, która jest dostarczana do polecenia Search służy w meczu prefix-strunowej
.
Co będzie działać
Najlepszą rzeczą do zrobienia, zależy od przypadku użycia, ale oto kilka pomysłów:
Szukaj Active Directory w programie klienta (program, który zawiera kod, który pokazał na twoje pytanie)
Skonfiguruj własną usługę, aby przeszukać GAL. Twój program klienta łączyłby się zarówno z Exchange, jak iz twoją usługą. Lub Twoja usługa może pełnić rolę serwera proxy EWS, aby program klienta musiał łączyć się tylko z Twoją usługą.
W jaki sposób można uzyskać dostęp do danych GAL?Jednym ze sposobów byłoby wielokrotne używanie EWS ResolveNames, aby uzyskać dane GAL, 100 wpisów jednocześnie i buforować te dane w usłudze. Najpierw pobierz wszystkie "a", potem wszystkie "b" itp. Oczywiście w GAL może być ponad 100 "a", więc po prostu uzyskanie wszystkich "a" może zająć wiele wyszukiwań - skonstruowałbyś następny ciąg wyszukiwania, oparty na ostatnim wpisie zwróconym z każdego wyszukiwania. To może być powolne i bolesne. Prawdopodobnie będziesz chciał buforować te dane w bazie danych i odświeżać je okresowo.
Możesz również dostać się do GAL przez MAPI. Możesz użyć MAPI bezpośrednio (https://msdn.microsoft.com/en-us/library/cc765775%28v=office.12%29.aspx) lub przez bibliotekę pomocniczą, taką jak Redemption (http://www.dimastr.com/redemption/home.htm). Niezależnie od tego, czy korzystasz z MAPI bezpośrednio, czy poprzez Odkupienie, musisz zainstalować program Outlook (lub Exchange) na komputerze, na którym działa twój kod. Z powodu tego ograniczenia najlepiej nie używać MAPI w programie klienckim, ale trzymać go w usłudze działającej na jakimś serwerze i mieć połączenie programu klienta z tą usługą.
Kod AD Próbka
Inna odpowiedź warunkiem przykładowy kod do wyszukiwania Active Directory. Dodaję próbkę kodu, która może być lepiej dostosowana do ogólnego użytku przez osoby, które mogą znaleźć to pytanie poprzez wyszukiwanie. W porównaniu do drugiej próbki, kod poniżej zawiera następujące ulepszenia:
Jeśli ciąg wyszukiwania zawiera żadnych znaków specjalnych (jak nawiasie), są one uciekły, tak skonstruowany, że filtr jest prawidłowy ciąg.
Wyszukiwanie według samego samaccountname wiele nie wystarczy. Jeśli "Dawid Smith" ma nazwę konta "dsmith", wyszukiwanie "David" przez samaccountname nie pozwoli mu go znaleźć. Mój przykład pokazuje, jak wyszukiwać według większej liczby pól i podaje niektóre z pól, które można przeszukiwać.
Uruchamianie z poziomu głównego takiego jak "GC:" jest bardziej niezawodne niż próba skonstruowania wpisu LDAP z Domain.GetComputerDomain().
Wszystkie należy usunąć (zwykle za pomocą ich w konstrukcji using
).
// Search Active Directory users.
public static IEnumerable<DirectoryEntry> SearchADUsers(string search) {
// Escape special characters in the search string.
string escapedSearch = search.Replace("*", "\\2a").Replace("(", "\\28")
.Replace(")", "\\29").Replace("/", "\\2f").Replace("\\", "\\5c");
// Find entries where search string appears in ANY of the following fields
// (you can add or remove fields to suit your needs).
// The '|' characters near the start of the expression means "any".
string searchPropertiesExpression = string.Format(
"(|(sn=*{0}*)(givenName=*{0}*)(cn=*{0}*)(dn=*{0}*)(samaccountname=*{0}*))",
escapedSearch);
// Only want users
string filter = "(&(objectCategory=Person)(" + searchPropertiesExpression + "))";
using (DirectoryEntry gc = new DirectoryEntry("GC:")) {
foreach (DirectoryEntry root in gc.Children) {
try {
using (DirectorySearcher s = new DirectorySearcher(root, filter)) {
s.ReferralChasing = ReferralChasingOption.All;
SearchResultCollection results = s.FindAll();
foreach (SearchResult result in results) {
using (DirectoryEntry de = result.GetDirectoryEntry()) {
yield return de;
}
}
}
} finally {
root.Dispose();
}
}
}
}
szukasz „CONF-”, ale stwierdzając, że „Joe-CONF” nie pojawi się w zamian. Nie sądzę, że oznaczałoby to, że "-" jest po "CONF", co się stanie, jeśli po prostu użyjesz "CONF" bez "-". – Ilnetd
to był literówka. . Mam zaktualizowane pytanie – leora
Nadal szukasz rozwiązania? – rsteward