Active Directory 環境の確認手順

Active Directory (AD) の環境を調査するときにどこを見ればよいかの覚書です。 何も把握できていないのに既に導入業者と没交渉、という感じのお客様環境を調べる時に使えます! Windows Server 2003/2008 のドメインコントローラ上で調べることを想定していますが、2003 の場合 Support Tools を必要とする内容もあります。 Windows Server 2003 の時代に書いた (けど放置していた) ものを手直ししています。

フォレスト名、ドメイン名の確認

まず、そのコンピュータが属しているドメインは「コンピューター」のプロパティで確認できます。

関連するドメインを見たい場合は「ドメインと信頼関係」ツールを起動するとドメインが一覧表示されます。 フォレスト名は「ドメインと信頼関係」ツールでツリー最上階層 (「Active Directory ドメインと信頼関係」) のコンテキストメニューから選べる「フォレストの機能レベルをあげる(or 機能レベルの昇格)」の画面で確認できます。

ドメインコントローラの一覧

ドメインコントローラの一覧を得る方法として、まず考えられるのは「Active Directory ユーザとコンピューター」ツールで「Domain Controllers」OU 内の Computer オブジェクトを見ることです。 ここがドメインコントローラを格納する規定の位置です。 Computer オブジェクトのプロパティを確認すれば使用 OS 等の情報も得られます。

しかし、実際はディレクトリをカスタマイズして、これ以外の OU にドメインコントローラ (DC) オブジェクトを動かすこともできます。 その場合は、ディレクトリを検索しなければなりません。 先のリンクのように VB スクリプトを流す他、同じ内容を ldp.exe で検索するという手もあります。 ldp.exe でドメインコントローラのディレクトリサービス (ポート 389番) に対し bind 実行後、以下のように検索すると良いでしょう。(ドメイン名 example.com の場合)

Base Dn: CN=Configuration,DC=example,DC=com
Filter: (objectClass=nTDSDSA)
Scope: Subtree

いずれにせよ、DC オブジェクトが素直に「Domain Controllers」OU 内に無い環境では他にもいろいろなカスタマイズをしている可能性があるので、注意が必要であることに違いありません。 適切な人を見つけ出しヒアリングすることを検討する必要があるでしょう。

それと「Active Directory ユーザとコンピュータ」ツールは「表示」-「拡張機能」を有効にしておきましょう。 2008 だと LDAP 上の任意の属性が確認できるようになっていて便利です。

機能レベル

フォレストの機能レベルとドメインの機能レベルがありますが、それぞれ「ドメインと信頼関係」ツールの「フォレストの機能レベルをあげる」画面と「ドメインの機能レベルをあげる」画面で確認できます。

操作マスタ (FSMO)

各マスタによりどこを見るかが異なります。 同じ画面で操作マスタの転送もできます。

RID、PDC、インフラストラクチャ

「ユーザーとコンピュータ」ツールでドメインを選んで「操作マスタ」メニューを選択します。

ドメイン名前付け

「ドメインと信頼関係」ツールの最上階層を選択後、「操作マスタ」メニュー選択。 ドメイン名前付けマスタはフォレストに 1台です。

スキーマ

「スキーマ」ツールで行いますが、デフォルトではツールがメニューに登録されていないので、使用する前に登録が必要です。

  1. regsvr32 schmmgmt.dll を実行
  2. MMC を起動して「スナップインの追加と削除」「Active Directory スキーマ」を追加
  3. 簡単に呼び出せるように、「名前をつけて保存」で system32\schmmgmt.msc と保存し、これに対するショートカットを作っておく。

スキーマもフォレストレベルでの管理です。 ちなみに、スキーママスタの役割を転送をするにはフォレストルートドメインの Schema Admins グループに入っているユーザでないとダメです。

GC (グローバルカタログ)

「サイトとサービス」ツール内、サーバ配下にある「NTDS Setting」のプロパティの「全般」タブで「グローバルカタログ」にチェックが入っているかどうかを見ます。

ネットワークトポロジ関連

「サイトとサービス」ツールで確認します。 ここで重要なのは以下のような項目です。

  • サイト
  • サイトリンク
    通常「Inter-Site Transports」-「IP」の下のものが重要で「コスト」と「レプリケートの間隔」をチェックしておきます
  • サブネット
  • AD 接続オブジェクト (Connection)
    サーバ配下の「NTDS Settings」の下にあります。たいていは 「<自動生成>」 されています。

