我的特定问题:如何缩小对没有设置employeeNumber属性(不为null或为空)的活动目录帐户的搜索?

我的解决方法是检查结果并检查employeeNumber并删除这些帐户。 但是,我希望查询可以缩小结果范围,然后再手动过滤。

我认为甚至没有触发过滤器的行: ((DirectorySearcher)ps.GetUnderlyingSearcher()).Filter = "(&(objectCategory=Person)(objectClass=User)(!employeeNumber=*))";// I would like for it to return only Ad Accounts that have an employeeNumber set

 PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "myDomain");
                UserPrincipal user = new UserPrincipal(domainContext);
                user.SamAccountName = ParamSamAccountName;
                user.Enabled = true;//only enabled users
                user.PasswordNeverExpires = false; //this should get rid of service accounts

                PrincipalSearcher pS = new PrincipalSearcher();
                pS.QueryFilter = user;

                PrincipalSearcher ps = new PrincipalSearcher(user);
                ((DirectorySearcher)ps.GetUnderlyingSearcher()).PageSize = 500;
               ((DirectorySearcher)ps.GetUnderlyingSearcher()).Filter = "(&(objectCategory=Person)(objectClass=User)(!(employeeNumber=*)))";//this doesnt seem to be working... bug...
                var searchResults = SafeFindAll(ps);



      private static IEnumerable<Principal> SafeFindAll(PrincipalSearcher searcher)
            {
                using (var results = searcher.FindAll())
                {
                    foreach (var result in results)
                    {
                        yield return result;
                    }
                } // SearchResultCollection will be disposed here
            }

#1楼 票数:3

这是我的方法:

1.子类UserPrincipal引入noEmployeeNumber和objectCategory属性( 是一个很好的示例,对我有很大帮助):

[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx : UserPrincipal
{
    // Implement the constructor using the base class constructor. 
    public UserPrincipalEx(PrincipalContext context) : base(context) { }

    // Implement the constructor with initialization parameters.    
    public UserPrincipalEx(PrincipalContext context,
                         string samAccountName,
                         string password,
                         bool enabled)
        : base(context, samAccountName, password, enabled)
    { }

    // Create the "employeeNumber" property.    
    [DirectoryProperty("!employeeNumber")]
    public bool noEmployeeNumber
    {
        get
        {
            if (ExtensionGet("!employeeNumber").Length != 1) return false;
            string empNum = (string)ExtensionGet("!employeeNumber")[0];
            if (empNum == "*") return true; else return false;
        }
        set 
        {
            ExtensionSet("!employeeNumber", "*"); 
        }
    }
    // Create the "objectCategory" property.    
    [DirectoryProperty("objectCategory")]
    public string objectCategory
    {
        get
        {
            object[] result = this.ExtensionGet("objectCategory");
            if (result != null)
            {
                return (string)result[0];
            }
            else
            {
                return string.Empty;
            }
        }
        set { this.ExtensionSet("objectCategory", value); }
    }

    // Implement the overloaded search method FindByIdentity.
    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, string identityValue)
    {
        return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityValue);
    }

    // Implement the overloaded search method FindByIdentity. 
    public static new UserPrincipalEx FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
    {
        return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityType, identityValue);
    }
}

2.更改代码以使用新的UserPrincipalEx并将值分配给它的新属性:

PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "mydomain");
UserPrincipalEx user = new UserPrincipalEx(domainContext);

// here are our new properties:
user.noEmployeeNumber = true;
user.objectCategory = "person";

user.Enabled = true; //only enabled users
user.PasswordNeverExpires = false; //this should get rid of service accounts
PrincipalSearcher ps = new PrincipalSearcher(user);
var searchResults = ps.FindAll();                 

结果将是未设置employeeNumber属性的所有用户的列表。

#2楼 票数:1 已采纳

您的问题有点令人困惑。 如果您要设置WITHOUTemployeeNumber,那么您是正确的,如果您要设置WITH WITHemployeeNumber,那么您需要:(&(objectCategory = Person)(objectClass = User)(employeeNumber = *))

