2009-09-10 4 views
7

Ho il seguente codice (C#):LDAP Directory Iscrizione nel Net - che non funziona con OU = Users

(Tweaked da: http://www.eggheadcafe.com/conversation.aspx?messageid=31766061&threadid=31766050)

DirectorySearcher dseSearcher = new DirectorySearcher(); 

string rootDSE = dseSearcher.SearchRoot.Path; 
DirectoryEntry rootDE = new DirectoryEntry(rootDSE); 

string userDSE = rootDSE.Insert(7, "OU=Users,"); 
DirectoryEntry userDE = new DirectoryEntry(userDSE); 

Il rootDSE viene creata correttamente, tuttavia, l'utente userDSE non è utilizzabile e lancia l'eccezione "Non esiste tale oggetto sul server" se cerco di usarlo.

Le stringhe LDAP sono i seguenti:

Root: LDAP: // controller = la società controller = locale

Utente: LDAP: // OU = Utenti, DC = la società controller = locale

sono in esecuzione su Vista come Admin, ma hanno bisogno di questo per lavorare su XP (Admin) pure.

Sono nuovo di LDAP e Gestione directory, quindi sono inciampare nel buio qui. qualche idea? Inoltre, anche gli articoli da collegare che potrebbero darmi un'idea di come tutto funzionerebbe sarebbe apprezzato.

risposta

11

La prima cosa che vorrei provare come test è quello di codificare il tuo percorso desiderato quando si crea una voce di directory in questo modo:

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=company,DC=local"); 

Questo vi dirà piuttosto veloce se questo è un percorso effettivo in Active directory. Non so come sia il tuo annuncio, quindi non posso dirti se questo è un percorso valido o meno. Sotto il plug-in MMC Utenti e computer di Active Directory, se questo percorso è corretto, è necessario disporre del dominio principale e di una cartella OU nella radice denominata Utenti.

percorsi sono generate a ritroso nel dC, quindi se il vostro cartella Utenti è sotto un'altra unità organizzativa la radice di quanto lo sarebbe

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,OU=<first OU folder>,DC=company,DC=local"); 

Così il vostro schema di AD sarà simile:

Root 
| 
--><first OU folder> 
    | 
    -->Users 

A grande articolo su come gestire Active Directory in .NET:

HowTo: Do (Almost) Everything in Active Directory via C#

Si potrebbe anche voler ricercare le System.DirectoryServices, System.DirectoryServices.ActiveDirectory, e gli spazi dei nomi System.DirectoryServices.AccountManagement forniti nel 3,5 Net Framework. Credo che System.DirectoryServices e gli spazi dei nomi ActiveDirctory fossero disponibili in .Net 1.1 e AccountManagement è stato introdotto in .Net 3.5.

Microsoft Documentation - A lot of good links on how to use the namespace

Addendum:

effettivamente trovare un utente in AD si vuole effettuare le seguenti operazioni:

DirectoryEntry de = new DirectoryEntry(); 
de.Path = "LDAP://DC=company,DC=local"; 
de.AuthenticationType = AuthenticationTypes.Secure; 

DirectorySearcher deSearch = new DirectorySearcher(); 

deSearch.SearchRoot = de; 
deSearch.Filter = "(&(objectClass=user) (cn=" + username + "))"; 

SearchResult result = deSearch.FindOne(); 

if (result != null) 
{ 
    DirectoryEntry deUser = new DirectoryEntry(result.Path); 
    ... do what ever you need to the deUser 
    deUser.Close(); 
} 
+0

Hmmm, grazie per i collegamenti, più utili. Sono limitato a .Net 2.0 per questo progetto. Inoltre, sto cercando di creare un utente locale su qualsiasi macchina su cui è installata la mia applicazione, quindi il gruppo Utenti potrebbe variare. C'è un modo semplice per ottenere il gruppo standard degli utenti? Cheers –

+0

Inoltre, da dove ottengo l'ID utente? Sembra essere casualmente gettato nel codice di esempio nel link che ho fornito, e non so cosa dovrebbe essere. –

+2

Se si sta cercando di creare un utente locale, non si utilizzerà Active Directory, ma sarà necessario utilizzare le API Win32, che sono un po 'più complicate. Vedi http://www.codeproject.com/KB/cs/groupandmembers.aspx Come per il secondo commento, OU = Utenti non è un ID utente, OU è breve o Unità organizzativa, se si sta cercando di trovare un utente si desidera utilizzare CN = , CN è l'abbreviazione di Common Name e quello che è necessario utilizzare per filtrare gli utenti. Vedi http://stackoverflow.com/questions/825237/how-can-you-find-a-user-in-active-directory-from-c/825347#825347 su come interrogare gli utenti in AD. –

6

Questo può sembrare sciocco e stupido, ma la messa a punto dell'albero default in Active Directory non è OU = Utenti, dc = dominio, dc = com, ma piuttosto cn = Utenti, d c = dominio, dc = com (notare il CN = non l'OU = per gli utenti.

Sembra stupido dal momento che un oggetto contenitore (objectClass di cn) in AD non può essere un destinatario del criterio di gruppo, ma per motivi che non capisco, questo è l'impostazione predefinita. (In realtà capisco, è perché il contenimento di un CN è più simile a un dominio NT che OU)

Ottiene quasi tutti quelli che incontro, la prima volta che provano a LDAP bind/auth in AD.

+0

Grazie per il CN = Utenti, OU = gli utenti non funzionavano e stavo trovando prezioso piccolo aiuto – wruckie

2

Come geoffc ha menzionato correttamente, in "Active Directory" gli "Utenti" sotto il dominio sono un oggetto contenitore piuttosto che un oggetto unità organizzativa. Ciò comporta un percorso LDAP completamente diverso, motivo per cui viene visualizzato il messaggio di errore.

provare il seguente codice e post se si risolve il problema:

// Replace the "company" and "com" with actual domain values... 
DirectoryEntry de = new DirectoryEntry("LDAP://CN=Users,DC=company,DC=com"); 
DirectorySearcher deSearch = new DirectorySearcher(); 
deSearch.SearchRoot = de; 

// Set your other search params here 
Problemi correlati