ARP エントリを追加してみよう。

今年も残すところあと一ヶ月となりましたので、IP アドレスと MAC アドレスを紐付ける「ARP テーブル」に、手動でエントリを追加する方法を整理してみました。

どれも CUI です。

少なくとも Windows の機能としては、GUI で行う方法は無いようです。

 

 

 

◆ ARP コマンド

” ARP -s [宛先 IP アドレス] [宛先 MAC アドレス] [登録する NIC の IP アドレス] “

おそらくもっとも古くからある手法ではないでしょうか。

Windows XP SP3 でも、Windows 8.1 Update1 でも使用できることを確認しています。

三つ目のオプション [登録する NIC の IP アドレス] は必須ではありませんが、NIC が複数あるコンピューターでは、このオプションで指定してやらないとどの NIC に登録されるかわかりません。

(どうやら、ipconfig コマンドで一番上に表示される NIC に登録されるようなのですが、確証はありません。)

なお、このコマンドにより設定したエントリは OS をシャットダウンすることで揮発してしまいます。

エントリを恒久的に使用したい場合は、 スタートアップスクリプトとしてOS 起動時に実行する等の方法があります。

 

 

 

◆ netsh コマンド

” netsh interface ipv4 add neighbors [登録する NIC 名] [宛先 IP アドレス] [宛先 MAC アドレス] “

netsh コマンド自体は Windows XP にもありますが、こうやって APR エントリを追加することができるのは Windows Vista 以降です。

[登録する NIC 名] というのは、ipconfig を実行した時に「イーサネット アダプタ XXX:」として表示される「XXX」の部分です。

「ローカル エリア接続」のようにスペースを含んでいる場合は、ダブルクォーテーション記号「”」で前後を括ります。

arp コマンドと最も違うのは、デフォルトでは OS シャットダウン時に揮発しない点でしょう。

あえて揮発させたい場合は、” sotre=active ” というオプションを付与します。

 

 

 

◆ New-NetNeighbor コマンドレット

” New-NetNeighbor -InterfaceAlias [登録する NIC 名] -IPAddress [宛先 IP アドレス] -LinkLayerAddress [宛先 MAC アドレス(ハイフン無し)] “

これだけコマンドではなく PowerShell です。

Windows 8 や Windows Server 2012 以降で使えるようになった、「NetTCPIP」モジュールに含まれています。

前述の二つのコマンドと違って、MAC アドレスを二桁ずつハイフン記号「-」で区切ってはいけません。

デフォルトでは OS シャットダウン時に揮発ないので、あえて揮発させたい場合は、” -PolicySotre ActiveStore ” というオプションを付与します。

 

 

 

ServerManager.exe

Windows Server 2008 の「サーバー マネージャ」と Windows Server 2008 R2 の「サーバー マネージャー」の実体は、「Microsoft管理コンソール(mmc.exe)」のスナップインの一つである「ServerManager.msc」でした。

 

 

一方、Windows Server 2012 や Windows Server 2012 R2 の「サーバー マネージャー」はプロセスとして独立し、「%systemroot%¥System32」にある「ServerManager.exe」になっています。

そのため、コマンドプロンプトや「ファイル名を指定して実行」に「ServerManager.msc」と打ち込んでも起動出来ません。

 

接続先ドメインコントローラー確認方法

ドメインに参加している端末は、起動時にドメインコントローラーに接続します。

起動後のユーザーログオン時の認証等は、基本的に起動時に接続したドメインコントローラーに認証してもらいます。

現在、端末がどのドメインコントローラーに接続しているのかを確認する、一番手っ取り早い方法は ” net-user /domain ” コマンドです。

これは本来、ドメインユーザーの一覧を表示するコマンドなのですが、「情報提供元」として「現在接続しているドメインコントローラー」が表示されるため、ソレを確認する用途にも使えます。

他に ” nltest /sc_query:<domainname> ” コマンドでも確認可能ですが、このコマンドは Windows Server 2003 では標準では使えません。(Support Tools に含まれています。)

 

 

なお、ドメイン内に複数のドメインコントローラーがある場合、端末が起動時に接続するドメインコントローラを指定する方法は、「サイトを切り分ける」以外に無いようです。

Get-Partition の方が Get-Volume より便利?

Get-Partition” も、”Get-Vlume“ と同じく、Windows Server 2012 の PowerShell 3.0 から使えるようになったコマンドレットの一つです。

