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

C# 安全ID结构无效,为AD用户属性设置新SecurityDescriptor时出现此错误,c#,active-directory,passwords,C#,Active Directory,Passwords,我试图在广告帐户中设置用户选项,在创建帐户时,我试图设置“用户无法更改密码”选项 但是,在尝试设置新安全描述符的值时,出现了错误“Security ID Structure invalid” 这是示例代码 string[] trustees = new string[] { @"NT AUTHORITY\SELF", "EVERYONE" }; IADsSecurityDescriptor sd = (IADsSecurityDescriptor

我试图在广告帐户中设置用户选项,在创建帐户时,我试图设置“用户无法更改密码”选项

但是,在尝试设置新安全描述符的值时,出现了错误“Security ID Structure invalid”

这是示例代码

            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结构无效”的错误吗。

我在谷歌上搜索并在网上找到了类似的代码。我相信上面的代码应该是有效的。我确实看到有人有类似的抱怨。它似乎与您正在使用的帐户有关。您使用哪个帐户运行上述代码

此外,如果可以使用.NET3.5或更高版本,请尝试使用以下代码

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

非常感谢您的回复,只需稍加修改即可正常工作。最初它给出了登录失败错误,然后又向FindByIdentity传递了一个参数,UserPrincipal up=UserPrincipal.FindByIdentity(上下文,IdentityType.SamAccountName,用户名);