Свойства Active Directory - PullRequest
       6

Свойства Active Directory

2 голосов
/ 19 ноября 2009

с помощью двух человек на 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();

1 Ответ

1 голос
/ 19 ноября 2009

Я очень предпочитаю использовать пространство имен 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...