Active Directory データのプロパティ出力の COM 対応版について、4 つの変更点の最後 4 つ目の説明です。
プロパティ出力(OutputProperties)の方は、
以前は値がバイト配列以外の時は各値をそのまま出力してました。(以前のコードはこちら VB C#)
今回はそこを GetValue メソッドを呼び出して、取得した値を出力するようにしました。(今回のコードはこちら VB C#)
オプションのプロパティ出力(OutputOptionalProperties)の方は、
以前はプロパティの型がバイト配列の時は BitConverter.ToString メソッドで変換した値を出力してましたが、今回は既存の GetByteValue メソッドを呼び出して、取得した値を出力するようにしました。
また、各値がバイト配列以外の時は、プロパティ出力(OutputProperties)同様 値をそのまま出力してましたが、GetValue メソッドを呼び出して、取得した値を出力するようにしました。
GetValue メソッド側の方は、
受け取った Object 型の値が日付じゃない時は、数値や文字列なのでそのまま返してます。
日付なら日付に変換します。
変換した日付が 1601/1/1 ならその日付を返し、そうじゃなければ現地時刻に変換して返してます。
ここで日付の確認で d.Date.Equals というように、DateTime.Date プロパティに対して Equals メソッドを使ってます。
色々テストしてみたところ、まずは日付が 1601/1/1 になる可能性がある属性は dSCorePropagationData だけみたいで、しかも値が複数の場合はそのうちの 1 つが 1601/1/1 になることがあるようです。
※クリックすると新しいウィンドウで拡大図が表示されます。

でもなぜか時刻部分が 0:00:05 になってたので、日付部分を比較するようにしました。
1601/1/1 じゃなければちゃんとした日時なので、DateTime.ToLocalTime メソッドで現地時刻に変換してます。
1601/1/1 の時は現地時刻に変換すると日本の場合は 9 時間ずれてしまうので分けてます。