我最初尝试将多个值作为directReports分配给Active Directory中的用户是使用DirectoryEntry对象并按如下方式分配:
DirectoryEntry de; //get it from somewhere
de.Properties["directReports"].Value = object[] { "CN=user123,CN=Users,DC=DOMAIN,DC=xyz", "dn2", "dn3" };
de.CommitChanges(); //error: contraint violation occurred
它也不适用于"经理"属性。
然后我开始使用UserPrincipal扩展方法(在后台使用DirectoryEntries,对吗?)
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx : UserPrincipal
{
public UserPrincipalEx(PrincipalContext pc)
: base(pc)
{
}
public void SetManager(string value)
{
this.ExtensionSet("manager", value);
}
public void SetDirectReports(string[] values)
{
//foreach(var v in values)
this.ExtensionSet("directReports", values);
}
public static new UserPrincipalEx FindByIdentity(PrincipalContext context, string identityValue)
{
return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityValue);
}
public static new UserPrincipalEx FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
{
return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityType, identityValue);
}
}
通过发送专有名称字符串来分配经理可以正常工作,但它不适用于直接下属。我仍然得到InvalidOperationException: A constraint violation occurred.
我试图这样称呼它:
PrincipalContext pc = new PrincipalContext(ContextType.Domain, "mazen", user, pass);
UserPrincipalEx up = UserPrincipalEx.FindByIdentity(pc, IdentityType.SamAccountName, "moses");
var dns = new string[] { "CN=someone,CN=Users,DC=DOMAIN,DC=xyz", "CN=anotherone,CN=Users,DC=DOMAIN,DC=xyz" };
up.SetDirectReports(dns);
如何使用C#分配直接报告多值属性?
答案 0 :(得分:1)
我认为directReports
是Active Directory中的计算字段。
如果您有10名员工与同一位经理,那么该经理的directReports
财产将列出所有这10名员工。
但 不能直接设置该属性 - 您必须设置员工的manager
属性,然后设置经理的directReports
属性将由Active Directory自动设置