我有一个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转换为字符串类型,但我不确定如何修复它。我确定其中一些是布尔值,整数,日期时间。
答案 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个属性。