KCC (Knowledge Consistency Checker) が「Active Directory 接続」オブジェクトを作ります。 手動で作ることもできますが、後の管理を考えると自動作成に任せた方が良さそうです。 KCC をすぐ動作させたいときは以下のコマンドを実行します。

repadmin /kcc

「NTDS Settings」のコンテキストメニュー、「すべてのタスク」から「レプリケーショントポロジの確認」を実行します。 各サイトにサイト間トポロジジェネレータの役割を持つ DC が存在します。 これは dcdiag.exe で確認できます。

信頼関係

「ドメインと信頼関係」ツールで確認します。 ってこれは迷うこともないですね。

インストール時指定した項目関連

データベースとログ

とりあえず既定のデータベースファイルは以下の通りです。

C:\WINDOWS\NTDS\Ntds.dit

ログファイルも規定ではこのフォルダに作成されます。 領域が足りなくなってきたときは、後から Ntdsutil.exe で位置を変更することができます。 ただし、ディレクトリサービス復元モードでの起動が必要です。 (2008 ではサービス停止のみでオッケーとのこと)

実際の位置は以下のレジストリ値で確認できます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters

DSA Database file (データベースファイルのフルパス名)
Database backup path (データベースバックアップファイルフルパス名)
Database log files path (ログ用フォルダ)

SYSVOL

SYSVOL の位置も以下のレジストリキーで確認できます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\SysVol

SYSVOL (SYSVOL フォルダのパス)

復元モードのパスワード

このパスワードは忘れたら確認のしようがないのですが、覚えていれば ntdutil.exe で変更することは可能です。

ネットワーク関連

DNS 関連

DNS 経験者が Windows の DNS サーバを扱う時に、最初わかりづらいのは AD 統合ゾーンだと思います。 AD 統合ゾーンを使えば Windows の複製機能でゾーン情報をサーバ間共有できるので、ゾーン転送の設定が不要になります。 ただし、AD 統合ゾーンはドメインコントローラ上で DNS サーバを動かす場合のみ使うことができます。

AD 統合ゾーンは同期されますが、それ以外のゾーンの内容やフォワーダの設定などはサーバごとに確認する必要があります。

DHCP 関連

Windows サーバ上で DHCP サーバを用いるときは、Active Directory で承認されていなければなりません。 この仕組みは DHCP のベンダー固有オプションを利用して実装されているようで、Windows 以外の DHCP サーバを利用するときは当てはまりません。

承認されたサーバーについては、DHCP 管理ツールで「DHCP」のコンテキストメニュー「承認されたサーバーの管理」から確認できる他、以下のコマンドを実行することで一覧表示することもできます。

netsh dhcp show server

まとめ

自分が Active Directory を触り始めたときにわかりにくかったことをまとめたものなので、これが全てと言うつもりはありませんが、それなりに役立つのではないかと思います。

コマンドラインから WordPress 関連処理を実行する

FC2 ブログで行ってたつぶやきアーカイブを hetarena.com に移すために、コマンドラインで実行するための記事投稿用プログラムを書く方法を調べてみました。 wp-cron ではなく OS の crontab を使用したいので、単独の PHP プログラムファイルとして動かしたいのです。

結論からすると簡単で wp-load.php をプログラムの最初に読み込めば良いです。 参考にしたのはこちらの記事ですが、投稿を作成する程度であれば特に $_SERVER を設定しなくても動きました (→ マルチサイト化されていると $_SERVER を設定しなければ動きませんでした。追記参照)。 以下サンプルコードです。 コマンドラインから実行すると 7/7 付けの投稿が作成されます。 使用する場合はご自分の環境に合わせて修正してからお試しください。

#!/usr/bin/php
<?php

//require the WP bootstrap
require_once('/usr/share/wordpress-ja/wp-load.php');

class WP_Command_Line {

  public function __construct() {
    //nothing here
  }

  public function main() {

    $post = array (
      'post_content'   => 
        "<p>これはインポートされた記事です。</p>\n<p>よろしく!</p>",
      'post_type'      => 'post',
      'comment_status' => 'closed',
      'ping_status'    => 'closed',
      'post_status'    => 'publish',
      'post_author'    => 2,
      'post_title'     => 'テスト用記事',
      'post_date'      => '2012-07-07 00:00:00',
      'post_category'  => array(6)
    );
    $e = wp_insert_post($post, true);
    if (is_wp_error($e)) {
      print $e->get_error_message();
    }
    else {
      print "Post ID = " . $e . "\n";
    }
  }
}

$importer = new WP_Command_Line();
$importer->main();

