2012年2月28日火曜日

SyntaxHighlighterェ…

Exchange管理シェルのコードのハイライトはイマイチ、というか未対応だね。仕方ないか。

PowerShellでExchange Serverのユーザメールボックスのサイズを調べる

Exchange Serverのメールボックスのサイズを調べるには、Exchange管理シェルのGet-MailboxStatistics の TotalItemSize プロパティを使う。
こいつを使う機会があったのだが、なんか動きがおかしかったのでその記録と、備忘のためのメモとしてこのエントリをポストしておく。

まずは基本編
特定のユーザのメールボックスサイズを調べるとしよう。
Get-MailboxStatisticsには引数-Identityがあるので、これにユーザのDNを与えれば結果が得られそうだが、私の手元の環境ではなんだかよくわからないがエラーになってしまった。
Exchangeの環境をいくつも持ってるわけではないので、この環境固有の問題なのか、引数の与え方が悪いのか、世間的に常識なのかは分からなかった。
引数-Serverを指定するとどうにかうまく動いたので、サーバ上の全ユーザの情報を取り出してから、where-objectで任意のユーザの情報を抽出することとした。
Get-MailboxStatistics | Get-Member をするとMailBoxGuidってのがいたので、Get-Mailboxで目的のユーザのメールボックスのGUIDを調べて突き合わせれば目的は達成できそう。
$allstats = Get-MailboxStatistics -Server <servername>
$name = Get-Mailbox -Filter { <filterstring> }
$allstats | `
 Where-Object { $_.MailBoxGuid -eq $name.ExchangeGuid } | `
 fl TotalItemSize
という感じ。
応用編
filterstringで複数のユーザを引っ掛けた場合は、foreachでぐるぐるまわしてあげたらいい。
$allstats = Get-MailboxStatistics -Server <servername>
$names = Get-Mailbox -Filter { <filterstring> }
foreach($name in $names) {
 $name.SamAccountName
 $allstats | `
 Where-Object { $_.MailBoxGuid -eq $name.ExchangeGuid } |`
  fl TotalItemSize
}
Get-Mailboxのフィルタ条件は腐っていてイマイチ使い物にならないので、実際の利用シーンでは、さらにGet-ADUserなどと組み合わせる必要があると思われる。
ちなみに今回はcustomAttributeN(Nは1~15)でのユーザ抽出が目的だったので、上のコードで事足りてしまった。

Hyper-Vマネージャで「既に他の仮想ネットワークにバインドされているため、'(NIC名)' にバインドできません」

事の発端
某所のHyper-Vホストマシンで、NICをデバイスマネージャから削除するというヒューマンエラーが発生した。
なぜこのようなオペミスが起きたのかはさておき(俺じゃないよ!)、復旧の時少しハマったのでメモ。

デバイスマネージャでNICを再検出させ、ドライバを入れて復旧。
次に、Hyper-Vの仮想ネットワークの設定が消えているので再投入を行った。
ところが、仮想ネットワーク マネージャで仮想ネットワークを作成する際に、接続の種類を「外部」にし、当該NICを指定して「OK」をクリックすると、"既に他の仮想ネットワークにバインドされているため、'(NIC名)' にバインドできません"というエラーが発生。設定消えてるのに、そんなわけないだろ?

解決策
新しい仮想ネットワークの変更を適用中にエラーが発生しました の巻 - デザイン事務所のプログラマーが書くブログ こちらを参考にさせていただいた。
ローカル エリア接続のプロパティで一度「Microsoft 仮想ネットワーク スイッチ プロトコル」を外し、再度Hyper-Vマネージャで仮想ネットワークの設定をすると解消。
なお、その後ローカル エリア接続のプロパティを見ると、「Microsoft 仮想ネットワーク スイッチ プロトコル」にチェックが自動的についている。
解決したからよいが、一体なんなんだこれ。

「ローカル エリア接続のプロパティ」のチェックボックスをCLIで変更できない

みんなおなじみ、Windowsの「ローカル エリア接続のプロパティ」。

このダイアログには
  • Microsoft ネットワーク用ファイルとプリンター共有
  • インターネット プロトコル バージョン 6 (TCP/IPv6)
  • インターネット プロトコル バージョン 4 (TCP/IPv4)
などの項目がありチェックをつけたり外したりできるが、なんと、コマンドプロンプトやバッチ、PowershellなどのCLIでこの設定を個別に変更する方法は用意されていない。

マシン全体でIPv6の有効化/無効化、IPv4の有効化/無効化はできるが、個別のNIC単位で設定するには、GUIを使うしかないのだ。

じゃあ、Server Coreだったらどうすんのか?

なんと、がんばってレジストリをいじくり回す以外に設定変更手段がない。
ソースは How to Disable IPv6 in Windows 2008 Full and Core editions - ENIAC KB←この辺。
Microsoft、正気か。

※もしServer Coreでの容易な設定変更方法をご存知の方がいらっしゃったら是非ご教授願いたい。

2012年1月29日日曜日

回線が細すぎてADレプリケーションに失敗する場合の対処法

先日、遠隔地の拠点に新たにADサーバを立てた時に、回線が細すぎてADレプリケーションに失敗するという、「こんなの初めて!」な現象に出くわした。(結構レアだと思う)

発生したエラー
遠隔地のサーバでDCPROMOを実行し、無事終了したので、SYSVOLおよびntds.ditのレプリケーションが完了するまで見守ることにしたのだが、どうもntds.ditのレプリケーションが途中で止まってしまったようで、あるファイルサイズから一向に増えなくなってしまった。

状況を確認するためrepadmin /showrepl を叩くと、下記のようなエラーが表示された。
C:\>repadmin /showrepl
(snip)
==== 入力方向の近隣サーバー======================================
DC=****,DC=****,DC=**,DC=**
    *****\******** (RPC 経由)
        DSA オブジェクト GUID: ********-****-****-****-************
        2012-01-21 19:16:08 の最後の試行は、失敗しました。結果は 1818(0x71a):
            リモート プロシージャ コールが取り消されました。
        7 回連続で失敗しました。
        最後に成功したのは (never) です。
(snip)

「結果は 1818(0x71a)」とはこれいかに。

対処法:RPCタイムアウト値を変更
どうもWindows Server 2003以降は、ADのレプリケーション処理におけるRPCのタイムアウト値は5分になっているらしい。で、5分以内にレプリケーション元サーバからRPC応答が完了しないと、タイムアウトしてしまう。2000の頃は45分だったそうなので、ずいぶん短くされてしまったものだが、裏を返せば2000年から2003年にかけて世の中の通信事情がずいぶん良くなって、マイクロソフトとしては「5分でイケる」と判断したのであろう。
マイクロソフトの判断の是非はさておき、RPCのタイムアウト値を長くすることでこの問題は解決する。
レジストリエディタで
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
にDWORD値 "RPC Replication Timeout (mins)" を追加し、
値を45に設定し、再起動すればOK。
see also:Active Directory Replication Tools and Settings

2012年1月13日金曜日

Subversionでエロいファイルを隠蔽する

少し前にtwitterで「エロいファイルをバージョン管理システムで管理する(他人の目から隠す)」的なツイートを見かけたので、Subversionで実践してみた。
とにかく手軽に実践するため、1台のPCにSubversionサーバとクライアントの両方を導入する。検証に使った環境はWindows7 Ultimate x64。

2012年1月11日水曜日