Я работаю над программой, которая будет автоматизировать процесс разделения для пользователей, покидающих нашу сеть. Одна из задач, которые он выполняет, заключается в перемещении учетной записи пользователя из 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.
Спасибо за любую помощь!
"Является ли пространство во имени OU вызывает проблему?" Создайте новое подразделение без пробела и протестируйте его. Еще одна вещь, чтобы проверить, есть ли у вас доступ на запись к OU бывших сотрудников. Наконец, попробуйте прочитать из 'AD_FORMER_EMPLOYEES_OU', чтобы узнать, является ли это проблемой формата DN или какой-либо другой проблемой. –
@ David Спасибо за совет. Оказалось, что это вопрос с разрешениями. Я добавил перегруженный метод «CreateDirectoryEntry», который использует имя пользователя и пароль (это то, что я поставил в приведенном выше коде). Однако, если вы заметили в приведенном выше коде, я вызываю метод, который принимает только путь соединения. Doh! Спасибо, что указал мне в правильном направлении! –
не беспокоится, рад помочь. –