【问题标题】:DirectoryServices DirectoryEntry get pwdLastSet property c#DirectoryServices DirectoryEntry 获取 pwdLastSet 属性 c#
【发布时间】:2018-02-14 00:04:18
【问题描述】:

我正在尝试创建一个 bool 属性来切换 pwdLastSet 属性。

public bool UserMustChangePassword
{
    get { return (long)Entry.Properties["pwdLastSet"].Value == 0; }
    set
    {
        if (value) 
        {
            Entry.Properties["pwdLastSet"].Value = 0; 
        }
        else 
        { 
            Entry.Properties["pwdLastSet"].Value = -1; 
        }
    }                                                                                   
}

我可以成功设置属性但是我无法读取属性。我不断收到以下铸造错误。

System.InvalidCastException: '指定的强制转换无效。'

是否有读取此属性的特定方法。我知道UserPrincipal 可能是可能的,但是我想使用DirectoryEntry 来保持代码一致。

编辑:在投射前检查 null

public bool UserMustChangePassword
{
    get
    {
        var value = Entry.Properties["pwdLastSet"].Value;

        if (value != null)
            return (long)Entry.Properties["pwdLastSet"].Value == 0;

        return false;
    }
    set
    {
        if (value) 
        {
            Entry.Properties["pwdLastSet"].Value = 0; 
        }
        else 
        { 
            Entry.Properties["pwdLastSet"].Value = -1; 
        }
    }                                                                                   
}

【问题讨论】:

  • 需要在 getter 中检查 null,不能将 null 转换为 long。
  • @kennyzx 我曾想过。不幸的是,我仍然遇到同样的错误。我也无法将其转换为(长?)
  • 展示如何在投射前检查 null。
  • Value 属性的类型是什么?它可以是长以外的东西吗?
  • @kennyzx 见上文

标签: c# active-directory ldap directoryservices directoryentry


【解决方案1】:

您需要检查其 Count 属性以确保有一个值。试试这个,

if (Entry.Properties["pwdLastSet"].Count > 0)
{
    return (Entry.Properties["pwdLastSet"][0] == 0)
}
else 
    return false;

编辑:

似乎问题出在您查询的是 DirectoryEntry 的属性而不是 SearchResult。见this question。我有一份也在查询 SearchResult 的工作代码。

【讨论】:

  • 我认为问题在于铸造类型。计数 > 0。
  • System.DirectoryServices.DirectoryEntry 实例没有 pwdLastSet 属性。得先得到一个 SearchResultCollection 然后循环遍历每个 SearchResult 实例,然后再得到 pwdLastSet 属性吧?
  • 不,我设置得很好。问题在于获得价值。它可能与 .NET Int64 的 AD INTEGER8 类型有关。在这里查看第三个帖子:bytes.com/topic/visual-basic-net/answers/…
  • 我不知道问题出在哪里,但我发现设置 passwordExpired 标志做同样的事情,我已经有办法使用按位运算符来设置标志。 @kennyzx 感谢您的帮助
  • 好的,np,这应该是缺少值和/或无效类型转换的简单问题,很高兴您找到了解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多