2009-01-03 4 views
1

J'essaie de créer des unités organisationnelles imbriquées dans Active Directory et je suis sur le point de le faire fonctionner. J'ai une ligne de problème ci-dessous avec laquelle j'ai besoin d'aide. Je vérifie si une OU existe et sinon j'ai besoin de le créer, strOUArray contient OU = Test OU = Test2 et OU = Test3. J'ai besoin du code pour créer OU = Test d'abord, puis l'utiliser comme l'unité d'organisation parente sur la // PROBLÈME LINE ci-dessous en permettant à l'OU OU = Test2 suivante d'être créée à l'intérieur de OU = Test. Actuellement dans le code ci-dessous toutes les unités d'organisation seraient créées dans la racine car je ne sais pas comment utiliser la première unité d'organisation créée dans // PROBLEM LINE. Je l'ai essayé d'utiliser:C# Boucler dans un tableau pour créer des unités d'organisation Active Directory

parent = new DirectoryEntry("LDAP://" + strOUArray[x-1] + "," + dcSubString); //note x-1 

Cela échoue en tant que parent n'existe pas pour la première unité d'organisation à créer en toute aide vraiment apprécié, j'ai un délai serré et juste besoin de se déplacer loin de cela. alors merci pour toute aide.

String strOUs = container.Substring(0, container.IndexOf(@",DC=")); 
int dcIndex = container.IndexOf("DC="); 
string dcSubString = container.Substring(dcIndex); //dcSubString = DC=Internal,DC=Net 
string[] strOUArray = strOUs.Split(new Char[] { ',' }); 

for (int x = 0; x < strOUArray.Length; x++) 
{ 
if (DirectoryEntry.Exists("LDAP://" + strOUArray[x] + "," + dcSubString)) 
{ 

} 
else 
{ 
DirectoryEntry objOU; 
DirectoryEntry parent = new DirectoryEntry("LDAP://" + dcSubString); //PROBLEM LINE 

objOU = parent.Children.Add(strOUArray[x], "OrganizationalUnit"); 
objOU.CommitChanges(); 
} 
} 

Répondre

1

On dirait que votre //PROBLEM LINE quitte strOUArray[x] de la concaténation de chaîne. Était-ce une faute de frappe lors de l'affichage?

également cet extrait:

DirectoryEntry parent = new DirectoryEntry(); 
parent = new DirectoryEntry("..."); 

Vous créez un DirectoryEntry puis immédiatement jeter la référence sur la ligne suivante.

+0

Salut ecoffey, j'ai édité le code pour arranger de jeter le DirectoryEntry, merci pour cela. Comme je le mentionne dans mon premier post, je ne peux pas utiliser strOUArray [x] sur la ligne de problème // car le premier élément du tableau n'existe pas, donc je ne peux pas créer une unité d'organisation dans cet emplacement parent. Avez-vous d'autres idées? THX –

1

Eh bien, je suppose, je voudrais essayer de faire quelque chose comme ceci:

  • se lient au haut niveau du premier (qui est LDAP: //
  • créer la première unité d'organisation
  • puis récursive
    • se lient au conteneur juste créé
    • ajouter le niveau suivant
    • répéter jusqu'à vous avez terminé

Quelque chose comme ça (non testé - Je n'ai pas un serveur ici pour vérifier):

String strOUs = container.Substring(0, container.IndexOf(@",DC=")); 
int dcIndex = container.IndexOf("DC="); 
string dcSubString = container.Substring(dcIndex); //dcSubString = DC=Internal,DC=Net 
string[] strOUArray = strOUs.Split(new Char[] { ',' }); 

// create a bind path which we'll build up 
string ldapPath = dcSubString; 

// bind to the top-level container 
DirectoryEntry workEntry = new DirectoryEntry("LDAP://" + ldapPath); 

// loop through all sub-OU's to create 
foreach(string currentOU in strOUArray) 
{ 
    // add the next OU below the current entry 
    objOU = workEntry.Children.Add(currentOU, "OrganizationalUnit"); 
    objOU.CommitChanges(); 

    // bind to the newly created OU 
    ldapPath = currentOU + "," + ldapPath; 
    workEntry = new DirectoryEntry("LDAP://" + ldapPath); 
} 

Il y a un hic que je vois: si vous créez un nouvelle UO, vous pourriez ne pas être capable de lier tout de suite - parfois il faut un moment pour se propager dans le répertoire.

Est-ce que cela aide?

Marc

0

Après avoir couru en quelque chose de similaire dans le passé, je créé une fonction qui retourne l'objet de répertoire, soit (il est désolé de VBScript) nouvellement créé ou existant:

Function GetOU(objParentOU, strOUName) 
    On error resume next 
    Set GetOU = Nothing 

    objParentOU.Filter = Array("organizationalUnit") 
    Dim OU : Set OU = Nothing 
    For Each OU in objParentOU 
     if lcase(OU.Name) = lcase("ou=" & strOUName) then 
      wscript.echo "Connected to existing OU: " & OU.Name 
      set GetOU = GetObject(OU.adsPath) 
      exit function 
     end if 
    Next 
    Set OU = Nothing 

    ' If script made it to here then the OU must not already exist 
    Set GetOU = objParentOU.Create("organizationalUnit", "ou=" & strOUName) 
    GetOU.SetInfo 

    if err then 
     wscript.echo err.description 
     err.clear 
    else 
     wscript.echo "Created new OU: " & strOUName 
    end if 
end function 

L'utilisation de ce I peut construire ma chaîne sans tenir compte de l'OU existante ou non. Réglez d'abord le chemin de base, puis ajouter au-dessus de cette:

Set objDomain = GetObject(LDAP_CONNECTION_STRING) 
Set parentOU = GetOU(objDomain, "parentOU") 
Set childOU = GetOU(parentOU, "childOU") 
Set subchildOU = GetOU(childOU, "subchildOU") 

Comme le code fonctionne vers le bas l'ensemble des commandes l'unité d'organisation de sont soit créé de nouveaux ou liés à si elles existent déjà.