none
アカウントの期限が設定されたユーザをクエリの定義でリスト化するには RRS feed

  • 質問

  • ActiveDirectory ユーザーとコンピュータで、ドメイン配下のUsersに表示される項目に、アカウントの有効期限を表示させる方法を教えていただけませんでしょうか。

    できれば、期限でソートして、一覧をエクスポートできる方法があれば助かります。

    期限設定の状態をある程度リアルタイムでわかると、使用者からの問い合わせに期限切れで使えないのかを即時応答
    「保存されたクエリ」に、新規作成⇒クエリ でフィルタ出来てもよいのですが、クエリの定義で期限をフィルタする方法がわかりません。

    よろしくお願いいたします。
    2009年3月12日 12:33

回答

  •  チャブーンです。

    MSFT 大久保さんから回答いただいているよう、ご要望を簡単に解決する方法は、ADSI を使って accountExpires か accountExpirationDate プロパティを引き出してソートする、ということですね。

    MS 経由のサンプルなら、Scripting Guy! がありますかね。まあかっちりした答えがでてるので、いまさら、かもしれませんが。

    一応細かいコメントですが、ADUC (管理スナップイン) の中身(プロパティ画面やコンテキストメニュー動作)をいじるためには、基本的に COM ベースで新規に開発し Display Specifier オブジェクトに UI 登録する必要があります。COM での開発ができない場合 VBScript でもできなくはないですが、もちろん UI も wscript.exe ベースです。

    その意味では、一番簡単なのは uet user [ユーザ名] /domain コマンドかもしれませんね。パイプラインで findstr コマンドと上手に組み合わせれば、特定ユーザの、アカウント期限の表示は簡単にできます。

    net user <username> /domain|findstr "名 アカウントの期限"

    さらに for /F コマンドと組み合わせてバッチを書けば(ちょっと知恵がいりますが)、リストにするところまではできるでしょう。ソートはバッチでは難しいですけれども。

    追加:
    ADUC からクエリを定義して使いたい、ということですが、カスタムクエリを定義することで、検索抽出自体は可能です。

    (&(objectCategory=person)(objectClass=user)(accountExpires>=128813436000000000))

    たとえばうえはユーザオブジェクトのaccountExpires属性が 2009/03/13 以上という LDAP クエリです。条件が合えば、アカウントが検索に表示されます。ただし、日付そのものは検索クエリ上で表示することはできません(UIがないので)。またaccountExpires属性の値を算出して指定する必要がありますね。
    • 編集済み チャブーンMVP, Moderator 2009年3月13日 14:49 クエリに関する内容の追加・修正
    • 回答としてマーク 2009年3月23日 2:45
    2009年3月13日 13:05
    モデレータ

すべての返信

  •  こんにちは、フォーラムオペレータ大久保です。

    こんなのではいかがでしょうか?(MS以外のサイトで申し訳ありません)


    期限切れのユーザーアカウント一覧の作成
    http://pwp1.atcms.jp/mokurin/index.php?ADSI%2F%A5%E6%A1%BC%A5%B6%A1%BC#h1eef6a2

    参考になれば。
    マイクロソフト株式会社 フォーラム オペレータ 大久保 直美
    2009年3月13日 9:09
  •  チャブーンです。

    MSFT 大久保さんから回答いただいているよう、ご要望を簡単に解決する方法は、ADSI を使って accountExpires か accountExpirationDate プロパティを引き出してソートする、ということですね。

    MS 経由のサンプルなら、Scripting Guy! がありますかね。まあかっちりした答えがでてるので、いまさら、かもしれませんが。

    一応細かいコメントですが、ADUC (管理スナップイン) の中身(プロパティ画面やコンテキストメニュー動作)をいじるためには、基本的に COM ベースで新規に開発し Display Specifier オブジェクトに UI 登録する必要があります。COM での開発ができない場合 VBScript でもできなくはないですが、もちろん UI も wscript.exe ベースです。

    その意味では、一番簡単なのは uet user [ユーザ名] /domain コマンドかもしれませんね。パイプラインで findstr コマンドと上手に組み合わせれば、特定ユーザの、アカウント期限の表示は簡単にできます。

    net user <username> /domain|findstr "名 アカウントの期限"

    さらに for /F コマンドと組み合わせてバッチを書けば(ちょっと知恵がいりますが)、リストにするところまではできるでしょう。ソートはバッチでは難しいですけれども。

    追加:
    ADUC からクエリを定義して使いたい、ということですが、カスタムクエリを定義することで、検索抽出自体は可能です。

    (&(objectCategory=person)(objectClass=user)(accountExpires>=128813436000000000))

    たとえばうえはユーザオブジェクトのaccountExpires属性が 2009/03/13 以上という LDAP クエリです。条件が合えば、アカウントが検索に表示されます。ただし、日付そのものは検索クエリ上で表示することはできません(UIがないので)。またaccountExpires属性の値を算出して指定する必要がありますね。
    • 編集済み チャブーンMVP, Moderator 2009年3月13日 14:49 クエリに関する内容の追加・修正
    • 回答としてマーク 2009年3月23日 2:45
    2009年3月13日 13:05
    モデレータ
  • とてもわかりやすい回答で、とても助かりました。
    ありがとうございます。

    バッチリとリスト化できました。

    使用例としては、こんな感じになりますね。

    ・次の条件にあてはまるユーザをリストにする。
    条件1:アカウントが有効になっている。
    条件2:2009/03/31~2009/04/01にアカウントが有効期限となる。
    (&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(accountExpires>=128829852000000000)(accountExpires<=128831580000000000)))

    条件2:2009/03/30以前にアカウントが有効期限となる。
    (&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(accountExpires>=1)(accountExpires<=128828988000000000)))

    これなら、期限を表示できなくても、知りたい期限でリスト化できるので、即時応答できる上、次の案内対象のリストまで完成します。
    バッチリ活用させていただきます。

    返信が遅くなってスミマセンでした。
    クエリの値が1601/01/02 00:00:00からという発見と算出のころで、少々時間がかかってしまいました。
    2009年3月23日 3:17