c# - 事件目录查询问题

标签 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 强制转换为字符串类型,但我不确定如何修复它。我确定其中一些是 bool 值、整数、日期时间。

最佳答案

vb.net 并不太严格,无法在智能感知中捕捉到这一点,甚至无法构建。 c# 将在智能感知中捕捉到这一点。

改变这一行:

deSearch.PropertiesToLoad.Add(enumerator.Current)

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

------------ C#版本------------

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);
            }
        }
    }
}

关于c# - 事件目录查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38175442/

相关文章:

c# - 如何从列表框 C# 中删除选定的项目

c# - StreamReader 在类中为 null

c# - 如何从另一个项目添加对共享代码项目 (.shproj) 的引用

vb.net - 从范围内的单元格中读取所有唯一值并从中创建一个逗号分隔的字符串?

c# - 什么是 C# 等同于 VB 中的 With 语句?

Powershell-更新属性 "departmentNumber"

azure - 支持 Active Directory Graph Api,无需 Azure 应用程序

c# - 如何在 Xamarin.Forms 上调用 HTTP2

c# - 如何在 C# 中使用 ResolveIpNetEntry2

active-directory - 在结果中包括 LDAP 用户的启用/禁用帐户状态