Your SlideShare is downloading. ×
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Active Directoryデータの "大きい整数"

398

Published on

Active Directory データの "大きい整数"LargeInteger で表される属性値を取得・表示する

Active Directory データの "大きい整数"LargeInteger で表される属性値を取得・表示する

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
398
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Active Directoryデータの "大きい整数" LargeInteger で表される属性値を取得・表示する 小山 三智男 mitchin
  • 2. Active Directoryデータのプロパティ出力 以前、Active Directory データのプロパティ出力ということで、 ユーザやグループなどの属性とその値の出力のしかたをサンプル コードと共に紹介しました。 http://www.slideshare.net/mitchin227/output-properties これをサンプルアプリに組み込めば出力できるようになります。 サンプルアプリとスライドはこちら .NET4用(ユーザ、グループの表示まで実装) http://blogs.wankuma.com/mitchin/archive/2013/08/26/328083.aspx .NET4.5.1用(ユーザ、グループ、コンピュータの表示まで実装) http://blogs.wankuma.com/mitchin/archive/2013/11/24/328243.aspx 2
  • 3. Windows Server 2008 で確認 管理ツール「Active Directory ユーザとコンピュータ」で確認 できます。 「表示」メニューの「拡張機能」にチェックを入れます。 3
  • 4. 属性エディタ 「属性エディタ」タブを開きます。 4
  • 5. 値が設定されているものだけ表示するには 「フィルタ」ボタンをクリックして「値を持つ属性のみを表示」 にチェックを入れます。(フィルタ設定は維持されます) 5
  • 6. 大きい整数は整数も日付も表している 「構文」列が「大きい整数/間隔」になっている属性がそうです。 表示は日付 lastLogoff は値がな い 表示は整数 6
  • 7. 前回の出力 大きい整数未対応時のプロパティ出力の結果です。 7
  • 8. 今回の出力 大きい整数に対応したプロパティ出力の結果です。 8
  • 9. IADsLargeInteger インターフェイス 前回はマネージ オブジェクトで表すことができる整数や日付、 文字列、バイト配列の値は正しく出力できましたが、COM オブ ジェクトである "大きい整数" には対応していなかったので 「System.__ComObject」と出力されていました。 "大きい整数" は ADSI の IADsLargeInteger として扱えるので、 プロパティの値をこのインターフェイスにキャストできます。 インターフェイスのメンバは HighPart プロパティと LowPart プロパティの 2 つです。(Int32) この 2 つのプロパティの値から整数や日付を導出します。 9
  • 10. 大きい整数の属性と対象のオブジェクト 属性 表示 U ser G roup C om puter OU Pri nter V ol e um accountExpi res 日付 ○ ○ badPassw ordT i e m 日付 ○ ○ l astC ontentIndexed 日付 l astLogoff 日付 ○ ○ l astLogon 日付 ○ ○ l astLogonT i estam p m 日付 ○ ○ l ockoutT i e m 日付/整数 ○ ○ m axS torage 整数 ○ ○ m sD S -C ached-M em bershi i e-S tam p p-T m 日付 ○ ○ m sD S -LastFai edInteracti l veLogonT i e m 日付 ○ ○ m sD S -LastS uccessful Interacti veLogonT i e m 日付 ○ ○ m sD S -U serPassw ordExpi i eC om puted ryT m 日付 ○ ○ pw dLastS et 日付 ○ ○ uS N C hanged 整数 ○ ○ ○ ○ ○ ○ uS N C reated 整数 ○ ○ ○ ○ ○ ○ uS N D S A LastO bjR em oved 整数 ○ ○ ○ ○ ○ ○ uS N LastO bjR em 整数 ○ ○ ○ ○ ○ ○ uS N S ource 整数 ○ ○ ○ ○ ○ ○ ○ 10
  • 11. プログラムから確認するには DirectoryEntry.Properties プロパティ(PropertyCollection クラス)からプロパティとその値(PropertyValueCollection ク ラス)を列挙して取得します。 未設定やオプションの属性を取得するには、スキーマ オブジェ クト(SchemaEntry プロパティ)のネイティブ ADSI オブジェク ト(IADsClass)の OptionalProperties で取得できるプロパ ティ(属性)をディレクトリ ストアから読み込んで取得します。 サンプルコードは次の名前空間をインポートしています。 • ActiveDs(Active DS Type Library の参照設定が必要) • System.IO • System.Security.Principal • System.Text 11
  • 12. 大きい整数取得1 呼出し側の抜粋(VB) Public Shared Sub OutputProperties( entry As DirectoryEntry, filePath As String) Dim props = entry.Properties.PropertyNames.Cast( Of String)().OrderBy(Function(s) s).ToList() 'プロパティ名のリス ト For Each pname In props 'プロパティ数分 Dim val = entry.Properties.Item(pname).Value If TypeOf val Is Byte() Then 'バイト配列の時 'バイト値を取得 ElseIf TypeOf val Is IADsLargeInteger Then '大きい整数の時 Dim li = GetLargeIntegerValue( pname, DirectCast(val, IADsLargeInteger)) '大きい整数値を取得 Else 'それ以外の時 '各値を取得 End If Next End Sub 12
  • 13. 大きい整数取得1 呼出し側の抜粋(C#) public static void OutputProperties( DirectoryEntry entry, string filePath) { var props = entry.Properties.PropertyNames. Cast<string>().OrderBy(s => s).ToList(); //プロパティ名のリスト foreach (var pname in props) { //プロパティ数分 var val = entry.Properties[pname].Value; if (val is byte[]) { //バイト配列の時 //バイト値を取得 } else if (val is IADsLargeInteger) { //大きい整数の時 var li = GetLargeIntegerValue( pname, (IADsLargeInteger)val); //大きい整数値を取得 } else { //それ以外の時 //各値を取得 } } } 13
  • 14. 大きい整数取得2 呼出し側の抜粋(VB) Public Shared Sub OutputOptionalProperties( entry As DirectoryEntry, filePath As String) Dim schema = DirectCast( entry.SchemaEntry.NativeObject, IADsClass) 'スキーマ オブジェクト Dim props = DirectCast( schema.OptionalProperties, Object()) 'オプションのプロパティ 'プロパティをディレクトリ ストアから読込 entry.Invoke("GetInfoEx", props, 0) For Each pname As String In props 'オプションのプロパティ数分 Dim pvcol = entry.Properties.Item(pname) 'PropertyValueCollection If pvcol.Value Is Nothing Then '値がない時 Continue For End If 14
  • 15. 大きい整数取得2 呼出し側の抜粋(VB) If TypeOf pvcol.Value Is Byte() Then 'バイト配列の時 'バイト値を取得 ElseIf TypeOf pvcol.Value Is IADsLargeInteger Then '大きい整数の時 Dim li = GetLargeIntegerValue(pname, DirectCast(pvcol.Value, IADsLargeInteger)) '大きい整数値を取得 Else 'それ以外の時 '各値を取得 End If Next End Sub 15
  • 16. 大きい整数取得2 呼出し側の抜粋(C#) public static void OutputOptionalProperties( DirectoryEntry entry, string filePath) { //スキーマ オブジェクト var schema = (IADsClass)entry.SchemaEntry.NativeObject; //オプションのプロパティ var props = (object[])schema.OptionalProperties; //プロパティをディレクトリ ストアから読込 entry.Invoke("GetInfoEx", props, 0); foreach (string pname in props) { //オプションのプロパティ数分 var pvcol = entry.Properties[pname]; //PropertyValueCollection if (pvcol.Value == null) { //値がない時 continue; } 16
  • 17. 大きい整数取得2 呼出し側の抜粋(C#) if (pvcol.Value is byte[]) { //バイト配列の時 //バイト値を取得 } else if (val is IADsLargeInteger) { //大きい整数の時 var li = GetLargeIntegerValue( pname, (IADsLargeInteger)pvcol.Value); //大きい整数値を取得 } else { //それ以外の時 //各値を取得 } } } 17
  • 18. 大きい整数値の取得(VB) Private Shared Function GetLargeIntegerValue( name As String, value As IADsLargeInteger) As Object Dim lval = Convert.ToInt64(value.HighPart.ToString("x8") & value.LowPart.ToString("x8"), 16) If name.Equals("lockoutTime") Then 'ロックアウトしたことがある時 If lval > 0 Then 'ロックアウト中又はロックアウト期間が過ぎただけの 時 Return String.Format("{0}({1})", lval, DateTime.FromFileTime(lval)) '判り易いよう日付も付ける End If Return lval End If If IsInteger(name, lval) Then '整数の時 Return New Guid(value).ToString() End If 18
  • 19. 大きい整数値の取得(VB) If (lval = 0) OrElse (lval = Int64.MaxValue) Then Return "(なし)" End If Return DateTime.FromFileTime(lval) '#1/1/1601#.AddTicks(lval).ToLocalTime() と同じ End Function 19
  • 20. 大きい整数値の取得(C#) private static object GetLargeIntegerValue( string name, IADsLargeInteger value) { var lval = Convert.ToInt64(value.HighPart.ToString("x8") + value.LowPart.ToString("x8"), 16); //(long)((uint)value.LowPart + (((long)value.HighPart) << 32)) と同 じ if (name.Equals("lockoutTime")) { //ロックアウトしたことがある時 if (lval > 0) { //ロックアウト中又はロックアウト期間が過ぎただけ の時 return String.Format("{0}({1})", lval, DateTime.FromFileTime(lval)); //判り易いよう日付も付け る } return lval; } if (IsInteger(name, lval)) { //整数の時 20
  • 21. 大きい整数値の取得(C#) if ((lval == 0) || (lval == Int64.MaxValue)) { return "(なし)"; } return DateTime.FromFileTime(lval); //new DateTime(1601, 1, 1).AddTicks(lval).ToLocalTime() と同じ } 21
  • 22. 整数かどうかの確認(VB) Private Shared Function IsInteger( name As String, value As Long) As Boolean If name.Equals("maxStorage") Then Return True End If If name.StartsWith("msDs-") Then Return False End If If name.StartsWith("uSN") Then Return True End If Return False End Function 22
  • 23. 整数かどうかの確認(C#) private static bool IsInteger(string name, long value) { if (name.Equals("maxStorage")) { return true; } if (name.StartsWith("msDs-")) { return false; } if (name.StartsWith("uSN")) { return true; } return false; } 23
  • 24. 詳細や関連情報はブログ等で Active Directoryデータのプロパティ出力 http://blogs.wankuma.com/mitchin/archive/2013/09/19/328123.aspx http://blogs.wankuma.com/mitchin/archive/2013/09/20/328126.aspx 大きい整数(LargeInteger)、大きい整数(LargeInteger)の属性 http://blogs.wankuma.com/mitchin/archive/2013/11/29/328258.aspx http://blogs.wankuma.com/mitchin/archive/2013/12/01/328262.aspx lockoutTime属性の値の確認 http://blogs.wankuma.com/mitchin/archive/2013/12/02/328265.aspx 大きい整数で表わされる対話型ログオンの属性値の確認 http://blogs.wankuma.com/mitchin/archive/2013/12/03/328270.aspx Active Directoryデータのプロパティ出力のCOM対応版 http://blogs.wankuma.com/mitchin/archive/2013/12/04/328271.aspx http://blogs.wankuma.com/mitchin/archive/2013/12/05/328273.aspx COM対応版の変更点の説明(大きい整数関連) http://blogs.wankuma.com/mitchin/archive/2013/12/06/328275.aspx 24

×