LDAP Error: The user has insufficient access rights. : LdapErr: DSID-0C09099D, comment: Error processing control,

LDAP Error: The user has insufficient access rights. : LdapErr: DSID-0C09099D, comment: Error processing control,

我想使用 C# 从 Active Directory 获取增量更改,为此我正在尝试构建一个解决方案,如下文中所述(使用 DirSync 控件)。

https://docs.microsoft.com/en-us/windows/win32/ad/polling-for-changes-using-the-dirsync-control

但是,我面临以下问题:

  1. 使用以下代码时,出现异常 The user has insufficient access rights。该用户属于管理员组。

还需要授予该帐户什么权限?又如何?

LdapConnection connection = new LdapConnection("adfs.fed.zzz.com");
connection.SessionOptions.ProtocolVersion = 3;
connection.Credential = new System.Net.NetworkCredential("adfsfed\username", "password");
connection.AuthType = AuthType.Basic;
connection.Bind();

var filter = "(&(objectClass=*))";
var searchRequest = new SearchRequest("", filter, SearchScope.Subtree, properties);

DirSyncRequestControl dirSyncRC = new DirSyncRequestControl(null, DirectorySynchronizationOptions.None);
searchRequest.Controls.Add(dirSyncRC);

var response = connection.SendRequest(searchRequest) as SearchResponse;
  1. 如果我使用下面的代码,那么我不会收到任何异常,但会在 cookie 中得到空结果。
String[] properties = { "objectGUID", "sAMAccountName", "displayName", "mail", "member" };
String filter = "(|(objectClass=group)(objectClass=user))";
DirectorySearcher directorySearcher = new DirectorySearcher(myLdapConnection, filter, properties);
var dSynch = new DirectorySynchronization(System.DirectoryServices.DirectorySynchronizationOptions.None); 
directorySearcher.DirectorySynchronization = dSynch;
directorySearcher.SearchScope = System.DirectoryServices.SearchScope.Subtree;
var results = directorySearcher.FindAll();
var cookie = dSynch.GetDirectorySynchronizationCookie();

注意事项:

  1. 我只有一个域控制器
  2. 我是系统管理员。因此,我可以为用户分配适当的权限。

请帮忙。

• 您的用户 ID 需要“复制目录更改”权限,并且应该是“域管理员”组的成员才能使用 DirSync LDAP 控制扩展。但请注意,无论标准权限如何,它几乎都可以读取目录分区中的任何内容。虽然他们不能改变什么。

但是 - 您的目录中可能有一些敏感属性。请参考下面link中的powershell脚本,并在使用C#赋予适当权限后使用用户ID执行。它是一个目录同步代码,甚至可以检索诸如“userAccountControl、userparameters、msexchuseraccountcontrol、pwdlastset、unicodePwd(空白,因此未返回散列域密码)、lockouttime、accountexpires、unixuserpassword(返回其散列)等属性。

http://dloder.blogspot.com/2012/01/powershell-dirsync-sample.html

根据@KartikBhiwapurkar-MT 的回复,我找出了这个错误。

  1. 错误The user has insufficient access rights完全误导(用户已经复制目录更改权限并且是域管理员组)。 System.DirectoryServices.Protocols 中发生的错误是我将 "" 作为第一个参数 (distinguishedName)
new SearchRequest("", filter, SearchScope.Subtree, properties);

但它应该被传递为

new SearchRequest("DC=adfs,DC=fed,DC=zzz,DC=com", filter, SearchScope.Subtree, properties);
  1. 由于最新的 nuget 包 (6.0.0) 中存在错误,我在 System.DirectoryServices 中得到了空 cookie。在撰写此答案时,该错误仍未解决。

Reference to bug