【问题标题】:Retrieving User Account Expiration from ActiveDirectory从 ActiveDirectory 检索用户帐户过期
【发布时间】:2013-08-14 12:48:34
【问题描述】:

我正在尝试从帐户中检索到期日期。

我试过了

DirectoryEntry user = new DirectoryEntry(iMem);

var AccountExpiration = DateTime.FromFileTime((int)user.Properties["accountExpires"].Value);

它不起作用,只会给我错误“指定的演员表无效”。

当我使用时

var AccountExpiration = user.Properties["accountExpires"];

返回一个我无法读取的 com 对象。

使用windows powershell,工作正常,我不明白为什么这不起作用...

这是我在 powershell 中使用的代码

$Expires = [datetime]::FromFileTime($tmpUser.accountExpires)

【问题讨论】:

    标签: c# active-directory


    【解决方案1】:

    您可以使用System.DirectoryServices.AccountManagement 命名空间来完成此任务。从PrincipalContext 获得UserPrincipal 后,您可以检查UserPrincipal.AccountExpirationDate 属性。

    PrincipalContext context = new PrincipalContext(ContextType.Domain);
    
    UserPrincipal p = UserPrincipal.FindByIdentity(context, "Domain\\User Name");
    
    if (p.AccountExpirationDate.HasValue)
    {
        DateTime expiration = p.AccountExpirationDate.Value.ToLocalTime();
    }
    

    如果您确实想使用DirectoryEntry,请执行以下操作:

    //assume 'user' is DirectoryEntry representing user to check
    DateTime expires = DateTime.FromFileTime(GetInt64(user, "accountExpires"));
    
    private Int64 GetInt64(DirectoryEntry entry, string attr)
    {
        //we will use the marshaling behavior of the searcher
        DirectorySearcher ds = new DirectorySearcher(
        entry,
        String.Format("({0}=*)", attr),
        new string[] { attr },
        SearchScope.Base
        );
    
        SearchResult sr = ds.FindOne();
    
        if (sr != null)
        {
            if (sr.Properties.Contains(attr))
            {
                return (Int64)sr.Properties[attr][0];
            }
        }
    
        return -1;
    }
    

    解析accountExpires 值的另一种方法是使用反射:

    private static long ConvertLargeIntegerToLong(object largeInteger)
    {
        Type type = largeInteger.GetType();
    
        int highPart = (int)type.InvokeMember("HighPart", BindingFlags.GetProperty, null, largeInteger, null);
        int lowPart = (int)type.InvokeMember("LowPart", BindingFlags.GetProperty | BindingFlags.Public, null, largeInteger, null);
    
        return (long)highPart <<32 | (uint)lowPart;
    }
    
    object accountExpires = DirectoryEntryHelper.GetAdObjectProperty(directoryEntry, "accountExpires");
    var asLong = ConvertLargeIntegerToLong(accountExpires);
    
    if (asLong == long.MaxValue || asLong <= 0 || DateTime.MaxValue.ToFileTime() <= asLong)
    {
        return DateTime.MaxValue;
    }
    else
    {
        return DateTime.FromFileTimeUtc(asLong);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 2016-09-20
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      相关资源
      最近更新 更多