c#PrincipalSearcher条件不喜欢

时间:2014-07-21 19:04:21

标签: c# .net active-directory

是否可以将“按示例查询”主体的条件设置为不喜欢而不是 LIKE

与方法类似:

UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.Name= "Mario";

这将返回名为“Mario”的所有用户。

是否可以创建一个条件来获取所有未命名为“Mario”的用户?

这样的事情:

UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.Name != "Mario";

所有用户名不是“Mario”的用户。

2 个答案:

答案 0 :(得分:1)

不,但是你可以获得所有用户。然后使用linq过滤它们。

UserPrincipal qbeUser = new UserPrincipal(ctx);
PrincipalSearcher pSearch = new PrincipalSearcher(qbeUser);
PrincipalSearchResult<Principal> pResult = pSearch.FindAll();
var notMario = (from u in pResult
                where u.Name != "Mario"
                select u);

然后取决于你想做什么

foreach (Principal p in notMario) {
    // Do Somthing
}

答案 1 :(得分:1)

这可以通过扩展UserPrincipal类来实现:

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

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

    // Create the "employeeType" property with the "!" for NOT LIKE.    
    [DirectoryProperty("!employeeType")]
    public string NotLikeEmployeeType
    {
        get
        {
            if (ExtensionGet("!employeeType").Length != 1)
                return string.Empty;

            return (string)ExtensionGet("!employeeType")[0];
        }
        set { ExtensionSet("!employeeType", value); }
    }

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

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

重要的是要理解:

// Create the "employeeType" property.    
[DirectoryProperty("!employeeType")]
public string NotLikeEmployeeType
{
    get
    {
        if (ExtensionGet("!employeeType").Length != 1)
                return string.Empty;

        return (string)ExtensionGet("!employeeType")[0];
     }
     set { ExtensionSet("!employeeType", value); }
}

鉴于&#34; DirectoryProperty&#34;使用ExtensionGet和ExtensionSet创建条件时属性(本例中为NotLikeEmployeeType)不为空,可以添加&#34;!&#34;在AD属性之前(在这种情况下为employeeType)。

这是我们使用扩展程序的方式:

UserPrincipalEXT qbeUser = new UserPrincipalEXT(ctx);
qbeUser.NotLikeEmployeeType = "exclude";

现在返回的条件是:

!employeeType = exclude

这正是我们想要的!不喜欢 ! :)

而且,关于扩展的好处是,您可以将AD属性添加到通常不会公开的类(例如employeeType)