Недопустимая структура идентификатора безопасности, эта ошибка возникает при установке нового SecurityDescriptor для свойств пользователя AD - PullRequest
0 голосов
/ 10 мая 2011

Я пытаюсь установить параметр пользователя в учетной записи AD, при создании учетной записи я пытаюсь установить параметр «Пользователь не может изменить пароль».

Но я получаю сообщение об ошибке «Структура идентификатора безопасностиНедопустимая ошибка при попытке установить значение нового дескриптора безопасности.

Вот пример кода,

            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();

Любая идея, почему я получаю это «Структура идентификатора безопасности недействительна»ошибка.

1 Ответ

0 голосов
/ 11 мая 2011

Я гуглил и нашел похожие коды в сети. Я считаю, что приведенный выше код должен работать. Я видел, что у кого-то есть подобные жалобы. Похоже, это связано с учетной записью, которую вы используете. Какой аккаунт вы используете для запуска вышеуказанного кода?

Кроме того, если вы можете использовать .NET 3.5 или выше, попробуйте использовать следующий код.

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