[英]Active Directory Properties
在有两个关于stackoverflow的帮助下,我已经弄清楚了如何使用下面的代码设置“用户无法更改密码”。 我现在正试图找出如何删除该属性。 我以为将拒绝标志设置为“允许”会起作用,但似乎无济于事。 我希望代码尽可能使用DirectoryEntry而不是PrincipalContext,因为我不确定我的应用程序是否将在所有服务器上使用.NET 3.5。 任何帮助,将不胜感激。
string PASSWORD_GUID = "{ab721a53-1e2f-11d0-9819-00aa0040529b}";
string [] trustees = {"NT AUTHORITY\\SELF", "EVERYONE"};
ActiveDs.IADsSecurityDescriptor sd = (ActiveDs.IADsSecurityDescriptor)User.Properties["ntSecurityDescriptor"].Value;
ActiveDs.IADsAccessControlList acl = (ActiveDs.IADsAccessControlList) sd.DiscretionaryAcl;
ActiveDs.AccessControlEntry ace = new ActiveDs.AccessControlEntry();
double denied = (double)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_DENIED_OBJECT;
double objectType = (double)ActiveDs.ADS_FLAGTYPE_ENUM.ADS_FLAG_OBJECT_TYPE_PRESENT;
double dsControl = (double)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_DS_CONTROL_ACCESS;
foreach (string trustee in trustees) {
ace.Trustee = trustee;
ace.AceFlags = 0;
ace.AceType = Convert.ToInt32(Math.Floor(denied));
ace.Flags = Convert.ToInt32(Math.Floor(objectType));
ace.ObjectType = PASSWORD_GUID;
ace.AccessMask = Convert.ToInt32(Math.Floor(dsControl));
acl.AddAce(ace);
}
sd.DiscretionaryAcl = acl;
User.Properties["ntSecurityDescriptor"].Value
= sd;
User.CommitChanges();
我更喜欢将System.DirectoryServices.AccountManagement命名空间用于这种情况(我认为需要.Net 3.5或更高版本)。 使用这些对象,您的调用变得更加简单:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "Domain"))
{
UserPrincipal up = UserPrincipal.FindByIdentity(pc, "Domain\\User");
up.UserCannotChangePassword = false;
up.Save();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.