2012年10月21日日曜日

Active Directoryに参加させたコンピュータアカウントを調べる方法(とカウントを減らす方法)

あまり知られていないかもしれませんが(自分も最近知った)、一般ユーザがActive Directoryに参加させることができるコンピュータの数は、デフォルトで10台までに制限されています。

検索してみると、この制限が発生する仕組みや解除方法についてはあちこちに情報がある(たとえばIT Proの記事)のですが、

  1. 上限に達した時の対処方法(制限を解除するのではなく参加させた台数のカウントを減らす方法)
  2. 特定のユーザがドメインに参加させたコンピュータを調べる方法

といった情報がなかなか見つからなかったので、ここにまとめておきます。

まず 1. について。
誰がコンピュータをドメインに参加させたのか(正確には、コンピュータアカウントがどのユーザによって作成されたのか)という情報は、コンピュータアカウントの mS-DS-CreatorSID 属性に SID で記録されています。
Administrator や Account Operators グループのメンバーなど、台数の制約がないユーザが参加させたコンピュータアカウントではこの属性の値が空になっているため、カウントを減らす方法はに以下の二つが考えられます。

  • 古いコンピュータアカウントを削除する
    dsquery コマンドなどで一定期間以上ログオンされていないコンピュータアカウントを抽出して削除すれば、自動的にカウントが減ります。
  • mS-DS-CreatorSID 属性の値を空にする
    ADSI Edit などのツールを使って、カウントを減らしたい対象のユーザがドメインに参加させたコンピュータアカウントの属性をクリアします。(Account Operators グループのメンバーがドメインに参加させたコンピュータアカウントと同じ状態にします)

通常は前者の方法でよいと思いますが、後者の方法をとりたい場合は、作業対象を把握するために 2. の方法についても考慮する必要があります。

次に 2. についてですが、残念ながら特定のユーザがドメインに参加させたコンピュータアカウントを簡単に検索することはできないようです。
標準ツールの 「Active Directory ユーザーとコンピューター」 では mS-DS-CreatorSID 属性は検索対象に選べないし、その他のツールを使う場合でも、ユーザID(SAM ID)からSIDを調べ、それからコンピュータアカウントを検索するという二度手間が必要で煩雑。
いい方法がないか調べてみたのですが、なかなか見つからなかったので WSH スクリプトを作成してみました。

やっていることは単純で、

  1. WMI を使って Active Directory 上のユーザアカウントを検索し、SID を取得
  2. Active Directory に LDAP 接続し、コンピュータアカウントの mS-DS-CreatorSID 属性が上記の SID にマッチするものを検索

といった感じです。

スクリプトはまだちょこちょこ直していますので、最新版はGitHubから参照ください。
ファイルをそのままダウンロードして cscript で実行すれば OK。
引数のフォーマットは変えるかもしれませんが、現状では検索対象のユーザID(SAM ID)をスペースで区切って並べるようになっています。

なお、VBA でなく JScript でスクリプトを書いているのは趣味です。(^_^;

2012年10月20日土曜日

2012年11月のコミックス

  • 9日 - 7SEEDS(23)
  • 16日 - capeta(30)
  • 30日 - 深夜食堂(10)
    • 聖様
  • 30日 - おやすみプンプン(11)
  • 30日 - ぼおるぺん古事記(3) 海の巻

2012年9月16日日曜日

2012年10月のコミックス

  • 4日 - テガミバチ(15)
    • リマインド用
  • 9日 - 87CLOCKERS(2)
  • 18日 - 銀の匙 Silver Spoon(5)
  • 18日 - 最上の明医 ~ザ・キング・オブ・ニート~(11)
    • リマインド用
  • 23日 - おおきく振りかぶって(20)
  • 23日 - 変ゼミ(7)
  • 23日 - 宇宙兄弟(19)
  • 27日 - 黒執事(15)
    • リマインド用
  • 27日 - プアプアLIPS(4)

2012年9月15日土曜日

2012年9月のコミックス

  • 13日 - ちはやふる(18)
    • OIK. 様
  • 14日 - Pumpkin Scissors(16)
    • OIK. 様
  • 15日 - 特攻の島(5)
  • 19日 - 神様ドォルズ(11)
    • リマインド用

2012年8月5日日曜日

2012年8月のコミックス

  • 9日 - 進撃の巨人(8)
    • 聖様
  • 10日 - おひとり様物語(4)
  • 17日 - capeta(29)
  • 17日 - 最上の明医 ~ザ・キング・オブ・ニート~(10)
    • リマインド用
  • 17日 - 絶対可憐チルドレン(31)
    • OIK. 様

2012年6月23日土曜日

2012年7月のコミックス

  • 2日 - 多重人格探偵サイコ(17)
    • 聖様
  • 4日 - バクマン。(20)
  • 18日 - 銀の匙 Silver Spoon(4)
  • 19日 - イエスタデイをうたって(8)
  • 19日 - 恋愛ディストーション(6)
  • 30日 - それでも町は廻っている(10)
    • リマインド用
  • 30日 - 青い花(7)
  • 30日 - チャンネルはそのまま!(5)
  • 31日 - 特攻の島(5)

2012年5月27日日曜日

雪見酒版ruby-modeでxyzzyのバッファ単位にタブ幅を指定できるようにする方法

今年に入り、ついにGitHubで開発が進んでいたxyzzyのリリース(0.2.2.236以降)が始まりました。
個人的にはUnicode周りの認識精度向上と、マルチモニタ環境でのウィンドウ位置保存バグの修正が嬉しいです。
有志の皆さんに感謝。

Rubyでコードを書くことが多い(たまにですが)僕としては、標準のモジュールにruby-modeが含まれてくれるとうれしいのですが、現在最新のリリース(0.2.2.238)にはまだ含まれていないので、服部さんのruby-modeを元に雪見酒さんが作成したruby-modeを使わせていただいています。

僕はちょっとしたスクリプトを書く程度なのでruby-modeの機能を使いこなしてはいないのですが、雪見酒版のruby-modeで困ったのがタブのインデント設定。
ドキュメントにある通り、服部版にあった *ruby-indent-column* が廃止され、共通設定のタブ幅((tab-columns) が返す値)を使うようになったのは良いのですが、共通設定とバッファのローカル設定が異なる場合が考慮されていないので(xyzzy 本体の 0.2.0.133 でも同様の問題が修正された形跡が……)、共通設定は互換性のためタブ幅を8としておき、Rubyプログラムを編集するバッファだけ自動でタブ幅を2や4にするといったことができないのです。

何とかならないかとマジメに調べてみたら、意外と簡単でした。
(オリジナルは ruby-mode100704.lzh より。表示幅の関係でコードの右端が切れている場合はこちらからご覧ください)

$ diff ruby-mode.l.orig ruby-mode.l366c366<                                       (insert " " (* level (tab-columns)))--->                                       (insert " " (* level (tab-columns (selected-buffer))))

これでバッファごとのタブ幅がインデントに反映されるようになるので、あとは .xyzzy に以下のような設定を追加すればOK。

(add-hook '*ruby-mode-hook* #'(lambda () (set-tab-columns 4 (selected-buffer))))

バッファローカルな tab-columns の考慮漏れだと思うので、雪見酒版にマージしていただけるとありがたいのだけど……。