我正在尝试在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();
}
}
答案 0 :(得分:1)
好像你的//PROBLEM LINE
正在离开strOUArray[x]
字符串连接。发帖时这是一个错字吗?
此片段:
DirectoryEntry parent = new DirectoryEntry();
parent = new DirectoryEntry("...");
您正在创建DirectoryEntry
,然后立即在下一行丢弃对它的引用。
答案 1 :(得分:1)
嗯,我猜,我会尝试这样做:
像这样的东西(未经测试 - 我这里没有服务器来检查它):
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。