2012-03-06 14 views
3

だから私は、インストーラにdllを表示するのに問題があるので、私のプロジェクトでActiveDを使うことを避ける方法を見つけようとしています。それを持つ唯一の理由は、pwdLastSetをLongIntegerとしてキャストすることです。ActiveDsを使用せずにActiveDirectory pwdLastSetプロパティをキャストする

私は文書化されていない代替案を発見しました。それをテストするとき、それは死んでいるか、429.49673秒遅れています。なぜ、誰にも分かりませんか? (私がテストした20/49人は429.49673秒離れている)。

UPDATE: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
+0

429秒をかけたり下?あなたは何をそれと比較していますか? –

+0

LowPartが負の場合、標準的な方法を使用して選択した場合、取得した時刻から429.49673秒後にハッキングされます。 LowPartが正の場合、ハッキングされた方法は標準的な方法と同じ時間になるようです。 – colinbashbash

答えて

5

このコードの何が問題になっているのですか?これは、正常に動作する必要があります:

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

が動作します。この混乱はおそらく、 'SearchResult'の代わりに' DirectoryEntry'のプロパティを呼び出すことによってもたらされるでしょう。 'DirectoryEntry'で' Properties ["pwdLastSet"] 'を使うと、InvalidCastExceptionが返されます。 – yosh

7

あなたはこのように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; 
} 
+1

これは機能しませんでした。 highpartに例外がスローされます。 System.MissingMethodExceptionが処理されていません HResult = -2146233070 メッセージ= 'System.Int64.HighPart'メソッドが見つかりません。 ソース= mscorlib –

関連する問題