运维开发网

c# – 在不使用ActiveD的情况下强制转换ActiveDirectory pwdLastSet属性

运维开发网 https://www.qedev.com 2020-05-09 15:04 出处:网络 作者:运维开发网整理
好.所以我试图找到一种方法来避免在我的项目中包含ActiveD,因为我无法让dll显示在安装程序中.获得它的唯一原因是将pwdLastSet强制转换为LongInteger. 我找到了一个无证的替代品.在测试时,它要么死了,要么关闭429.49673秒.我不知道为什么,有人有任何想法吗? (我测试的20/49人是429.49673秒). 更新:看起来当LowPart为负时会发生这种情况. 码: p
好.所以我试图找到一种方法来避免在我的项目中包含ActiveD,因为我无法让dll显示在安装程序中.获得它的唯一原因是将pwdLastSet强制转换为LongInteger.

我找到了一个无证的替代品.在测试时,它要么死了,要么关闭429.49673秒.我不知道为什么,有人有任何想法吗? (我测试的20/49人是429.49673秒).

更新:看起来当LowPart为负时会发生这种情况.

码:

private static string DateTest() {
        return DateTest(Environment.UserName);
    }
    private static string DateTest(string userName) {
        userName = userName.Trim();
        DateTime hacked, normal;
        using (DirectorySearcher ds = new DirectorySearcher()) {
            ds.SearchScope = SearchScope.Subtree;
            ds.PropertiesToLoad.Add("distinguishedName");
            ds.PropertiesToLoad.Add("pwdLastSet");
            ds.PageSize = 1;
            ds.ServerPageTimeLimit = TimeSpan.FromSeconds(2);
            ds.Filter = string.Format("(&(objectCategory=user)(sAMAccountName={0}))", userName);

            SearchResult sr = ds.FindOne();
            hacked = DateTime.FromFileTime((long)sr.Properties["pwdLastSet"][0]);

            using (DirectoryEntry user = sr.GetDirectoryEntry()) {
                var value = user.Properties["pwdLastSet"][0] as ActiveDs.LargeInteger;
                var longValue = (((long)value.HighPart) << 32) + (long)value.LowPart;
                normal = DateTime.FromFileTime(longValue);
            }
        }

        return string.Format("{3} - Difference: {0:0.0} seconds. Established Method returns: {1}. Hacked method returns: {2}",
            hacked.Subtract(normal).TotalSeconds, normal, hacked, userName);
    }
}

参考文献:

> Active DS类型库

> System.DirectoryServices

你需要像这样翻译AD Long Integer,你不再需要ActiveDs了:

long pwdLastSet = CovertADSLargeIntegerToInt64(oUser.Properties["pwdLastSet"].Value);

public static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger)
{
  var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
  var lowPart  = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart",  System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
  return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消