wp_insert_post の Tips も簡単に紹介しておきます。

  • $post->post_date を設定しなければ実行時の時刻で記事が作成されます。
  • $post->post_author や $post->post_category は既に存在するユーザ/カテゴリーの ID を渡します。 カテゴリーは配列を渡します。
  • 記事 ID 指定で追加したい時は $post->import_id に ID をセットします。$post->ID は更新の時に使います。

詳しくは wp_insert_post のリファレンスをご確認ください。


2012.7.28 追記
マルチサイト化されていると $_SERVER の設定が必要です。以下の様な感じで動きました。

$_SERVER = array(
  "HTTP_HOST" => "hetarena.com",
  "SERVER_NAME" => "hetarena.com",
  "REQUEST_URI" => "/",
  "REQUEST_METHOD" => "GET"
                 );

内部リンクを壊さずに FC2 ブログの記事を WordPress にインポートする

内部リンク切れを起こさずに FC2 ブログを WordPress サイトに移行する際の手順です。 ブログ記事番号を合わせることで、FC2 ブログからの個別記事へのリダイレクトも可能なようにします。 ある程度プログラムや HTTP、HTML の知識がある人向けで、説明を端折っている部分もあります。 スクリプトプログラム等もダウンロードできるようにしていますが、環境に合わせて修正が必要となるので最終的には自己責任でご利用ください。 WordPress のバージョンは 3.3、3.4 で試していますが、Movable Type and TypePad Importer のバージョン (0.4) の方が重要です。 これ以降の説明はホスト名として実際に私が行った blogger323.blog83.fc2.com (FC2) と hetarena.com (WordPress) を使用します。

以下の条件で移行を行います。

  • http://blogger323.blog83.fc2.com/blog-entry-NNN.html を https://hetarena.com/archives/NNN に対応させます。(追記: 他のパーマリンク形式が良い人はコメント欄参照。)
  • FC2 にこれまでアップロードしたファイルは https://hetarena.com/oldimages/ の下に置きます。

手順の概要は以下の通りです。

  1. FC2 ブログでエクスポートした記事と sitemaps.xml を使用して、各記事に ID (先述の URL 内の NNN の部分) を付与したエクスポートデータを作成します。
  2. 記事中の内部リンクの変換を行います。
  3. Movable Type and TypePad Importer を一部変更し、ID を読むようにしてから記事をインポートします。
  4. 画像の引越し、FC2 のリダイレクトの設定を行います。

インポートするデータの作成

実際の手順では先の 1. 2 を合わせてプログラムで処理しました。 FC2 ブログの記事をエクスポートし、UTF-8 に変換して blogger323.txt として保存します。 続いて http://blogger323.blog83.fc2.com/sitemaps.xml をファイルとして保存します。 こちらの perl スクリプトをダウンロードし、先の 2つのファイルと同じディレクトリに置いて以下を実行します。

perl fc22wp.pl blogger323.txt > blogger323_wp.txt

これで「ID: 」の行が足され、更に内部リンクの変換が行われます。 perl のスクリプトについて簡単に説明すると以下の処理をしています。

  • blogger323.txt の「DATE:」行を sitemaps.xml の「<lastmod>」の日時とマッチさせ、記事番号の含まれる「ID:」行を挿入する。
  • blog-entry-NNN.html を archives/NNN に変換
  • blogger323.blog83.fc2.com を hetarena.com に変換
  • http://blog-imgs*.fc2.com/b/l/o/blogger323/ を /oldimages/ に変換

使い捨てで書いているので使用する際は「blogger323」、「hetarena.com」の含まれている行を適切に修正し、処理内容を確認してから使用してください。 まあ、短いプログラムなので見ていただければ perl を知らなくても何をしているか想像がつくと思います。

インポートの実行

WordPress に標準でついてくる「Movable Type and TypePad Importer」(Version 0.4) を使用しますが、そのままだと「ID:」行を読んでくれません。 そこで movabletype-importer.php に以下の修正を行います。 (wp-content/plugins/movabletype-importer/ の下にあるファイルにこのパッチファイルを当てても良いですが、WordPress 管理画面の「プラグイン編集」から修正するのがお手軽です)

--- movabletype-importer.php.orig       2011-01-15 09:53:03.000000000 +0900
+++ movabletype-importer.php    2011-08-02 20:22:59.000000000 +0900
@@ -388,6 +388,10 @@
                                $slug = trim( substr($line, strlen('BASENAME:')) );
                                if ( !empty( $slug ) )
                                        $post->post_name = $slug;
