2016-04-14 11 views
0

Ich habe eine Konsolenanwendung geschrieben, die Berichte zu Accounts in Active Directory- und Novell e-Directory-Bäumen generiert, die gelöscht werden sollten. Dieses Programm eignet sich hervorragend, um eine sehr informative Liste zu erstellen, die sich auf die Anforderungen meines Unternehmens bezieht.Benutzer mit Verzeichnisdiensten programmatisch löschen

Ich wurde nun gefragt, ob ich dieses Programm erweitern kann, um bestimmte Konten zusätzlich zu löschen.

Ich verwende Directory.Services nur für die Verbindungen zu den verschiedenen Bäumen und möchte diesen Verbindungstyp nicht ändern. Jetzt kann und muss ich erfolgreich Objekte löschen, die sich im Stamm meiner Suche befinden. Mein Problem ist jetzt, dass ich anscheinend keine userobjects löschen kann, die in einem subOU gefunden werden.

Hier ist der Code, den ich für meine Funktion haben, die Benutzerobjekte löscht ...

static void Perform_Deletions(List<UserAccountObject> User_List, DirectoryEntry myLdapConnection) 
{ 
    DirectoryEntry userToDelete; 
    myLdapConnection.RefreshCache(); 

    string cnRegex = @"^([^,]+)"; 
    Regex myCNRegex = new Regex(cnRegex, RegexOptions.IgnoreCase); 

    foreach(UserAccountObject user in User_List) 
    { 
     foreach(Match myMatch in myCNRegex.Matches(user.Distinguished_Name)) 
     { 
      string cn = myMatch.ToString(); 
      userToDelete = myLdapConnection.Children.Find(cn); 
      myLdapConnection.Children.Remove(userToDelete); 
      myLdapConnection.CommitChanges(); 
     } 
    } 
} 

ich die Fehlerprüfung entfernen hat und einige der Bereiche umbenannt, um keine internen Informationen zu geben. Aber trotzdem. Ich bin mir sicher, dass mein Problem wahrscheinlich bei der 10. Zeile dieses Codes liegt. Wie ändere ich diese Zeile oder ändere diese Funktion, damit der initiale DirectoryEntry auf "LDAP: //server1.contoso.com/OU=users,DC=contoso,DC=com" zeigt; und das Benutzerobjekt ist in "OU = Team1, OU = Benutzer, DC = Contoso, DC = com" wird es auch gelöscht werden?

Derzeit werden mit diesem Code alle Benutzer im ursprünglichen Eintrag entweder in AD oder e-Directory gelöscht.

Vielen Dank im Voraus für alle Hilfe!

Antwort

0

So konnte ich eine Lösung programmieren, die für meine Anforderungen funktioniert, aber ich denke, dass dies wahrscheinlich nicht die beste Lösung ist, da ich für jeden zu löschenden DN eine Verbindung zum Verzeichnisserver erstellen und löschen muss. Es muss eine Möglichkeit geben, eine Liste von zu löschenden DNs mit einer einzigen Verbindung zu senden.

static void Perform_Deletions(List<UserAccountObject> User_List, string directory) 
    { 
     string ldapServer = null; 
     string parentOU = null; 
     string userCN = null; 
     string ldapDirectory = null; 
     string userName = null; 
     string passWord = null; 

     // REGEX value to only return OU path portion of User DN 
     string dnSuffixRegex = @"ou.*"; 
     Regex myDNRegex = new Regex(dnSuffixRegex, RegexOptions.IgnoreCase); 

     // REGEX to only Return the CN portion of User DN 
     string cnRegex = @"^([^,]+)"; 
     Regex myCNRegex = new Regex(cnRegex, RegexOptions.IgnoreCase); 

     switch (directory) 
     { 
      case "AD1": 
       { 
        ldapDirectory = "LDAP://ad1.contosoe.com/"; 
        userName = "Admin"; 
        passWord = @"[email protected]$$W0rd1"; 

        break; 
       } 
      case "AD2": 
       { 
        ldapDirectory = "LDAP://ad2.contosof.com/"; 
        userName = "Admin"; 
        passWord = @"[email protected]$$W0rd1"; 

        break; 
       } 
      case "EDIR1": 
       { 
        ldapDirectory = "LDAP://edirectory1.contosoc.com/"; 
        userName = @"cn=Admin,o=Root"; 
        passWord = @"[email protected]$$W0rd1"; 

        break; 
       } 
      case "AD3": 
       { 
        ldapDirectory = "LDAP://ad3.contosod.com/"; 
        userName = "Admin"; 
        passWord = @"[email protected]$$W0rd1"; 

        break; 
       } 
      case "EDIR2": 
       { 
        ldapDirectory = "LDAP://edirectory2.contosob.com/"; 
        userName = @"cn=Admin,o=Root"; 
        passWord = @"[email protected]$$W0rd1"; 

        break; 
       } 
      case "EDIR3": 
       { 
        ldapDirectory = "LDAP://edirectory3.contosoa.com/"; 
        userName = @"cn=Admin,o=Root"; 
        passWord = @"[email protected]$$W0rd1"; 

        break; 
       } 
      default: 
       { 
        break; 
       } 
     } 

     foreach (UserAccountObject user in User_List) 
     { 
      foreach (Match cnMatch in myCNRegex.Matches(user.Distinguished_Name)) 
      { 
       userCN = cnMatch.ToString(); 
      } 

      foreach (Match dnMatch in myDNRegex.Matches(user.Distinguished_Name)) 
      { 
       parentOU = dnMatch.ToString(); 
      } 

      ldapServer = ldapDirectory + parentOU; 

      try 
      { 
       DirectoryEntry myLdapconnection = new DirectoryEntry(ldapServer, userName, passWord, AuthenticationTypes.ServerBind); 
       DirectoryEntry userToDelete = myLdapconnection.Children.Find(userCN); 
       myLdapconnection.RefreshCache(); 
       myLdapconnection.Children.Remove(userToDelete); 
       myLdapconnection.CommitChanges(); 
       myLdapconnection.Close(); 
       myLdapconnection.Dispose(); 
       user.Deletion_Status = "SUCCEEDED"; 
      } 
      catch (Exception e) 
      { 
       user.Deletion_Status = "FAILED"; 
       Console.WriteLine("Exception Caught:\n\n{0}", e.ToString()); 
      } 
     } 
    } 
Verwandte Themen