DirectoryEntry 和 ActiveDirectorySecurity 的授权问题
Authorization problem with DirectoryEntry and ActiveDirectorySecurity
我正在编写 class 来设置或删除访问规则,以保护或取消保护对象不被意外删除,使用 ActiveDirectorySecurity.AddAccessRule
和 ActiveDirectorySecurity.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;
我正在编写 class 来设置或删除访问规则,以保护或取消保护对象不被意外删除,使用 ActiveDirectorySecurity.AddAccessRule
和 ActiveDirectorySecurity.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;