C# 在不使用ActiveDs的情况下强制转换ActiveDirectory pwdLastSet属性

C# 在不使用ActiveDs的情况下强制转换ActiveDirectory pwdLastSet属性,c#,active-directory,C#,Active Directory,嗯。因此,我试图找到一种方法来避免在我的项目中包含ActiveD,因为我很难在安装程序中显示dll。拥有它的唯一原因是将pwdLastSet铸造为长柄机 我找到了一个没有记录的替代品。测试时,它要么完全打开,要么关闭429.49673秒。我不知道为什么,有人知道吗?(我测试的49人中有20人的成绩是429.49673秒) 更新:当低部分为负数时,似乎会发生这种情况 代码: private静态字符串DateTest(){ 返回日期测试(Environment.UserName); } 私有静态字符

嗯。因此,我试图找到一种方法来避免在我的项目中包含ActiveD,因为我很难在安装程序中显示dll。拥有它的唯一原因是将pwdLastSet铸造为长柄机

我找到了一个没有记录的替代品。测试时,它要么完全打开,要么关闭429.49673秒。我不知道为什么,有人知道吗?(我测试的49人中有20人的成绩是429.49673秒)

更新:当低部分为负数时,似乎会发生这种情况

代码:

private静态字符串DateTest(){
返回日期测试(Environment.UserName);
}
私有静态字符串DateTest(字符串用户名){
userName=userName.Trim();
DateTime黑客攻击,正常;
使用(DirectorySearcher ds=new DirectorySearcher()){
ds.SearchScope=SearchScope.Subtree;
ds.PropertiesToLoad.Add(“区分名称”);
ds.PropertiesToLoad.Add(“pwdLastSet”);
ds.PageSize=1;
ds.ServerPageTimeLimit=TimeSpan.FromSeconds(2);
ds.Filter=string.Format(&(objectCategory=user)(sAMAccountName={0})),用户名);
SearchResult sr=ds.FindOne();
hacked=DateTime.FromFileTime((long)sr.Properties[“pwdLastSet”][0]);
使用(DirectoryEntry user=sr.GetDirectoryEntry()){
var value=user.Properties[“pwdLastSet”][0]作为ActiveDs.LargeInteger;

var longValue=((long)value.HighPart)这段代码有什么问题吗?它应该可以正常工作:

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

您将需要像这样转换AD长整数,并且不再需要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;
}

429秒以上或以下?你将它与什么进行比较?如果低部分是负数,那么我正在进行的黑客攻击方式是429.49673秒,如果你使用标准的获取方法来选择它。如果低部分是正数,那么黑客攻击方式似乎与标准方法获得的时间相同。这不起作用k、 highpart上引发异常。System.MissingMethodException未经处理HResult=-2146233070 Message=Method'System.Int64.highpart'未找到。Source=mscorlibit有效。混淆可能来自调用
DirectoryEntry
的属性,而不是
搜索结果
。如果使用
属性[“pwdLastSet”]
目录条目上,您将获得InvalidCastException。
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;
}