按日期时间自定义属性搜索 Active Directory (AD LDS)
Posted
技术标签:
【中文标题】按日期时间自定义属性搜索 Active Directory (AD LDS)【英文标题】:Search Active Directory (AD LDS) by DateTime custom attribute 【发布时间】:2015-08-12 18:02:37 【问题描述】:我添加了自定义属性lastLogonTime
语法:UTC Coded Time
。我将 UserPrincipal
类扩展为 GET/SET 自定义属性。
...
[DirectoryProperty("lastLogonTime")]
public DateTime? LastLogonTime
get
object[] result = this.ExtensionGet("lastLogonTime");
if (result != null && result.Count() > 0) return (DateTime?)result[0];
return null;
set
this.ExtensionSet("lastLogonTime", value);
...
我还扩展了AdvancedFilters
以便能够按此自定义属性进行搜索。
MyUserPrincipalSearch searchFilter;
new public MyUserPrincipalSearch AdvancedSearchFilter
get
if (null == searchFilter)
searchFilter = new MyUserPrincipalSearch(this);
return searchFilter;
public class MyUserPrincipalSearch: AdvancedFilters
public MyUserPrincipalSearch(Principal p) : base(p)
public void LastLogonTime (DateTime? lastLogonTime, MatchType mt)
this.AdvancedFilterSet("lastLogonTime", lastLogonTime.Value, typeof(DateTime?), mt);
现在,我想搜索所有lastLogonTime
小于day
的用户。
using (PrincipalContext ctx = ADLDSUtility.Users)
MyUserPrincipal filter = new MyUserPrincipal(ctx);
filter.AdvancedSearchFilter.LastLogonTime((DateTime.Now - new TimeSpan(1,0,0,0,0)), MatchType.LessThan);
PrincipalSearcher ps = new PrincipalSearcher(filter);
foreach (MyUserPrincipal p in ps.FindAll())
//my custom code
以上搜索没有返回任何结果。我有最近几天没有登录的测试用户。
我试过MatchType.GreaterThan
、MatchType.Equals
。他们都没有返回任何结果,但仍有符合这些条件的用户。
唯一有效的过滤器是
filter.AdvancedSearchFilter.LastLogonTime(DateTime.Now , MatchType.NotEquals);
但这基本上是返回所有用户。任何想法为什么我的搜索结果没有返回任何结果?
我的目标是搜索所有上次登录时间小于X
天的用户。
只要我能吸引到这些用户,我愿意接受其他解决方案。
附注我确实知道解决这个问题的方法。遍历所有用户,获取他们的lastLogonTime
,然后进行比较,但这对我正在做的事情来说太过分了。
【问题讨论】:
【参考方案1】:在这个问题上花费了一些时间后,我发现了问题。
正如我在帖子中提到的,自定义属性 lastLogonTime
的语法为:UTC Coded Time
。但是,日期和时间不会存储为DateTime
。它实际上是以这种格式存储为string
:
yyyyMMddHHmmss.0Z
我最终解决此问题的方法是修改我的AdvancedSearchFilter.LastLogonTime
以使用格式化字符串进行搜索。
public void LastLogonTime (DateTime? lastLogonTime, MatchType mt)
const string lastLogonTimeFormat = "yyyyMMddHHmmss.0Z";
this.AdvancedFilterSet("lastLogonTime", lastLogonTime.Value.ToUniversalTime().ToString(lastLogonTimeFormat), typeof(string), mt);
希望这对某人有所帮助。
【讨论】:
以上是关于按日期时间自定义属性搜索 Active Directory (AD LDS)的主要内容,如果未能解决你的问题,请参考以下文章
LdapContext.search() 不返回自定义 Active Directory 属性
Rails 5.2 Active Storage 添加自定义属性
如何在登录时在 JWT 令牌中从 Azure Active Directory 传递自定义扩展属性?