C#通过数组循环创建Active Directory OU

时间:2009-01-03 14:12:12

标签: c# active-directory

我正在尝试在Active Directory中创建嵌套的组织单位,而我已经接近了这个工作。我有一个问题,我需要帮助。我正在检查OU是否存在,如果不存在,我需要创建它,strOUArray包含OU = Test OU = Test2和OU = Test3。我需要代码首先创建OU = Test然后将其用作// PROBLEM LINE上的父OU,允许在OU = Test内创建下一个OU OU = Test2。目前在下面的代码中,所有OU都将在根目录中创建,因为我不知道如何在//问题行中使用第一个创建的OU。我尝试过使用:

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

这失败,因为创建第一个OU的父项不存在。任何帮助真的很感激,我的时间紧迫,只需要离开这个,谢谢你的帮助。

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();
 }
}

3 个答案:

答案 0 :(得分:1)

好像你的//PROBLEM LINE正在离开strOUArray[x]字符串连接。发帖时这是一个错字吗?

此片段:

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

您正在创建DirectoryEntry,然后立即在下一行丢弃对它的引用。

答案 1 :(得分:1)

嗯,我猜,我会尝试这样做:

  • 首先绑定到顶级(即LDAP://
  • 创建第一个OU
  • 然后递归
    • 绑定到刚刚创建的容器
    • 添加下一个级别
    • 重复直到你完成

像这样的东西(未经测试 - 我这里没有服务器来检查它):

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);
}

我看到了一个问题:如果你创建一个新的OU,你可能无法立即绑定它 - 有时它需要一点时间传播到目录。

这有帮助吗?

马克

答案 2 :(得分:0)

在过去遇到过类似的事情后,我创建了一个函数来返回目录对象,无论是新创建的还是现有的(抱歉它在VBScript中):

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

使用这个我可以构建我的链而不考虑OU是否存在。首先设置基本路径,然后在其上添加:

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

当代码按照set命令运行时,如果它们已经存在,则OU将被创建为new或bound-to。