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

小山 三智男
mitchin
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
Windows Server 2008 で確認
管理ツール「Active Directory ユーザとコンピュータ」で確認
できます。
「表示」メニューの「拡張機能」にチェックを入れます。

3
属性エディタ
「属性エディタ」タブを開きます。

4
値が設定されているものだけ表示するには
「フィルタ」ボタンをクリックして「値を持つ属性のみを表示」
にチェックを入れます。(フィルタ設定は維持されます)

5
大きい整数は整数も日付も表している
「構文」列が「大きい整数/間隔」になっている属性がそうです。

表示は日付
lastLogoff は値がな
い

表示は整数

6
前回の出力
大きい整数未対応時のプロパティ出力の結果です。

7
今回の出力
大きい整数に対応したプロパティ出力の結果です。

8
IADsLargeInteger インターフェイス
前回はマネージ オブジェクトで表すことができる整数や日付、
文字列、バイト配列の値は正しく出力できましたが、COM オブ
ジェクトである "大きい整数" には対応していなかったので
「System.__ComObject」と出力されていました。
"大きい整数" は ADSI の IADsLargeInteger として扱えるので、
プロパティの値をこのインターフェイスにキャストできます。
インターフェイスのメンバは HighPart プロパティと LowPart
プロパティの 2 つです。(Int32)
この 2 つのプロパティの値から整数や日付を導出します。

9
大きい整数の属性と対象のオブジェクト
属性

表示

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
プログラムから確認するには
DirectoryEntry.Properties プロパティ(PropertyCollection
クラス)からプロパティとその値(PropertyValueCollection ク
ラス)を列挙して取得します。
未設定やオプションの属性を取得するには、スキーマ オブジェ
クト(SchemaEntry プロパティ)のネイティブ ADSI オブジェク
ト(IADsClass)の OptionalProperties で取得できるプロパ
ティ(属性)をディレクトリ ストアから読み込んで取得します。
サンプルコードは次の名前空間をインポートしています。
• ActiveDs(Active DS Type Library の参照設定が必要)
• System.IO
• System.Security.Principal
• System.Text
11
大きい整数取得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
大きい整数取得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
大きい整数取得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
大きい整数取得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
大きい整数取得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
大きい整数取得2 呼出し側の抜粋(C#)
if (pvcol.Value is byte[]) {
//バイト配列の時
//バイト値を取得
} else if (val is IADsLargeInteger) {
//大きい整数の時
var li = GetLargeIntegerValue(
pname, (IADsLargeInteger)pvcol.Value);
//大きい整数値を取得
} else {
//それ以外の時
//各値を取得
}
}
}

17
大きい整数値の取得(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
大きい整数値の取得(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
大きい整数値の取得(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
大きい整数値の取得(C#)
if ((lval == 0) || (lval == Int64.MaxValue)) {
return "(なし)";
}
return DateTime.FromFileTime(lval);
//new DateTime(1601, 1, 1).AddTicks(lval).ToLocalTime() と同じ
}

21
整数かどうかの確認(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
整数かどうかの確認(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
詳細や関連情報はブログ等で
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

More Related Content

PPTX
Active Directoryデータのプロパティ出力(Output Properties)
PPTX
.NETからActive Directoryデータにアクセス ~組織単位(OU)情報の取得と表示~
PPTX
.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~
PPTX
.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
PPTX
.NETからActive Directoryデータにアクセス ~ユーザ情報の取得と表示~
PPTX
.NETからActive Directoryデータにアクセス ~コンピュータ情報の取得と表示~
PPTX
.NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~
PDF
AndroidでActiveRecordライクにDBを使う
Active Directoryデータのプロパティ出力(Output Properties)
.NETからActive Directoryデータにアクセス ~組織単位(OU)情報の取得と表示~
.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~ユーザ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~コンピュータ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~
AndroidでActiveRecordライクにDBを使う

What's hot (20)

PPTX
.NETからActive Directoryにアクセス
PPT
実行時のために最適なデータ構造を作成しよう
PDF
jQuery超入門編
PPTX
HTMLの要素の選び方
PDF
PPTX
J qmobiはjqueryから軽量化しているか
PDF
おもにEXcelだけで出来る自動化技術
KEY
はじめてのCouch db
PPTX
BPStudy32 CouchDB 再入門
KEY
Blocksの活用法
PDF
Html5 Web Applications
PDF
Synthesijer - HLS frineds 20190511
PPTX
Entity Framework 5.0 deep dive
PDF
CoreData 非同期データ処理
PPTX
MongoDB: システム可用性を拡張するインデクス戦略
PDF
Javaでmongo db
PDF
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
PDF
Xslt
PDF
Parse introduction
PPT
Client Side Cache
.NETからActive Directoryにアクセス
実行時のために最適なデータ構造を作成しよう
jQuery超入門編
HTMLの要素の選び方
J qmobiはjqueryから軽量化しているか
おもにEXcelだけで出来る自動化技術
はじめてのCouch db
BPStudy32 CouchDB 再入門
Blocksの活用法
Html5 Web Applications
Synthesijer - HLS frineds 20190511
Entity Framework 5.0 deep dive
CoreData 非同期データ処理
MongoDB: システム可用性を拡張するインデクス戦略
Javaでmongo db
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Xslt
Parse introduction
Client Side Cache
Ad

More from Michio Koyama (15)

PPTX
Active Directoryドメインを作ってみよう ~フォレストに新しいツリーのドメインを追加~
PPTX
グループのメンバーをすべて取得する
PPTX
Active Directoryドメインを作ってみよう ~ドメインコントローラー追加後の設定~
PPTX
所属しているグループをすべて取得する
PPTX
Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
PPTX
Active Directoryドメインを作ってみよう ~ユーザーやグループの作成とPCのドメイン参加~
PPTX
Active Directory DomainのGroup ~スコープと種類、所属可能なグループとメンバー~
PPTX
Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
PPTX
Active Directoryドメインを作ってみよう ~ドメインの作成とDNSサーバーの設定~
PPTX
Active Directoryドメインを作る準備 ~AD DSとDNSサーバーのインストール~
PPTX
ユーザの LockoutTime 属性の値の確認
PPTX
Active Directoryに公開したプリンタを解除
PPTX
Move the added printer to specific OU
PPTX
Active Directory Security Descriptor ADSI - .Net
PPTX
Active Directoryデータの Security Descriptor
Active Directoryドメインを作ってみよう ~フォレストに新しいツリーのドメインを追加~
グループのメンバーをすべて取得する
Active Directoryドメインを作ってみよう ~ドメインコントローラー追加後の設定~
所属しているグループをすべて取得する
Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
Active Directoryドメインを作ってみよう ~ユーザーやグループの作成とPCのドメイン参加~
Active Directory DomainのGroup ~スコープと種類、所属可能なグループとメンバー~
Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
Active Directoryドメインを作ってみよう ~ドメインの作成とDNSサーバーの設定~
Active Directoryドメインを作る準備 ~AD DSとDNSサーバーのインストール~
ユーザの LockoutTime 属性の値の確認
Active Directoryに公開したプリンタを解除
Move the added printer to specific OU
Active Directory Security Descriptor ADSI - .Net
Active Directoryデータの Security Descriptor
Ad

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