我正在開發一個程序,該程序將爲離開我們網絡的用戶自動執行分離過程。它執行的任務之一是將用戶帳戶從其所在的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
。我直接從Active Directory中的OU的distinguishedName
屬性中複製LDAP://
之後的所有內容,以確保它是正確的。
OU名稱中的空間是否導致問題?我得到這個工作一次就好,並轉移到其他任務,並且必須改變一些破壞它的事情。我一直在仔細查看代碼,我似乎無法理解爲什麼它認爲我發送了一個無效的dn。
感謝任何及所有的幫助!
「是在OU名稱導致問題的空間?」創建一個沒有空間的新OU並進行測試。另一件需要檢查的是您是否有權訪問前員工的OU。最後,嘗試從'AD_FORMER_EMPLOYEES_OU'讀取,看看它是否是DN格式問題或其他問題。 –
@David感謝您的建議。原來是一個權限問題。我添加了一個重載的'CreateDirectoryEntry'方法,它使用用戶名和密碼(這就是我在上面的代碼中所做的)。但是,如果您在上面的代碼中注意到,我會調用僅使用連接路徑的方法。衛生署!感謝您指點我正確的方向! –
不用擔心,很高興得到了援助。 –