2009-09-10 10 views
7

he el siguiente código (C#):LDAP entrada de directorio en .Net - No trabajar con OU = Usuarios

(Ajustado desde: 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); 

El rootDSE se crea correctamente, sin embargo, el usuario userDSE no se puede usar y arroja la excepción "No hay tal objeto en el servidor" si intento usarlo.

Las cadenas LDAP son los siguientes:

Raíz: LDAP: // DC = empresa DC = local

usuario: LDAP: // OU = Usuarios DC = empresa DC = local

Me estoy ejecutando en Vista como administrador, pero también necesito esto para trabajar en XP (Admin).

Soy nuevo en LDAP y administración de directorios, así que estoy dando tumbos en la oscuridad aquí. ¿Alguna idea? Además, cualquier artículo para vincular que me pueda dar una idea de cómo funciona todo será apreciado.

Respuesta

11

Lo primero que me gustaría tratar como una prueba es para codificar el camino deseado cuando se crea una entrada de directorio de esta manera:

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

Esto le dirá bastante rápido si se trata de una ruta real en su Active Directorio. No sé cómo es tu AD, así que no puedo decirte si esta es una ruta válida o no. Debajo de su plugin MMC Usuarios y equipos de Active Directory, si esta ruta es correcta, debe tener su dominio raíz y una carpeta OU debajo de la raíz denominada Usuarios.

Caminos se generan hacia atrás en el año, por lo que si su carpeta de usuarios es bajo otra unidad organizativa de la raíz de lo que sería

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

Así que su esquema de AD se vería así:

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

Un gran artículo sobre cómo administrar Active Directory en .NET:

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

Es posible que también desee investigar los System.DirectoryServices, System.DirectoryServices.ActiveDirectory y los espacios de nombres System.DirectoryServices.AccountManagement proporcionados en .Net 3.5 Framework. Creo que System.DirectoryServices, y los espacios de nombres de ActiveDirctory estaban disponibles en .Net 1.1, y AccountManagement se introdujo en .Net 3.5.

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

Adición:

en realidad encontrar un usuario en AD tendrá que hacer lo siguiente:

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, gracias por los enlaces, más útiles. Estoy limitado a .Net 2.0 para este proyecto. Además, estoy buscando para crear un usuario local en cualquier máquina que mi aplicación se instala en, por lo que el grupo de usuarios puede variar. ¿Hay alguna manera fácil de obtener el grupo de usuarios estándar? Saludos –

+0

También - ¿Dónde consigo la identificación de usuario de? Parece ser lanzado al azar en el código de muestra en el enlace que proporcioné, y no sé lo que debería ser. –

+2

Si está buscando crear un usuario local, entonces no usará Active Directory; en su lugar, deberá usar las API de Win32, que son un poco más complicadas. Ver http://www.codeproject.com/KB/cs/groupandmembers.aspx En cuanto a su segundo comentario, ou = usuarios no es un ID de usuario, OU es la unidad organizativa o corto, si usted está tratando de encontrar un Usuario desea utilizar CN = , CN es la abreviatura de Nombre común y lo que debe usar para filtrar usuarios. Consulte http://stackoverflow.com/questions/825237/how-can-you-find-a-user-in-active-directory-from-c/825347#825347 sobre cómo consultar a los usuarios en AD. –

6

Esto puede parecer tonto y estúpido, pero la configuración árbol por defecto en Active Directory no es OU = Usuarios, dc = dominio, dc = com sino más bien cn = Usuarios, d c = dominio, dc = com (Tenga en cuenta el CN ​​= no el OU = para los usuarios.

Parece estúpido ya que un objeto contenedor (objectClass de la CN) en la EA no puede ser un receptor de la política del grupo, pero por razones que no entiendo, que es el valor predeterminado. (en realidad lo entiendo, es porque la contención para un CN es más similar a un dominio NT que OU)

Obtiene a casi todos los que conozco, la primera vez que intentan vincular LDAP/auth a AD.

+0

Gracias por el CN ​​= usuarios, OU = usuarios no funcionaba y encontré muy poca ayuda – wruckie

2

Como se mencionó geoffc correctamente, en Active Directory, los "Usuarios" bajo el dominio es un objeto contenedor en lugar de objeto de unidad organizativa. Esto da como resultado una ruta de LDAP totalmente diferente y es por eso que aparece el mensaje de error.

Prueba el siguiente código y publica si se soluciona el 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 
Cuestiones relacionadas