在Active Directory中添加自定义属性

时间:2017-06-13 10:09:57

标签: c# active-directory

任何人都可以帮我找到如何使用C#向Active Directory架构添加自定义属性/类?我可以使用MMC / a手动添加。但现在我想用C#代码来做。任何人都可以为我提供样品吗?

提前致谢!

2 个答案:

答案 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