Pregunta

Ok, así que estoy tratando de extraer a un usuario de Active Directory en un objeto DirectoryUser y si lo escribo así, funciona bien:

DirectoryEntry user = new DirectoryEntry(@"LDAP://CN=Name, OU=Department, OU=Group, DC=Domain1, DC=Domain2");
user.Properties["thumbnailPhoto"].Clear();

Pero necesito que los valores puedan cambiarse, así que probé una cadena formateada:

string ldap = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", cn, group, ou, domain1, domain2);
DirectoryEntry user = new DirectoryEntry(ldap);
user.Properties["thumbnailPhoto"].Clear();

Pero esto causa un error "No hay tal objeto en el servidor"

El constructor toma una cadena y paso en los mismos valores exactos que estaba usando cuando lo escribí literalmente, ¿por qué funciona de una manera y no la otra?

EDITAR: Solo quería agregar que revisé dos veces de varias maneras diferentes para verificar que la cadena construida salía idéntica a la cadena codificada y lo es. Corrí a través del depurador y verifiqué al usuario. Valor para verificar que las cadenas se almacenen exactamente igual. ¡Todo hasta ahora es idéntico, pero uno funciona y el otro no!

ACTUALIZACIÓN: Noté que si tengo código duro directamente a una variable de cadena:

string ldap = @"Jeremy Stafford", "IT", "QGT", "QGT", "Local";
DirectoryEntry user = new DirectoryEntry(ldap);

Esto funciona bien. Esto me lleva a creer que puede haber un problema con el "tipo" de cadena. Tal vez si pudiera convertir la cadena construida nuevamente en una cadena primitiva (o más bien un tipo de valor versus el tipo de referencia), ¿funcionaría? Pero no tengo idea de cómo hacer eso. ¿Algunas ideas?

Actualización: ejecuté una prueba semántica. Aquí está el código que usé:

string ldapFormatted = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", cn, group, ou, domain1, domain2);                
                var ldapHardCoded = @"LDAP://CN=Jeremy Stafford, OU=IT, OU=QGT, DC=QGT, DC=Local";
                string message;

                if (ldapFormatted.Equals(ldapHardCoded))
                {
                    message = "They're the same value\n";
                }
                else
                {
                    message = "Strings are not the same value\n";
                }

                if (ldapFormatted.GetType() == ldapHardCoded.GetType())
                {
                   message += "They are the same type";
                }
                else
                {
                    message += "They are not the same type";
                }
                message += "\n\n" + ldapFormatted + "\n" + ldapHardCoded;
                MessageBox.Show(message);

Y aquí fue el resultado:

enter image description here

¿Fue útil?

Solución

Probé su código y llené las variables de formato y funciona para mí, como puede ver en la captura de pantalla.

  string cn = "Jeremy Stafford";
  String group = "IT";
  string ou = "QGT";
  String domain1 = "QGT";
  string domain2 = "Local";
  string ldapFormatted = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", cn, group, ou, domain1, domain2);

  var ldapHardCoded = @"LDAP://CN=Jeremy Stafford, OU=IT, OU=QGT, DC=QGT, DC=Local";
  string message;

  if (ldapFormatted.Equals(ldapHardCoded))
  {
    message = "They're the same value\n";
  }
  else
  {
    message = "Strings are not the same value\n";
  }

  if (ldapFormatted.GetType() == ldapHardCoded.GetType())
  {
    message += "They are the same type";
  }
  else
  {
    message += "They are not the same type";
  }
  message += "\n\n" + ldapFormatted + "\n" + ldapHardCoded;
  MessageBox.Show(message);

Message

Realmente debería verificar qué hay en sus variables de entrada. Tal vez tengas algunos caracteres invisibles. Convierta sus variables de entrada en matrices de bytes e imprima la matriz para obtener más información sobre lo que tiene allí.

Otros consejos

Creo que algo está mal con una cadena codificada, ya que si copia valores codificados a las variables cn, group, ... tienes prueba de trabajo. Entonces, comparta un código que inicializa una variables cn, group, ou, domain1, domain2.

El código de prueba a continuación funciona bien.

 string cn = "Jeremy Stafford";
 string group = "IT";
 string ou = "QGT";
 string domain1 = "QGT";
 string domain2 = "Local";

 string ldap = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", 
                             cn, group, ou, domain1, domain2);    
 string ldapFormatted = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", 
                                      cn, group, ou, domain1, domain2);                
 var ldapHardCoded = @"LDAP://CN=Jeremy Stafford, OU=IT, OU=QGT, DC=QGT, DC=Local";

 bool bothTheSame = ldapFormatted.Equals(ldapHardCoded) 
                    && 
                    ldapFormatted.GetType() == ldapHardCoded.GetType();

Hmm, ¿por qué no intentas codificar los valores en String.Format? Si eso funciona, tienes algo mal con tus variables.

string ldap = string.Format("LDAP://CN={0}, OU={1}, OU={2}, DC={3}, DC={4}", "Name", "Department", "Group", "Domain1", "Domain2");

Aparte de eso, no creo por qué no funcionaría con la codificación dura y sin, ambos son cuerdas, después de todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top