安全ID结构无效,在为AD用户属性设置新的SecurityDescriptor时出现此错误

我正在尝试在AD帐户中设置用户选项,同时创建帐户我尝试设置“用户无法更改密码”选项。

但是当我尝试设置新安全描述符的值时,我收到错误“安全ID结构无效”错误。

这是示例代码,

string[] trustees = new string[] { @"NT AUTHORITY\SELF", "EVERYONE" }; IADsSecurityDescriptor sd = (IADsSecurityDescriptor)usr.Properties["ntSecurityDescriptor"].Value; IADsAccessControlList acl = (IADsAccessControlList)sd.DiscretionaryAcl; IADsAccessControlEntry ace = new AccessControlEntry(); foreach (string trustee in trustees) { ace.Trustee = trustee; ace.AceFlags = 0; //For remove 'User cannot change password' selection //ace.AceType = (int) ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED_OBJECT; ace.AceType = (int)ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_DENIED_OBJECT; ace.Flags = (int)ADS_FLAGTYPE_ENUM.ADS_FLAG_OBJECT_TYPE_PRESENT; ace.ObjectType = PASSWORD_GUID; ace.AccessMask = (int)ADS_RIGHTS_ENUM.ADS_RIGHT_DS_CONTROL_ACCESS; acl.AddAce(ace); ace.Trustee = trustee; ace.AceFlags = 0; ace.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_DENIED_OBJECT; ace.Flags = (int)ActiveDs.ADS_FLAGTYPE_ENUM.ADS_FLAG_OBJECT_TYPE_PRESENT; ace.ObjectType = PASSWORD_GUID; ace.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_DS_CONTROL_ACCESS; acl.AddAce(ace); } sd.DiscretionaryAcl = acl; usr.Properties["ntSecurityDescriptor"].Value = (ActiveDs.IADsSecurityDescriptor)sd; usr.CommitChanges(); 

任何想法为什么我得到这个“安全ID结构无效”错误。

我用Google搜索并在网络上找到了类似的代码。 我相信上面的代码应该有效。 我确实看到有人有类似的抱怨。 它似乎与您正在使用的帐户有关。 您使用什么帐户来运行上述代码?

此外,如果您可以使用.NET 3.5或更高版本,请尝试使用以下代码。

 using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "YourDomain")) { UserPrincipal up = UserPrincipal.FindByIdentity(context, "Domain\\YourUser"); up.UserCannotChangePassword = false; up.Save(); }