2015-05-19 3 views
1

Я работаю над программой, которая будет автоматизировать процесс разделения для пользователей, покидающих нашу сеть. Одна из задач, которые он выполняет, заключается в перемещении учетной записи пользователя из OU, в которой она находится, в Former Employees OU. У меня были проблемы с этим шагом, хотя у меня не было проблем с другими процессами с DirectoryServices. Вот мой код до сих пор (примечание: я знаю, что мне нужно прекратить ловить и есть все исключения. Это будет устранено и исправлено до выпуска. Любые советы, по которым я должен поймать исключения, которых я не должен был бы оценивать):Active Directory перемещает пользователя в другое OU

private const string AD_DOMAIN_NAME = "domain.com"; 
private const string AD_NEW_PASSWORD = "TestPassword123"; 
private const string AD_FORMER_EMPLOYEES_OU = "LDAP://OU=Former Employees,DC=domain,DC=com"; 

static DirectoryEntry CreateDirectoryEntry(string connectionPath, 
     string adUserName, string adPassword) 
{ 
    DirectoryEntry ldapConnection = null; 

    try 
    { 
     ldapConnection = new DirectoryEntry(AD_DOMAIN_NAME, adUserName, adPassword); 
     ldapConnection.Path = connectionPath; 
     ldapConnection.AuthenticationType = AuthenticationTypes.Secure;     
    } 

    catch (Exception ex) 
    { 
     MessageBox.Show("Exception Caught in createDirectoryEntry():\n\n" + ex.ToString()); 
    } 

    return ldapConnection; 
} 

private void btnProcessSeparation_Click(object sender, EventArgs e) 
{ 
    if (cboOffice.SelectedItem != null && lstUsers.SelectedItem != null) 
    { 
     string userOU = cboOffice.SelectedItem.ToString(); 
     string userName = lstUsers.SelectedItem.ToString(); 
     string userDn = "LDAP://OU=" + userOU + ",OU=Employees,DC=domain,DC=com"; 

     using (DirectoryEntry ldapConnection = CreateDirectoryEntry(userDn)) 
     { 
      using (DirectorySearcher searcher = CreateDirectorySearcher(ldapConnection, 
       SearchScope.OneLevel, "(samaccountname=" + userName + ")", "samaccountname")) 
      { 
       SearchResult result = searcher.FindOne(); 

       if (result != null) 
       { 
        using (DirectoryEntry userEntry = result.GetDirectoryEntry()) 
        { 
         if (userEntry != null) 
         { 
          using (DirectoryEntry formerEmployees = CreateDirectoryEntry(
           AD_FORMER_EMPLOYEES_OU)) 
          { 
           userEntry.MoveTo(formerEmployees); // This line throws an DirectoryServicesCOMException. 
          } 

          userEntry.CommitChanges(); 
          userEntry.Close(); 
          MessageBox.Show("Separation for {0} has completed successfully.", userName); 
         } 
        } 
       } 
      } 
     } 
    } 

    else 
    { 
     MessageBox.Show("Error, you did not select an OU or a user. Please try again."); 
    } 
} 

Приведенный выше код работает очень хорошо до линии userEntry.MoveTo(formerEmployees);. Эта линия бросает DirectoryServicesCOMException с дополнительной информацией: An invalid dn syntax has been specified. Странно, потому что я использую тот же формат, что и другой DirectoryEntry, который работает отлично. Я добавил точку останова и подтвердил, что formerEmployees настроен на: LDAP://OU=Former Employees,DC=domain,DC=com. Я скопировал все после LDAP:// непосредственно из атрибута OU distinguishedName в Active Directory, чтобы убедиться, что он был прав.

Является ли пространство в названии OU причиной проблемы? Я получил это, чтобы работать как-то прекрасно, и перешел к другим задачам и, должно быть, изменил что-то, что сломало это. Я слишком много смотрю на код, я думаю, и просто не могу понять, почему он думает, что я отправляю недействительный dn.

Спасибо за любую помощь!

+2

"Является ли пространство во имени OU вызывает проблему?" Создайте новое подразделение без пробела и протестируйте его. Еще одна вещь, чтобы проверить, есть ли у вас доступ на запись к OU бывших сотрудников. Наконец, попробуйте прочитать из 'AD_FORMER_EMPLOYEES_OU', чтобы узнать, является ли это проблемой формата DN или какой-либо другой проблемой. –

+0

@ David Спасибо за совет. Оказалось, что это вопрос с разрешениями. Я добавил перегруженный метод «CreateDirectoryEntry», который использует имя пользователя и пароль (это то, что я поставил в приведенном выше коде). Однако, если вы заметили в приведенном выше коде, я вызываю метод, который принимает только путь соединения. Doh! Спасибо, что указал мне в правильном направлении! –

+1

не беспокоится, рад помочь. –

ответ

1

После того, как @David указал мне в правильном направлении, убедившись, что у меня есть правильные разрешения для OU, я обнаружил проблему. Я добавил перегруженный метод CreateDirectoryEntry, который использует имя пользователя и пароль (это то, что я добавил в код выше). Однако, если вы заметили в приведенном выше коде, я вызываю метод, который принимает только путь соединения.

Спасибо за помощь @David!

-1

Надеется, что это помогает:

DirectoryEntry eLocation = Conexion.Conectar(Localitation); 
DirectoryEntry nLocation =Conexion.Conectar(NewLocalitation); 
         string newName = eLocation.Name; 
         eLocation.MoveTo(nLocation, newName); 
         nLocation.Close(); 
         eLocation.Close(); 
+2

Вы не должны использовать какой-либо другой язык, кроме английского. – rzelek