前回の記事では、”Get-Volume” コマンドレットは必ずしも “diskpart” コマンドにおける “list volume” の代用にはならないということを書きましたが、”Get-Partition” コマンドレットであれば代用どころかより豊富な情報が得られることを確認しました。

コンピューター上に存在するパーティションの一覧が、ご丁寧にディスク毎に分かれて表示されますし、その中にはちゃんと「EFI システムパーティション」(100MB)も載っています。

ただし、そのパーティションが「EFI システムパーティション」であるとはどこにも書いてません。「Type」という項目が「System」になっていることが特徴的だと言えますが、それだけです。(Cドライブなど、普通のパーティションは同項目が「Basic」になっています。)

 

 

またさらに、「予約」領域が、”Get-Partition” コマンドレットで表示出来ることを確認しました。「Type」は「Reserved」です。

この領域は、“diskpart” コマンドの “list partition” によって確認出来ますが、“list volume” や、「ディスクの管理」画面では表示されません。

Get-Volume で表示されないパーティションがあった。

Windows Server 2012 の PowerShell 3.0 から使えるようになったコマンドレットの一つに、”Get-Volume” というものが有ります。

特にオプションを付けずにそのまま実行すると、現状でそのコンピューター内に存在するパーティションが全て表示されます。

要するに “diskpart” コマンドにおける “list volume” と同じようなものか・・・ と思っていたのですが、必ずしもそうではないケースもあるということに気づきました。

 

 

普段、各種確認/検証作業は Windows Server 2012 の Hyper-V 上にある仮想マシンで行っているのですが、ふとした思いつきで、ホスト側でもこの “Get-Volume” コマンドレットを実行してみました。

すると、その結果には “diskpart” の “list volume” や、「ディスクの管理画面」には表示される「EFI システムパーティション」というパーティション(100MB)が表示されていません。

 

 

このパーティションは、”mountvol” コマンドにより表示される「現在のマウントポイントとボリューム名の考えられる値」の一覧にも表示されません。

そのため、このパーティションが “Get-Volume” コマンドレットの結果に表示されないのは、「マウントされていない」ことが原因ではないかと考えられます。

“mountvol” コマンドのオプションを調べてみると “/S” というものがあり、その効能は「EFI システムパーティションを与えられたドライブにマウントします。」となっています。

おそらく、この方法でこのパーティションをマウントしてやれば、”Get-Volume” コマンドレットの結果にも表示されるようになるのでしょう。

が、ホストの環境はあまり弄りたくないので未確認です。

 

 

typeperf コマンドでパフォーマンスを確認

パフォーマンスモニタを起動する ” perfmon ” コマンドや、カウンンタを設定/起動/停止する ” logman ” コマンドは知っていましたが、今日初めて ” typeperf ” コマンドというものを知りました。

 

 

指定したカウンタの値を1秒間隔で取り続け、コマンドプロンプト上で確認出来ます。

ある程度しっかりしたログを取りたいなら別ですが、ちょっとした確認にはこちらの方が便利かもしれません。

(Windows XP SP3 および Windows 8.1 Preview で使えました。)

 

 

テックネットの記事はこちら =>  Typeperf

 

 

” システムで予約済み ” パーティション <2>

OS インストール時に勝手に作られるこの「システムで予約済み」パーティションですが、実は作らずに OS をインストールすることも可能です。

そうした場合、Bootフォルダなどが自動的にCドライブ内に作成されます。つまり、Windows Server 2008 やWindows Vistaと同じスタイルになるというわけです。

 

 

以下に、私が実際に行った手順を紹介します。

※Windows Server 2012 の Hyper-V 上の仮想サーバーにて、Windows Server 2008 R2 SP1  を用いました。

1. サーバーをOSインストールメディアから起動します。

2. 最初の画面で言語やキーボードを選択した後、そのままストレートにOSをインストールするのではなく、まずは「コンピューターを修復する」を選択して「システム回復オプション」を起動します。

3. ラジオボタンの選択は既定(上下二つのうち、上側にチェックが入っていると思います。)のまま「次へ」ボタンを押し、次の画面からコマンドプロンプトを起動します。

4. コマンドプロンプトにて”diskpart” を実行し、下記 -a) 〜 -h) のコマンドにより、OSをインストールするCドライブを作成します。

-a) list disk

現在接続されているHDDの一覧を表示します。

-b) select disk X

OSをインストールしたいHDDを選択します。

