Строка DirectoryEntry, работающая как литерал, но не как отформатированная строка? - PullRequest
0 голосов
/ 21 февраля 2012

Хорошо, поэтому я пытаюсь вытащить пользователя из активной директории в объект DirectoryUser, и если я наберу его так, он работает нормально:

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

Но мне нужны значения, чтобы иметь возможностьменялись, поэтому я попытался отформатировать строку:

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();

Но это вызывает ошибку «На сервере такого объекта нет»

Конструктор принимает строку, и я передаюте же самые точные значения, которые я использовал, когда писал буквально, почему он работает в одну сторону, а не в другую?!

РЕДАКТИРОВАТЬ: Я просто хотел добавить, что я дважды проверил несколько разных способов, чтобы убедиться, чтовстроенная строка получалась идентичной жестко закодированной строке, и это так.Я запустил отладчик и проверил значение user.path, чтобы убедиться, что строки хранятся точно так же.Пока все идентично, но одно работает, а другое нет!

ОБНОВЛЕНИЕ: Я заметил, что если я жестко кодирую непосредственно в строковую переменную:

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

Это работает просто отлично,Это приводит меня к мысли, что может быть проблема со строкой «type».Может быть, если бы я мог преобразовать построенную строку обратно в примитивную строку (или, скорее, тип значения по сравнению с ссылочным типом), это сработало бы?Но я понятия не имею, как это сделать.Есть идеи?

ОБНОВЛЕНИЕ: Я провел семантический тест.Вот код, который я использовал:

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);

И вот результат:

enter image description here

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Я попробовал ваш код и заполнил переменные формата, и он работает для меня, как вы можете видеть на скриншоте.

  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

Вы должны действительно проверить, что в вашемвходные переменные.Может быть, у вас есть некоторые невидимые символы в нем.Преобразуйте свои входные переменные в байтовые массивы и распечатайте массив, чтобы получить более полное представление о том, что у вас там есть.

1 голос
/ 21 февраля 2012

Я считаю, что что-то не так с жестко закодированной строкой, поскольку, если вы копируете жестко закодированные значения в переменные cn, group, ..., вы получите рабочий тест. Поэтому, пожалуйста, поделитесь кодом, который инициализирует переменные cn, group, ou, domain1, domain2.

Тестовый код ниже работает нормально.

 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();
0 голосов
/ 21 февраля 2012

хмм, почему бы вам не попробовать жестко кодировать значения в string.format, если это работает, у вас что-то не так с вашими переменными.

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

Кроме этого, я не думаю, почему это не сработало бы с жестким кодированием и без, они оба, в конце концов, строки

...