MODIFICA: gen 4,2016 - Aggiunto codice di esempio per la ricerca di annunci.
Cosa non funzionerà
Ricerca GAL tramite ResolveNames utilizza sempre partita prefisso-stringa per la risoluzione dei nomi ambigui (ARN). Sebbene la documentazione EWS non lo dica esplicitamente, la documentazione di Exchange ActiveSync. EWS ed Exchange ActiveSync sono solo protocolli; entrambi si basano su ARN sottostanti, quindi si è bloccati con la corrispondenza prefisso, indipendentemente dal fatto che si utilizzi il protocollo ActiveSync o EWS.
Ecco la citazione pertinente documentazione di Exchange ActiveSync (https://msdn.microsoft.com/en-us/library/ee159743%28v=exchg.80%29.aspx)
La stringa di query di testo che viene fornito al comando di ricerca viene utilizzato in un match prefix-stringa
.
cosa funzionerà
La cosa migliore da fare dipende dal vostro caso d'uso, ma qui ci sono alcune idee:
Ricerca Active Directory nel programma client (il programma che contiene il codice che avete mostrato nella tua domanda)
Imposta il tuo servizio per cercare il GAL. Il tuo programma client si collegherebbe sia a Exchange che al tuo servizio. Oppure il tuo servizio potrebbe proxy EWS, in modo che il programma client deve connettersi solo al tuo servizio.
In che modo è possibile ottenere i dati GAL?Un modo sarebbe quello di utilizzare EWS ResolveNames ripetutamente, per ottenere i dati GAL, 100 voci alla volta e memorizzare questi dati nel servizio. Prima di tutto, recupera tutti i "a", quindi tutti i "b", ecc. Naturalmente, ci possono essere più di 100 "a" nel GAL, quindi solo ottenere tutti i "a" potrebbe prendere più ricerche - costruisci la stringa di ricerca successiva, in base all'ultima voce restituita da ogni ricerca. Questo può essere lento e doloroso. Probabilmente vorrai memorizzare questi dati in un database e aggiornarlo periodicamente.
È inoltre possibile accedere a GAL tramite MAPI. È possibile utilizzare direttamente MAPI (https://msdn.microsoft.com/en-us/library/cc765775%28v=office.12%29.aspx) o tramite una libreria di supporto come Redemption (http://www.dimastr.com/redemption/home.htm). Sia che si utilizzi MAPI direttamente o tramite Redemption, sarà necessario installare Outlook (o Exchange) sul computer su cui è in esecuzione il codice. A causa di questa restrizione, potrebbe essere preferibile non utilizzare MAPI nel programma client, ma inserirlo in un servizio in esecuzione su alcuni server e fare in modo che il programma client si connetta a tale servizio.
codice degli annunci di esempio
Un altro codice di esempio risposta fornita per la ricerca di Active Directory. Sto aggiungendo un esempio di codice che potrebbe essere più adatto all'uso generico da parte di persone che potrebbero trovare questa domanda attraverso la ricerca. Rispetto agli altri di esempio, il codice qui sotto presenta i seguenti miglioramenti:
Se la stringa di ricerca contiene caratteri speciali (come parentesi), essi sono sfuggiti, in modo che la stringa di filtro costruito è valida.
Ricerca per samaccountname molti non sono sufficienti. Se "David Smith" ha nome account "dsmith", la ricerca di "David" da parte di samaccountname non lo troverà. Il mio esempio mostra come cercare per più campi e fornisce alcuni dei campi che si possono voler cercare.
L'avvio da una radice come "GC:" è più efficace rispetto al tentativo di creare una voce LDAP da Domain.GetComputerDomain().
Tutti i IDisposable
s devono essere smaltiti (di solito li utilizza in un costrutto 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();
}
}
}
}
la vostra ricerca di 'CONF-', ma affermando che 'JOE-CONF' non compare nel ritorno. Non penserei che sarebbe dato che il '-' è dopo il 'CONF', cosa succede se si usa 'CONF' senza '-'. – Ilnetd
quello era un errore di battitura. . Ho aggiornato la domanda – leora
Stai ancora cercando una soluzione? – rsteward