X には、a) にて確認したそのHDDのナンバーを入れます。

-c) clean

現在そのHDD内にあるパーティションやデータを一掃します。

-d) create partition primary

そのHDDに新しいプライマリパーティションを作成します。

特にサイズを指定していないので、そのHDDを余すところなく目一杯使います。

-e) list vol

HDDにボリュームが作成されたことを確認します。

-f) select vol Y

作成されたボリュームを選択します。

Y には、e) にて確認したそのボリュームのナンバーを入れます。

-g) assign letter=C

ボリュームにドライブ文字「C」を割り当てます。

-h) list vol

ボリュームにドライブ文字「C」が割り当てられた事を確認します。

5. ウィンドウ右上の[×]でコマンドプロンプトを閉じ、同様にシステム回復オプションも閉じ、「Windows のインストール」画面に戻ります。

6. ここから先は通常のOSインストール手順と基本的に同じです。インストール場所を選択する画面では、先ほどdiskpartコマンドにより作成したCドライブを選択します。

7. OS インストール完了後、ログオンして「ディスクの管理」画面を開き、「システムで予約済み」パーティションが無い事を確認します。

 

 

さて、「システムで予約済み」パーティションが無い状態というのは、通常と比べて何がちがうのでしょうか?

試した限りでは、「Windows Server バックアップ」にて、「ベアメタル回復」オプションを選択せずにCドライブ単体をバックアップした場合にも、そのバックアップデータから新品HDDへのベアメタル回復が可能であることを確認しました。(通常はできないことです。)

※可能だとは言っても、このような回復は正式にサポートされる方法ではないはずなので、万が一回復に失敗しても自己責任となります。

” システムで予約済み ” パーティション <1>

まっさらなハードディスクにWindows OSをインストールすると、通常はCドライブが作成され、そこにOSが入ります。インストールのウィザードにおいて特段何もしなければ、Cドライブとは別にデータ用の領域が作成されるということはありません。

ところがWindows Server 2008 R2 やWindows 7 の場合、Cドライブと一緒に、それもHDDの一番先頭に「システムで予約済み」というパーティションが作成されます。容量は100MBしかありません。

このパーティションにはドライブ文字が割り当てられていないため、OSインストール後に[スタート]メニューから[コンピューター]を開いても、Cドライブしか見えません。しかし、「ディスクの管理」画面を開くと、Cドライブより左(先頭)側にこのパーティションが在ることとが分かります。あるいは、”diskpart“コマンドで”list volume“を実行することでも表示されます。

いったいこのパーティションは何なのでしょうか? 無いとどうなるのでしょうか?

 

 

まずは中身を見てみましょう。「ディスクの管理」画面で右クリックしてやればドライブ文字を割り当てることが出来るので、適当に何か割り当ててやればエクスプローラーで開くことができます。一応ここではFドライブとします。

普通に見ても空っぽなのですが、エクスプローラーの「フォルダー オプション」で「保護されたオペレーティング システム ファイルを表示しない(推奨)」を無効化することで中身が表示されます。するとなにやらOSのブートに関するフォルダやファイルがあります。というか、それしかありません。

Fドライブ直下にあったのは、

・Boot  (フォルダ)

・System Volume Infomation  (フォルダ)

・bootmgr  (ファイル)

・BOOTSECT.BAK  (ファイル)

の4つだけでした。(”dir F: /s /A”コマンドを使えば、Bootフォルダの中身まで表示されます。)

このBootフォルダの直下に在るBCDというファイル(ブート構成データ)は、OSをブートする為に非常に重要です。これが壊れるとブート出来なくなるそうです。

こちら↓のサイトでいろいろ興味深い実験をしています。

◆ win7 システムの修復

