任何人都可以帮我找到如何使用C#向Active Directory架构添加自定义属性/类?我可以使用MMC / a手动添加。但现在我想用C#代码来做。任何人都可以为我提供样品吗?
提前致谢!
答案 0 :(得分:2)
这是一个非常大的如何:
https://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C#6
目标特定域控制器或凭据
您看到的代码中的所有位置:LDAP://您可以使用LDAP替换:// MyDomainControllerNameOrIpAddress以及您看到正在构建的DirectoryEntry类的任何位置,您也可以发送特定凭据。如果您需要处理您的计算机不是其林或域的成员的Active Directory,或者您希望将DC作为目标进行更改,则此功能尤其有用。
//重命名对象并直接指定域控制器和凭据
public static void Rename(string server,
string userName, string password, string objectDn, string newName)
{
DirectoryEntry child = new DirectoryEntry("LDAP://" + server + "/" +
objectDn, userName, password);
child.Rename("CN=" + newName);
}
使用DirectoryEntry管理本地帐户
重要的是要注意,如果需要,只需用WinNT://替换LDAP://字符串,就可以针对本地计算机而不是Active Directory执行这些方法,如下所示
//创建新的本地帐户
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" +
Environment.MachineName);
DirectoryEntry newUser = localMachine.Children.Add("localuser", "user");
newUser.Invoke("SetPassword", new object[] { "3l!teP@$$w0RDz" });
newUser.CommitChanges();
Console.WriteLine(newUser.Guid.ToString());
localMachine.Close();
newUser.Close();
使用DirectoryEntry管理本地群组
需要对代码进行一些配置更改,但这非常简单。您可以在下面看到使用DirectoryEntry枚举本地“管理员”组成员的示例。
DirectoryEntry localMachine = new DirectoryEntry
("WinNT://" + Environment.MachineName + ",Computer");
DirectoryEntry admGroup = localMachine.Children.Find
("administrators", "group");
object members = admGroup.Invoke("members", null);
foreach (object groupMember in (IEnumerable)members)
{
DirectoryEntry member = new DirectoryEntry(groupMember);
Console.WriteLine(member.Name);
}
使用DirectoryEntry管理IIS
除了管理本地&目录服务帐户,多功能的DirectoryEntry对象也可以管理其他网络提供程序,例如IIS。下面是如何使用DirectoryEntry在IIS中配置新虚拟目录的示例。
//使用DirectoryEntry()
在IIS中创建新的虚拟目录string wwwroot = "c:\\Inetpub\\wwwroot";
string virtualDirectoryName = "myNewApp";
string sitepath = "IIS://localhost/W3SVC/1/ROOT";
DirectoryEntry vRoot = new DirectoryEntry(sitepath);
DirectoryWntry vDir = vRoot.Children.Add(virtualDirectoryName,
"IIsWebVirtualDir");
vDir.CommitChanges();
vDir.Properties["Path"].Value = wwwroot + "\\" + virtualDirectoryName;
vDir.Properties["DefaultDoc"].Value = "Default.aspx";
vDir.Properties["DirBrowseFlags"].Value = 2147483648;
vDir.Commitchanges();
vRoot.CommitChanges();
NOW Active Directory对象:
枚举对象的多字符串属性值
此方法包含一个递归标记,以防您想要递归地挖掘属性的属性,例如枚举组的所有成员值,然后将每个成员组的组一直放到树上。
public ArrayList AttributeValuesMultiString(string attributeName,
string objectDn, ArrayList valuesCollection, bool recursive)
{
DirectoryEntry ent = new DirectoryEntry(objectDn);
PropertyValueCollection ValueCollection = ent.Properties[attributeName];
IEnumerator en = ValueCollection.GetEnumerator();
while (en.MoveNext())
{
if (en.Current != null)
{
if (!valuesCollection.Contains(en.Current.ToString()))
{
valuesCollection.Add(en.Current.ToString());
if (recursive)
{
AttributeValuesMultiString(attributeName, "LDAP://" +
en.Current.ToString(), valuesCollection, true);
}
}
}
}
ent.Close();
ent.Dispose();
return valuesCollection;
}
枚举对象的单个字符串属性值
public string AttributeValuesSingleString
(string attributeName, string objectDn)
{
string strValue;
DirectoryEntry ent = new DirectoryEntry(objectDn);
strValue = ent.Properties[attributeName].Value.ToString();
ent.Close();
ent.Dispose();
return strValue;
}
枚举对象的属性:具有值的值
public static ArrayList GetUsedAttributes(string objectDn)
{
DirectoryEntry objRootDSE = new DirectoryEntry("LDAP://" + objectDn);
ArrayList props = new ArrayList();
foreach (string strAttrName in objRootDSE.Properties.PropertyNames)
{
props.Add(strAttrName);
}
return props;
}
答案 1 :(得分:0)
有趣的是,提出的答案并非问题作者的例子都没有真正回答原来的问题:
如何在C#中将自定义属性/类添加到Active Directory架构?
通过这个问题,我明白了,在AD模式中添加了一个不存在的属性。当您看到添加属性实际上意味着更新AD架构时,我怀疑它是否通过C#代码得到支持: https://social.technet.microsoft.com/wiki/contents/articles/20319.how-to-create-a-custom-attribute-in-active-directory.aspx