2015-05-19 84 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。我直接從Active Directory中的OU的distinguishedName屬性中複製LDAP://之後的所有內容,以確保它是正確的。

OU名稱中的空間是否導致問題?我得到這個工作一次就好,並轉移到其他任務,並且必須改變一些破壞它的事情。我一直在仔細查看代碼,我似乎無法理解爲什麼它認爲我發送了一個無效的dn。

感謝任何及所有的幫助!

+2

「是在OU名稱導致問題的空間?」創建一個沒有空間的新OU並進行測試。另一件需要檢查的是您是否有權訪問前員工的OU。最後,嘗試從'AD_FORMER_EMPLOYEES_OU'讀取,看看它是否是DN格式問題或其他問題。 –

+0

@David感謝您的建議。原來是一個權限問題。我添加了一個重載的'CreateDirectoryEntry'方法,它使用用戶名和密碼(這就是我在上面的代碼中所做的)。但是,如果您在上面的代碼中注意到,我會調用僅使用連接路徑的方法。衛生署!感謝您指點我正確的方向! –

+1

不用擔心,很高興得到了援助。 –

回答

1

在@David指出我正確的方向以確保我對OU有正確的權限之後,我發現了這個問題。我添加了一個重載的CreateDirectoryEntry方法,它使用用戶名和密碼(這就是我在上面的代碼中所做的)。但是,如果您在上面的代碼中注意到,我會調用僅使用連接路徑的方法。

感謝您的幫助@大衛!

-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

相關問題