(http://ftlabo.sakura.ne.jp/win/w7-system-repair/w7-system-repair.shtml)

 

その他、マイクロソフトのサイトにも解説が載っています。

◆ ブート構成データ エディタに関してよく寄せられる質問

(http://technet.microsoft.com/ja-jp/library/cc721886(v=ws.10).aspx)

この↑サイトを見ると分かりますが、BCDによるブートの制御自体は、Windows Server 2008 やWindows Vistaの段階ですでに採用されています。しかし、それらのOSではCドライブ内に存在しました。ではどうして、Windows Server 2008 R2 やWindows 7 では独立したパーティションが作られるようになったのでしょうか?

 

 

手がかりとなりそうな情報が、同じくマイクロソフトのサイトにありました。

◆ ヒント: 不可解な小さなパーティションを理解して削除する

(http://technet.microsoft.com/ja-JP/windows/Win7_Tips65)

◆ ハード ディスクを BitLocker ドライブ暗号化用にセットアップする

(http://windows.microsoft.com/ja-jp/windows-vista/set-up-your-hard-disk-for-bitlocker-drive-encryption)

 

 

どうやら、「BitLocker」という暗号化機能のためのようです。BitLocker機能自体はWindows Server 2008 やWindows Vistaの段階ですでにあったのですが、OSが存在するCドライブ自体を暗号化したい場合には、「OS起動用の領域」を手動で切り分ける必要がありました。なぜなら、BIOSは暗号化されたCドライブを直接認識出来ないからです。

それを最初から独立させておいたのが、Windows Server 2008 R2 やWindows 7における「システムで予約済み」というパーティションなのです。

 

つづく

netsh の運命や如何に。

Windows Server 2012 R2 のプレビュー版が、6月中には公開されるそうですね。

ソースは、Microsoft Cloud というMicrosoft社によるツイッターアカウントです。

 

 

Windows Server 2012 では、コマンドプロンプトで ” netsh ” を実行し、次に ” interface ” 等を実行した時点で「Windows の将来のバージョンで、TCP/IP の Netsh機能が削除される可能性があります。」と表示されます。そしてPowerShell への移行を促されます。

さて、Windows Server 2012 R2 ではどうなっているでしょうか。

 

 

本当に無くなるのはさらに次のバージョンかもしれませんが、 “netsh” が無くなるとすると、これまで蓄積してきたスクリプト等の資産に少なからぬダメージがあるのではと思います。Windows Server 2008 R2 以降はパケットキャプチャまで出来ますからね。

Windows Server 2003 では OS 自体に標準で付属していたキャプチャツール「 Network Monitor 」が、Windows Server 2008 以降はダウンロードツールになりました。

商用稼働中のサーバーの場合、障害調査のためといえど、パケットキャプチャのためにフリーソフトをインストールすることなど言語道断!なケースもあります。たとえ Microsoft 純正であっても。そんな時には、 “netsh>trace” コマンドが有効な手段となりました。

パケットだけでなくネットワーク関連の様々な情報をまとめて採取出来るので、パケットキャプチャ自体が不要だったとしても、ネットワークの障害調査には有用なコマンドだと思います。

 

 

今のところ、Windows Server 2012 標準のPowershell v3.0 には、パケットキャプチャのコマンドレットは無いようです。Windows Server 2012 R2 には新しいバージョンが搭載されるのでしょうか。あるいは、バージョン自体は同じでモジュールの数が増えるのでしょうか。今から楽しみです。

 

 

ちなみに、Windows Server 2012 の PowerShell で “Get-Wild” と実行すると・・・

何も起こりません。

Windows Server 2012 R2  に期待します。

Netdom join コマンドによるドメイン参加。

コンピューターをActive Directory のドメインに参加させる方法はいくつかありますが、その一つに、”Netdom join ~~” というコマンドがあります。

グーグルで「Netdom ドメイン参加」で検索すると、少なくともこの記事を書いている時点では、検索結果のトップに「IT Pro」の下記サイトが表示されます。

仕事に役立つコマンド入門   netdomコマンドでドメインに参加する

 

 

最低限必要と思われるオプションを網羅したコマンド例が載っていて助かるのですが、1点だけ気になるところがありました。

参加したいドメイン名を指定する、”/domain:example” の部分です。

これって、いわゆるひとつの 「NetBIOS ドメイン名」ですよね? じゃ、NetBIOSによる名前解決が可能な、同一セグメント内でしか通用しないんじゃ・・・?

 

 

実機(Windows Server 2008 R2 SP1)で確認したところ、ドメインコントローラーとクライアントコンピューターが別セグメントに存在する場合は、確かにドメイン参加に失敗しました。

たとえクライアント側で「優先DNS」にドメインコントローラー(兼DNS)のIPアドレスを登録しておいたとしても、NetBIOSドメイン名だけの記述では不十分だということです。NetBIOSなんですから。

そういったケースでは、例えば ”/domain:example.local” のように、FQDNを最後まで記述する必要があります。そうしたところ、ドメイン参加に成功しました。

ちなみに、TechNet の Netdom join の解説ページでは、コマンド例がFQDNで記述されています。