来自wcf和asmx服务的Active Directory搜索失败

时间:2015-07-01 08:40:41

标签: c# wcf active-directory ldap asmx

我在下面有一个简单的设置来搜索用户。

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://someserver:123/OU=d-users,DC=domain,DC=x,DC=y,DC=com");

rootEntry.AuthenticationType = AuthenticationTypes.None;
string filter = "sAMAccountName=" + AccountName;
DirectorySearcher searcher = new DirectorySearcher(rootEntry, filter);
SearchResult foundUser = searcher.FindOne();

出于某种原因,我可以通过简单的控制台/ Windows窗体应用程序进行搜索,但无法从IIS(6.1)上的wcf或asmx服务(v4.0,集成)进行搜索。例外如下;

exception:System.Runtime.InteropServices.COMException (0x8007200A): The specified directory service attribute or value does not exist.

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at Tester.FindAccountByName(String AccountName)

2 个答案:

答案 0 :(得分:0)

尝试将过滤器放入括号:

string filter = string.Format("(sAMAccountName={0})", AccountName);

有关详细信息,请参阅relevant TechNet article on LDAP filter syntax

答案 1 :(得分:0)

尝试使用DirectorySearcher,如下所示:

    using (DirectorySearcher searcher = new DirectorySearcher(new DirectoryEntry("LDAP://someserver:123/OU=d-users,DC=domain,DC=x,DC=y,DC=com")))
                {
                    StringBuilder filterStringBuilder = new StringBuilder();
                    // Just create a single LDAP query for all user SIDs
                    filterStringBuilder.Append("(&(objectClass=user)(|");
                    filterStringBuilder.AppendFormat("({0}={1})", "sAMAccountName", AccountName);
                    filterStringBuilder.Append("))");
                    searcher.PageSize = 1000; // Very important to have it here. Otherwise you'll get only 1000 at all. Please refere to DirectorySearcher documentation

                    searcher.Filter = filterStringBuilder.ToString();
                    searcher.ReferralChasing = ReferralChasingOption.None;

                    searcher.PropertiesToLoad.AddRange(
                        new[] { "DistinguishedName" });

                    var result = searcher.FindOne();
                 }

有关如何使用您可以在msdnstackoverflow

上找到的DirectorySearcher的更多示例