另外,您需要确保获得LDAP连接。 下面的一些代码可能会有所帮助,另请参见此博客: http : //www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C#20

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LDAPCSharp
{

    using System.DirectoryServices;
    using System.DirectoryServices.ActiveDirectory;

    class Program
    {
        static void Main(string[] args)
        {
            var ldapDomain = FriendlyDomainToLdapDomain("domainRemoved");


            var allResults = FindAllWithEmployeeNumber(ldapDomain);

            foreach (var searchResult in allResults)
            {
                using (var entry = searchResult.GetDirectoryEntry())
                {
                    foreach (var value in entry.Properties.PropertyNames)
                    {
                        Console.WriteLine(value);
                    }
                }
            }
        }

        /// <summary>
        /// The find all.
        /// </summary>
        /// <param name="ldapDomain">
        /// The ldap domain.
        /// </param>
        /// <returns>
        /// The <see cref="IEnumerable"/>.
        /// </returns>
        public static IEnumerable<SearchResult> FindAllWithEmployeeNumber(string ldapDomain)
        {
            string connectionPrefix = "LDAP://" + ldapDomain;
            DirectoryEntry entry = new DirectoryEntry(connectionPrefix);
            DirectorySearcher mySearcher = new DirectorySearcher(entry);

            // all that have employeenumber set
            mySearcher.Filter = "(&(objectCategory=Person)(objectClass=User)(employeeNumber=*))";

            // all WITHOUT employeenumber set
            // mySearcher.Filter = (&(objectCategory=Person)(objectClass=User)(!(employeeNumber=*)))";
            mySearcher.PageSize = 10;

            var results = SafeFindAll(mySearcher);

            mySearcher.Dispose();
            return results;
        }

        public static string FriendlyDomainToLdapDomain(string friendlyDomainName)
        {
            string ldapPath = null;
            try
            {
                DirectoryContext objContext = new DirectoryContext(
                    DirectoryContextType.Domain, friendlyDomainName);
                Domain objDomain = Domain.GetDomain(objContext);
                ldapPath = objDomain.Name;
            }
            catch (DirectoryServicesCOMException e)
            {
                ldapPath = e.Message.ToString();
            }
            return ldapPath;
        }

        private static IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
        {
            using (var results = searcher.FindAll())
            {
                foreach (var result in results)
                {
                    yield return (SearchResult)result;
                }
            } // SearchResultCollection will be disposed here
        }
    }
}

#3楼 票数:-1

找到用户的两种方法

var userName = Request.ServerVariables["LOGON_USER"];
var pc = new PrincipalContext(ContextType.Domain);
var userFind = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, userName);

要么

string fullName = null;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context,"someUserName")) 
    {
        if (user != null)
        {
            fullName = user.DisplayName;
        }
    }
}

  ask by hidden translate from so

未解决问题?本站智能推荐:

1回复

从ASP.NET应用程序查询ActiveDirectory对象属性将返回旧结果

几天以来,我一直在尝试使一些基于Active Directory的自定义身份验证起作用。 这一切都在理论上起作用,但显然我的理论是错误的。 登录到域的用户在登录ASP.NET应用程序时,将字符串令牌(例如PIN码)写入Active Directory中自己的属性字段(这并不重要,但是我使用p
1回复

仅在服务器上查询ActiveDirectory时出错

我有以下代码块,使用System.DirectoryServices.AccountManagement通过组名向Active Directory查询用户: 现在,该网站使用以下内容: Win2k8上的IIS7 Windows验证 假冒=真 使用“网络服务”作为帐户的
2回复

在活动目录中,mailNickname用于什么?

在活动目录中,mailNickname是否应该始终等于samaccountname? 或者,它应该始终等于mail属性(减去“@domain”)吗? 我的理由是我们最近将每个人的主要电子邮件地址更改为first.last表单,并将mail属性设置为相同。 但是,我们还需要修改mailNi
1回复

使用C从活动目录访问用户信息

我了解了ADSI,发现它可与C / C ++一起使用。 我还在Visual C ++中找到了创建新用户的代码。 我想知道如何使用C或标准C ++程序从活动目录访问用户的信息(例如他的电话号码)。 我没有Visual C ++软件。我也想知道我应该使用什么API /库来实现这一目标。 我想
1回复

尽管用户已登录,但活动目录的logonCount为0

对于活动目录中的用户,属性保留lastlogontime和lastlogontimestamp的值,但logoncount为0。我在该域中只有一个域控制器。 我从冲浪中发现,logonCount值为0表示该值未知。 但是我完全不知道为什么它是未知的。 这是AD的问题吗?
1回复

当成员attrib不起作用时,从活动目录中检索组成员/成员资格

我试图从“域用户”中获取所有组成员。 使用AD Users MMC选项卡时,我得到了很多结果。 使用ADSI时 - 不是。 以下内容无法按预期工作: 通过LDAP / ADSI查看组条目的成员属性。 当有更多时,它只返回56个成员。 通过memberOf搜索(只返回几个条目)
1回复

使用VB删除ActiveDirectory中的主目录

我想使用VB在AD中搜索禁用的帐户(超过90天并删除其主目录。以下脚本可以正常运行,但不能递归 :( 任何人都可以帮助使其正常工作吗? 他的任何帮助将不胜感激:)
1回复

如何优化我的PowerShell-LDAP查询?

我创建了一个从 CSV(或其他数据集,但不发布该侧)读取的脚本,并在我的 AD 环境中创建用户。 基本上,任何传递到脚本中的数据集都会被处理,然后如果它们不存在就会创建一个用户。 如果该用户已存在于 AD 中,则脚本将跳过该条目。 这是一个仅创建脚本。 它非常慢,我想在保持功能的同时提高性能。 你能