【问题标题】:Authorization problem with DirectoryEntry and ActiveDirectorySecurityDirectoryEntry 和 ActiveDirectorySecurity 的授权问题
【发布时间】:2020-01-20 18:14:15
【问题描述】:

我正在编写一个类来设置或删除访问规则,以保护或取消保护对象免受意外删除,使用 ActiveDirectorySecurity.AddAccessRuleActiveDirectorySecurity.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();
            }
        }
    }
}

【问题讨论】:

  • 您的应用程序是否作为控制台应用程序、WinForm 应用程序、ASP.Net 应用程序运行?
  • 这是作为控制台应用程序运行的。

标签: c# active-directory directoryentry


【解决方案1】:

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

ent.Options.SecurityMasks = SecurityMasks.Dacl;

【讨论】:

  • 是的,就是这样。我能够复制它,这就是修复它的原因。
  • 非常感谢,成功了!经过数小时的搜索,我没有找到。
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 2013-07-19
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多