安全 ID 结构无效,在为 AD 用户属性设置新的安全描述符时出现此错误
本文关键字:安全 描述 错误 设置 无效 结构 ID 在为 用户 AD 属性 | 更新日期: 2023-09-27 17:56:00
我正在尝试在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结构无效"错误。
我用谷歌搜索并在网上找到了类似的代码。 我相信上面的代码应该有效。 我确实看到有人有类似的抱怨。 它似乎与您正在使用的帐户有关。 您使用什么帐户来运行上述代码?
此外,如果可以使用 .NET 3.5 或更高版本,请尝试使用以下代码。
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "YourDomain"))
{
UserPrincipal up = UserPrincipal.FindByIdentity(context, "Domain''YourUser");
up.UserCannotChangePassword = false;
up.Save();
}