Как правильно установить/получить свойство DepartmentNumber в Active Directory с помощью C#?

Я пытался прочитать и установить свойство departmentNumber для объекта DirectoryEntry с помощью C#, но у меня всегда возникает проблема, связанная с тем, что с помощью ADSI Edit я не вижу ничего в этом запись была изменена.

Подходы, которые я пробовал до сих пор, включают:

directoryEntry.Properties["departmentNumber"].Value = new object[]{ "SomeContent" };

а также

directoryEntry.InvokeSet("departmentNumber", new object[]{ "SomeContent" };

а также

directoryEntry.Invoke("PutEx", new object[]{ 2, "departmentNumber", new object[]{"SomeContent"}});

а также

directoryEntry.Invoke("Put", new object[]{ "departmentNumber", "SomeContent" });

Обновить Все вышеперечисленное, а затем directoryEntry.CommitChanges();.

Что бы я ни пытался, я получаю (с некоторыми из приведенных выше примеров) результаты с точки зрения возможности снова прочитать значение с помощью соответствующего кода, но всякий раз, когда я использую редактор ADSI и просматриваю свойства пользователя, я не может видеть, что номер_департамента содержит какие-либо данные.

Если я установлю для свойства определенное значение с помощью ADSI-Editor, я также не смогу запросить это конкретное значение через C#, но я могу использовать очень простой сценарий VB, как показано ниже:

Set objUser = GetObject("LDAP://CN=........")
objUser.GetInfo
objUser.PutEx 2, "departmentNumber", Array("SomeContent")

Это изменяет значение свойства, которое я вижу в редакторе ADSI, но опять же, используя C#, я не могу его прочитать.

В чем здесь проблема и почему это выглядит так, как будто есть два разных свойства "departmentNumber"? Несмотря на попытки найти кого-то с такой же проблемой, я не нашел ответов или даже указателей в правильном направлении, поэтому любая помощь очень ценится. Пожалуйста, также спросите, если вам нужна дополнительная информация.


person Gorgsenegger    schedule 02.04.2012    source источник


Ответы (1)


Вы просто забыли зафиксировать изменения. Это необходимо для использования в ADSI. Вот пример создания и модификации пользователя:

static void Main(string[] args)
{
  /* Connection to Active Directory
   */
  DirectoryEntry deBase = new DirectoryEntry("LDAP://192.168.225.100:389/OU=SousMonou,OU=MonOu,DC=dom,DC=fr", "jpb", "pwd");

  /* User creation
  */
  DirectoryEntry auser = deBase.Children.Add("cn=a User", "user");
  auser.CommitChanges();

  auser.Properties["samaccountname"].Value = "AUser";
  auser.Properties["givenName"].Value = "A";
  auser.Properties["sn"].Value = "User";
  auser.Properties["displayName"].Value = "AUser";
  auser.Properties["userPrincipalName"].Value = "[email protected]";
  auser.Properties["pwdLastSet"].Value = 0;
  auser.Properties["userAccountControl"].Value = 544;

  auser.CommitChanges();

  /* Retreiving the user
  */
  DirectorySearcher dsLookForDomain = new DirectorySearcher(deBase);
  dsLookForDomain.Filter = "(&(cn=a User))";
  dsLookForDomain.SearchScope = SearchScope.Subtree;

  SearchResult srUser = dsLookForDomain.FindOne();
  if (srUser != null)
  {
    DirectoryEntry deUser = srUser.GetDirectoryEntry();
    deUser.Properties["departmentNumber"].Value = "Test Department";
    deUser.CommitChanges();
  }
}
person JPBlanc    schedule 02.04.2012
comment
Это не работает - у меня есть это в моем коде, но я забыл опубликовать его в исходном вопросе, сейчас обновлю. Может случиться так, что AD на конкретном сервере, который мы используем для тестирования, испорчена, сегодня мы попытаемся проверить это, используя другую машину. - person Gorgsenegger; 03.04.2012
comment
Это просто работа с пользователем, которому разрешено создавать использование в OU на всех моих серверах (от W2K3 до W2K8R2). Вы получаете некоторые ошибки? - person JPBlanc; 03.04.2012
comment
Нет, ошибок не было. Из-за того, что структура AD на этой конкретной машине была испорчена (мы узнали об этом только сегодня), у нас было поведение, описанное выше в моем первоначальном вопросе. Поскольку ваше предложение дает рабочий пример, я принимаю это как ответ. - person Gorgsenegger; 03.04.2012