+                       } else if ( 0 === strpos($line, 'ID:') ) {
+                               $post_id = trim( substr($line, strlen('ID:')) );
+                               if ( !empty( $post_id ) )
+                                       $post->import_id = $post_id;
                        } else if ( 0 === strpos($line, 'STATUS:') ) {
                                $status = trim( strtolower( substr($line, strlen('STATUS:')) ) );
                                if ( empty($status) )

import_id はまともに公式解説されていないパラメータなのですが、更新のときは $post->ID に、新規のときは $post->import_id に記事 ID をセットして wp_insert_post を呼ぶと希望通りの ID で記事が更新/作成されます。

安全を期すならば blogger323_wp.txt をインポートする前に記事ID の大きなダミーデータを 1つ作成してインポートしておきます。 import_id で指定した番号の記事が存在すると既存最大 ID + 1 の番号が振られて記事が作成されてしまうのですが、こうしてダミーデータを入れておけば万が一既に記事が存在していたとしてもダミーデータの後ろの番号で作成され、続く記事のインポートに影響を与えません。

そのほかもろもろ

他にもいくつか実行しておくべきことがあります。

  • WordPress でパーマネントリンク設定を行って archives/NNN 形式を選んでおきます。
  • FC2 にアップロードされているファイルをダウンロードして WordPress ディレクトリの下の oldimages の中に置きます。 ダウンロードするファイルが多い場合は何かツールを使うなりしてダウンロードしましょう。 (私は HTML からリンクを取り出して wget を回すスクリプトを書いたような気がします)
  • RSSフィード読者向けに FC2 側に移転告知エントリを一つ書いておく必要があると思います。 FeedBurner を使っていれば、Original Feed URL を変更することで読者の手を煩わせることなく引き続きフィードを提供することができます。 しかし、この場合もリーダー上で既読情報等がリセットされるようなので告知をしておいた方が良いでしょう。
  • どこまでやるかという問題になるのですが、ここまでの手順で救えるのは個別記事 URL です。 カテゴリーやタグつき記事に対してのリンクが記事中に大量に埋め込まれている場合、それらへの手当ても必要かも知れません。 一つの手として Redirection プラグインを使う方法を紹介しておきます。 Redirection プラグインでは正規表現も使えるので、例えば「/\?tag=(.*)」→「/?s=$1」みたいなルールを作るとかつてタグで指定していた単語での検索結果を表示するようになります。
  • WordPress サイトの準備が整ったら FC2 テンプレートに meta refresh でリダイレクトする設定を入れます。 あと rel="canonical" の <link> タグも入れておいた方が良いでしょう。

最後の FC2 テンプレートの件については説明が必要ですね。 まずはリダイレクトは以下の記述を <head> セクションに追記します。 (実際は改行なしで書いています)

<meta <!--index_area--><!--/index_area--> http-equiv="refresh" 
content="0;URL=https://hetarena.com/<!--permanent_area-->
<!--topentry-->archives/<%topentry_no><!--/topentry--><!--/permanent_area-->" />

リダイレクトの設定についてはこちらの記事を参考とさせていただきました。 続いて <link> タグですが、以下の記述を同じく <head> セクションに追記します。

<!--permanent_area--><!--topentry-->
<link rel="canonical" href="https://hetarena.com/archives/<%topentry_no>" />
<!--/topentry--><!--/permanent_area-->

ところで

hetarena.com を立ち上げてからこれまでは FC2 ブログを Twitter のつぶやきアーカイブ用に使っていたのですが、最近、WordPress のカスタム投稿タイプを使えば hetarena.com 側でアーカイブしてもブログ記事と混ざらないことに気づき、FC2 ブログの方は閉鎖することにしました。 そんなこともあってこんな記事を書いてみたのでした。 ちなみにつぶやきアーカイブはこちらです。


コメントいただいたので、ちょっと追記

実行例を挙げておきます。 まずコマンドプロンプトを開きます。 アクセサリの下にありますが、スタートメニューで cmd.exe と入力してもコマンドプロンプトを実行できます。 まずディレクトリを作成します。まあ、ここはエクスプローラーで実行しても良いですが。

C:\Users>blogger323>mkdir c:\temp
C:\Users>blogger323>cd \temp
C:\temp>

強調部分が入力するところです。 ここまでで C:\temp フォルダができているので必要なファイルをそこに入れます。 そして perl コマンドを実行します。

C:\temp>perl fc22wp.pl blogger323.txt > blogger323_wp.txt

これで C:\temp フォルダの中に blogger323_wp.txt というファイルができます。