按日期时间自定义属性搜索 Active Directory (AD LDS)
Search Active Directory (AD LDS) by DateTime custom attribute
我添加了自定义属性 lastLogonTime
语法:UTC Coded Time
。我将 UserPrincipal
class 扩展到 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
。 None 其中有返回任何结果,但仍有符合这些条件的用户。
唯一有效的过滤器是
filter.AdvancedSearchFilter.LastLogonTime(DateTime.Now , MatchType.NotEquals);
但这基本上是在返回所有用户。知道为什么我的搜索结果没有返回任何结果吗?
我的目标是搜索上次登录时间少于 X
天的所有用户。
只要有这些用户,我愿意接受其他解决方案。
P.S。我确实知道解决这个问题的方法。遍历所有用户,获取他们的 lastLogonTime
然后进行比较,但这对我正在做的事情来说太过分了。
在这个问题上花费了一些时间之后,我发现了问题所在。
正如我在 post 中提到的,自定义属性 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);
}
希望这对某人有所帮助。
我添加了自定义属性 lastLogonTime
语法:UTC Coded Time
。我将 UserPrincipal
class 扩展到 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
。 None 其中有返回任何结果,但仍有符合这些条件的用户。
唯一有效的过滤器是
filter.AdvancedSearchFilter.LastLogonTime(DateTime.Now , MatchType.NotEquals);
但这基本上是在返回所有用户。知道为什么我的搜索结果没有返回任何结果吗?
我的目标是搜索上次登录时间少于 X
天的所有用户。
只要有这些用户,我愿意接受其他解决方案。
P.S。我确实知道解决这个问题的方法。遍历所有用户,获取他们的 lastLogonTime
然后进行比较,但这对我正在做的事情来说太过分了。
在这个问题上花费了一些时间之后,我发现了问题所在。
正如我在 post 中提到的,自定义属性 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);
}
希望这对某人有所帮助。