DirectoryEntry 和 ActiveDirectorySecurity 的授权问题

Authorization problem with DirectoryEntry and ActiveDirectorySecurity

我正在编写 class 来设置或删除访问规则,以保护或取消保护对象不被意外删除,使用 ActiveDirectorySecurity.AddAccessRuleActiveDirectorySecurity.RemoveAccessRule

如果我向 DirectoryEntry 提供管理员帐户的用户名和密码(我不想这样做),我的 class 工作正常,但如果我不提供用户名和密码它会抛出错误

System.DirectoryServices.DirectoryServicesCOMException: A constraint violation occurred

然而,我的默认帐户可以使用 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();
            }
        }
    }
}

我发现一个 post 说 DirectoryEntry.CommitChanges 默认设置所有权信息,这对普通用户来说是不允许的,所以你需要设置 DirectoryEntry 只写 ACL 更改.在调用 CommitChanges 之前放置以下行:

ent.Options.SecurityMasks = SecurityMasks.Dacl;