Проблема авторизации с DirectoryEntry и ActiveDirectorySecurity - PullRequest
1 голос
/ 19 сентября 2019

Я пишу класс для установки или удаления правил доступа для защиты или снятия защиты объектов от случайного удаления, используя ActiveDirectorySecurity.AddAccessRule и ActiveDirectorySecurity.RemoveAccessRule.

Мой класс работает нормально, если я предоставляю имя пользователя и пароль дляучетная запись администратора для DirectoryEntry (что я не хочу делать), но если я не предоставлю имя пользователя и пароль, выдается ошибка

System.DirectoryServices.DirectoryServicesCOMException: ограничениепроизошло нарушение

Моя учетная запись по умолчанию, однако, может без каких-либо проблем изменить флаг объекта защиты с помощью приложения Active Directory - пользователи и компьютеры.

Есть идеи, почему это может происходить?

using System;
using System.DirectoryServices;
using System.Security.AccessControl;
using System.Security.Principal;

namespace test123
{
    internal class Test124
    {
        internal static void RemoveAccidentialProtection()
        {
            string dn = "CN=XXX,OU=XXX,OU=XXX,OU=XXX,OU=XXX,DC=XXX,DC=XXX";

            using (DirectoryEntry ent = new DirectoryEntry("LDAP://XXX:nnn/" + dn))
            {
                IdentityReference everyOneAccount = new NTAccount("Everyone").Translate(typeof(SecurityIdentifier)); //S - 1 - 1 - 0
                ActiveDirectoryAccessRule objAce = new ActiveDirectoryAccessRule(everyOneAccount, ActiveDirectoryRights.Delete | ActiveDirectoryRights.DeleteTree, AccessControlType.Deny);
                ent.ObjectSecurity.RemoveAccessRule(objAce);
                ent.CommitChanges();
            }
        }
    }
}

1 Ответ

1 голос
/ 19 сентября 2019

Я нашел сообщение, в котором говорится, что DirectoryEntry.CommitChanges по умолчанию устанавливает информацию о владельце, которая не разрешена для обычных пользователей, поэтому вам нужно установить DirectoryEntry, чтобы записывать только изменения ACL.Поставьте следующую строку перед вызовом CommitChanges:

ent.Options.SecurityMasks = SecurityMasks.Dacl;
...