活动目录查询问题

时间:2016-07-04 00:13:31

标签: c# vb.net active-directory ldap

我有一个AD查询,并手动添加属性,但我希望能够将用户可以拥有的所有活动目录属性添加到搜索器。

这是我现在这样做的方式,工作正常,花花公子...

Dim de As New DirectoryEntry
If getset.impersonationset = True Then
    If getset.specificcontainerchecked = True Then
        de.Path = "LDAP://" & getset.containerstring()
        de.Username = getset.usernameset
        de.Password = getset.passwordset
    Else
        de.Path = "LDAP://" & getset.DomainName()
        de.Username = getset.usernameset
        de.Password = getset.passwordset
    End If
Else
    If getset.specificcontainerchecked = True Then
        de.Path = "LDAP://" & getset.containerstring()
    Else
        de.Path = "LDAP://" & getset.DomainName()
    End If
End If

Dim deSearch As New DirectorySearcher()
deSearch.SearchRoot = de
deSearch.Filter = "(&(objectClass=User)(objectCategory=Person))"
deSearch.PageSize = 1000
deSearch.SizeLimit = 1000

If getset.specificcontainerchecked = True Then
    If getset.subcontainers = True Then
        deSearch.SearchScope = SearchScope.Subtree
    ElseIf getset.subcontainers = False Then
        deSearch.SearchScope = SearchScope.OneLevel
    End If
ElseIf getset.specificcontainerchecked = False Then
    deSearch.SearchScope = SearchScope.Subtree
End If

deSearch.PropertiesToLoad.Add("sAMAccountName") 'Account Name
    deSearch.PropertiesToLoad.Add("givenName") 'Display Name
    deSearch.PropertiesToLoad.Add("sn") 'Load Users first name
    deSearch.PropertiesToLoad.Add("description") 'Description
    deSearch.PropertiesToLoad.Add("userAccountControl")   'Distinguished Name
    deSearch.PropertiesToLoad.Add("lastLogonTimestamp") 'Last Login
    deSearch.PropertiesToLoad.Add("whenCreated") 'Created Date
    deSearch.PropertiesToLoad.Add("whenChanged") 'Changed Date
    deSearch.PropertiesToLoad.Add("distinguishedName")
    deSearch.PropertiesToLoad.Add("msNPAllowDialin")
    deSearch.PropertiesToLoad.Add("cn") 'Wiles, Anthony
    deSearch.PropertiesToLoad.Add("co") 'United States
    deSearch.PropertiesToLoad.Add("company") 'Company
    deSearch.PropertiesToLoad.Add("l") 'Alpharetta
    deSearch.PropertiesToLoad.Add("mail") 'Email
    deSearch.PropertiesToLoad.Add("st") 'State

所以我想我会尝试将它们全部添加,所以用户可以选择他们想要的属性......所以我想出了这个。

 Dim currSchema As ActiveDirectorySchema = ActiveDirectorySchema.GetCurrentSchema()
 Dim collection As ActiveDirectorySchemaClass = currSchema.FindClass("user")
 Dim properties As ReadOnlyActiveDirectorySchemaPropertyCollection = collection.GetAllProperties()
 Dim enumerator As IEnumerator = properties.GetEnumerator()
        While enumerator.MoveNext()
            Try
                deSearch.PropertiesToLoad.Add(enumerator.Current)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End While

但我发现大多数人都有以下错误。

Conversion from type 'ActiveDirectorySchemaProperty' to type 'string' is not valid.

我失踪的任何线索?我意识到它无法将ADSP转换为字符串类型,但我不确定如何修复它。我确定其中一些是布尔值,整数,日期时间。

2 个答案:

答案 0 :(得分:1)

vb.net并不是太严格,无法在intellisense或甚至构建中捕获它。 c#将在intellisense中捕捉到它。

更改此行:

deSearch.PropertiesToLoad.Add(enumerator.Current)

deSearch.PropertiesToLoad.Add(enumerator.Current.ToString())

--------- C#version ------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.ActiveDirectory;
using System.Collections;

namespace AD
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectorySearcher deSearch = new DirectorySearcher();

        ActiveDirectorySchema currSchema = ActiveDirectorySchema.GetCurrentSchema();
        ActiveDirectorySchemaClass collection = currSchema.FindClass("user");
        ReadOnlyActiveDirectorySchemaPropertyCollection properties = collection.GetAllProperties();
        IEnumerator enumerator = properties.GetEnumerator();
        while (enumerator.MoveNext())
        {
            try
            {
                deSearch.PropertiesToLoad.Add(enumerator.Current.ToString());
                Console.WriteLine(enumerator.Current.ToString());
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.Message);
            }
        }
    }
}

}

答案 1 :(得分:1)

错误很明显,另一个答案是正确的。 enumerator.Current返回ActiveDirectorySchemaProperty的对象,而不是PropertiesToLoad.Add()所需的字符串名称。如前所述,您需要使用ToString

deSearch.PropertiesToLoad.Add(enumerator.Current.ToString)

另一种方法是使用GetAllProperties()方法返回的集合(如果已经存在集合,则无需添加额外的枚举器):

For Each p As ActiveDirectorySchemaProperty In properties
   deSearch.PropertiesToLoad.Add(p.Name)
Next

要检查代码是否有效,您可以检查最后的Count属性

MessageBox.Show(deSearch.PropertiesToLoad.Count)

唯一的问题是你为什么需要那个? PropertiesToLoad()用于返回您希望为搜索结果检索的属性。例如,如果您有一个搜索页面,用户可以按特定条件搜索,搜索结果将显示为包含基本详细信息的表格,例如用户名,显示名称,电子邮件等,但不是全部。如果没有特殊需要(并且还因为性能原因),加载和返回所有属性是没有意义的。例如,我的“test”目录的方案有超过800个属性。