Windowsのトラブルシューティング用の63のツール「Sysinternal Suite」

#Sysinternals Suite
Sysinternals SuiteはWindowsのトラブルシューティングを行うツールをまとめたもので下記からダウンロードできる。

http://technet.microsoft.com/ja-jp/sysinternals/bb842062.aspx

以下のツールが含まれる。

|名前|説明|
|:---|:---|
|AccessChk|ファイル、ディレクトリ、レジストリ キー、グローバル オブジェクト、Windows サービスなどのリソースに対して持つアクセス権を調べるためのコマンドラインツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb664922|
|AccessEnum|ファイル、ディレクトリ、レジスターのアクセス権の一覧をGUIに表示する。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897332|
|AdExplorer|Active Directory (AD) のビューアーおよびエディター。未検証。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb963907|
|AdRestore|削除された Active Directory オブジェクトを復元するツール。未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb963906|
|Autologon|指定のユーザで再起動時に自動ログオンするようにできる。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb963905|
|Autoruns|Windowsの起動時に自動実行するプログラムの一覧を表示する。autorunsc.exeはCUIベースで、autoruns.exeはGUIになっている。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb963902|
|BgInfo|BgInfoは壁紙にCPUやIPなどの情報を表示する。壁紙に書き込むので無駄なプロセスは使用されない<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897557|
|CacheSet|システム ファイル キャッシュのワーキング セットのサイズを設定できるアプレット.未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897561|
|ClockRes|システム クロックの精度やアプリケーションが取得できる最大タイマー精度をコンソールで表示する。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897568|
|Contig|ディスク上でファイルが連続した状態になるように、単一のファイルを最適化するコマンドラインのツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897428|
|Coreinfo|論理プロセッサと物理プロセッサの間のマッピング、NUMA ノードと NUMA ノードが存在するソケット間のマッピング、および各論理プロセッサに割り当てられたキャッシュを確認できるコマンド ラインユーティリティ<BR>http://technet.microsoft.com/ja-jp/sysinternals/cc835722|
|Ctrl2cap|CapsLock キーで入力する文字を Ctrl キーの文字に変換する.未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897578|
|DebugView|DebugView は、ローカル システム、または TCP/IP 経由でアクセスできるネットワーク上の任意のコンピュータにおける、デバッグの出力を監視できるアプリケーション<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896647|
|Desktops|最大４つの仮想ディスクトップを切り替えて使用できるようになる。<BR>http://technet.microsoft.com/ja-jp/sysinternals/cc817881|
|Disk2vhd|VirtualPCで使用する物理ディスクのVHDを作成する。コマンドラインから使用できる。未検証。<BR>http://technet.microsoft.com/ja-jp/sysinternals/ee656415|
|DiskExt|ボリュームのパーティションがどのディスク上にあるか、パーティションがディスク上のどこにあるかをコマンドラインで返す。管理者権限が必要。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896648|
|DiskMon|ハード ディスクのすべての動作状況をログに記録したり表示したりするアプリケーション。要管理者権限<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896646|
|DiskView|ディスクのグラフィカルなマップを表示することができ、ファイルの位置を特定したり、クラスターをクリックして、そのクラスターを占有しているファイルを確認したりできる。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896650|
|Disk Usage (DU)|指定したディレクトリのディスク領域の使用量をレポートするコマンドラインツール。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896651|
|EFSDump|暗号化されたファイルにアクセスする権限があるアカウントを表示するコマンドラインツール。未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896735|
|FindLinks|指定されたファイルのために存在するファイルインデックスと任意のハードリンクをレポートするコマンドラインツール<BR>http://technet.microsoft.com/en-us/sysinternals/hh290814|
|Handle|システムのプロセスで開かれているハンドルに関する情報を表示するユーティリティ。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896655|
|Hex2dec|10進数、16進数の相互変換を行うコマンドラインツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896736||Junction|ジャンクションとよばれるリンクの作成、確認を行うためのツール。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896768|
|LDMDump|LDMデータベースに格納されているデータを詳しく調査できるユーティリティ.未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897413|
|ListDLLs|Windows 9x か Windows NT に読み込まれる DLLのリストを取得するコマンドラインツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896656|
|LiveKd|マイクロソフト カーネル デバッガーの Kd と Windbg を、運用システムでローカルに実行することができる。未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897415|
|LoadOrder|デバイス ドライバーが読み込まれる順序を表示する。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897416|LogonSessions|現在アクティブなログオン セッションを一覧表示するコマンドラインツール。また、-p オプションを指定すると、各セッションで実行中のプロセスの一覧が表示される。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896769|
|PendMovesとMoveFile|サービスパックや修正プログラムのように再起動後に移動や削除をおこなうためのMoveFileコマンドと、現在ペンディング中のファイルを表示するPendMovesコマンド<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897556|
|NTFSInfo|NTFS ボリュームに関する情報を表示するコマンドラインツール。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897424|
|PageDefrag|ページング ファイルとレジストリ ハイブの断片化の確認と最適化を行うらしいが、Windows7 64bitでは動作しない。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897426|
|PipeList|パイプのディレクトリ一覧を取得するコマンドラインツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/dd581625|
|PortMon|システムのシリアル ポートとパラレル ポートで行われている活動を監視および表示するユーティリティ。未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896644|
|ProcDump|条件を指定して、プロセスのダンプを行う。<BR>http://technet.microsoft.com/ja-jp/sysinternals/dd996900|
|Process Explorer|実行中のプログラムの状態を調べるツール。呼び出し元の親プロセスとの関係をツリーで表現している。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896653|
|Process Monitor|プロセスが行った処理(ファイル、レジストリ、プロセス・スレッドの活動）をリアルタイムに表示するツールである。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896645|
|PsExec|PsExec は Telnet に代わる軽量のユーティリティで、クライアント ソフトウェアを手動でインストールしなくても、他のシステムでプロセスを実行できるだけでなく、コンソール アプリケーションとの十分な対話性も備わっている。しかしVista以降ではUACをOFFにしないと使用できない。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897553|
|PsFile|リモートからアクセスしているファイルやフォルダーの一覧を表示したり、アクセスを終了させるツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897552|
|PsGetSid|SIDの確認ができる。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897417|
|PsInfo|ローカルまたはリモートの Windows NT/2000 システムに関する重要な情報を収集するコマンド ライン ツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897550|
|PsKill|ローカルまたはリモートのプロセスを強制終了するツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896683|
|PsList|ローカルまたはリモートのプロセスの一覧を表示する。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb8966802||PsLoggedOn|ローカルにログオンしているユーザーとローカル コンピューターまたはリモート コンピューターのリソースを経由してログオンしているユーザーの両方を表示するアプレット<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897545|
|PsLogList|リモート システムにログインして、イベントログのメッセージ文字列を取得できる<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897544|
|PsPasswd|ローカル システムまたはリモート システムのアカウントのパスワードを変更できるツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897543|
|PsService|ローカルまたはリモートのサービスのビューアー兼コントローラー<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897542|
|PsShutdowon|ローカルまたはリモートをシャットダウンする。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897541|
|PsSuspend|ローカル システムまたはリモート システムのプロセスを中断できる。終了ではなく中断なので、後から-rオプションを利用することでプロセスを再開できる。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897540|
|RAMMap|物理メモリの使用状況を詳細に分析できるGUIツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/ff700229|
|RegDelNull|埋め込まれた null 文字が含まれており、標準のレジストリ編集ツールでは削除できないレジストリ キーを検出して削除できます<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897448|
|RegJump|ジストリのパスを受け取って、指定のパスが表示された状態で Regedit を開く。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb963880|
|RootkitRevealer|ルートキット検出ユーティリティ.未検証。Windows XP（32ビット）およびWindows Server2003（32ビット）では動作するらしいがWin7 64bitでは動作<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897445|
|SDelete|Secure Delete.ディスク上にある、削除されたファイルのデータを上書きすることで、ファイルの復元を防ぐ。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897443|
|ShareEnum|でアクセス可能なドメイン内のすべてのコンピューターがスキャンされ、ファイル共有や印刷共有、およびそのセキュリティ設定が表示される.<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897442|
|ShellRunas|プログラムを別のアカウントで起動する<BR>http://technet.microsoft.com/ja-jp/sysinternals/cc300361.aspx|
|Sigcheck|画像がデジタル署名されているかどうかを確認して、バージョン情報をダンプする。未検証。PDFの署名は検出しない。<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897441|
|Streams|関連付けられたストリームを持つ NTFS ファイルを確認できるツール<BR>ストリームについては下記参考<BR>http://www.atmarkit.co.jp/fwin2k/win2ktips/1363streams/streams.html<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897440|
|Strings|プログラム中の文字を抜き出す。ただし、日本語は抽出できない<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897439<BR>|
|Sync|ファイル システム データの安定性を確保し、システム障害時にデータが失われないようにするために、すべてのファイル システム データをディスクにフラッシュするようオペレーティング システムに指示する<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897438|
|TCPView|ネットワークの接続状況を確認するためのツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897437|
|VMMap|プロセスの仮想メモリと物理メモリを分析するユーティリティ。このユーティリティでは、プロセスで使用している仮想メモリの種類と、オペレーティング システムによって各種類に割り当てられた物理メモリ (ワーキング セット) の量の分析結果を表示する。<BR>http://technet.microsoft.com/ja-jp/sysinternals/dd535533|
|VolumeID|ボリューム ID を変更する.未検証<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897436|
|Whois|指定されたドメイン名または IP アドレスの登録レコードを表示<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897435|
|WinObj|NT オブジェクト マネージャーの名前空間の情報にアクセスしてその情報を表示する <BR>http://technet.microsoft.com/ja-jp/sysinternals/bb896657|
|ZoomIt|画面を拡大したり、画面に注釈を記入したりするツール<BR>http://technet.microsoft.com/ja-jp/sysinternals/bb897434|

#補足説明
##DebugView
APIのOutputDebugStringで指定した文字列を表示するデバッグ用のツール。
VisualStudioなどをインストールせずに、実行環境でトレースログを出力することができる。
Releaseビルドでも出力されるので、通常のDebug実行などで再現できない不具合を追跡するのに使用する。

![DebugView.png](https://qiita-image-store.s3.amazonaws.com/0/47856/da64b890-f9aa-9e88-92e3-e8dd158e8ea7.png)
 
 __VC++__ 

```Cpp
void CDebugDemoDlg::OnBnClickedButton1()
{
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
    OutputDebugString(L"TEST用の出力");
} 
```

VisualStudioからプロセスを実行した場合、DebugViewには何も出力されず、VisaulStudioの出力ウィンドウに出力される。

 __C#__ 

```csharp
private void button1_Click(object sender, EventArgs e)
{
  Trace.WriteLine("テスト1");
}
```

System.Diagnostics.Traceを使用する。
こちらはVisualStudioからプロセスを実行した場合でもDebugViewと出力ウィンドウの両方に出力される。 
 
 __VBA__ 

```vbnet
Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)

Public Sub test()
    OutputDebugString "ああdddあtest"
End Sub
```

一応これで出力できるが、可能ならCOMでラップしてやったほうがいい。


##Process Monitor
Process Monitorはリアルタイムで、プロセスのファイルやレジストリに対するアクセスを表示する。

![pmon.png](https://qiita-image-store.s3.amazonaws.com/0/47856/0d6a13d3-b326-b7e6-4781-0d640c4897fe.png)

Procmon.exeを管理者権限で動作させる必要がある。

このツールを用いれば、どのプロセスがどのファイルやレジストリを書き込んでいるか、または、指定のパスを操作しているプロセスはどれかを追跡することができる。

すべての情報をトレースすると量が多いので、プロセスによってフィルタをかけたり、パスにフィルタをかけるとよい。

##Process Explorer
タスクマネージャの上位互換。
![ProcessExp.png](https://qiita-image-store.s3.amazonaws.com/0/47856/e28885e3-17a5-11b2-ca96-9410519dd4b0.png)

呼び出したプロセスによってツリーを構築している。
![ProcessExp.png](https://qiita-image-store.s3.amazonaws.com/0/47856/fe614fa9-42af-916a-4795-f0a97af67e89.png)アイコンを選択後、ウィンドウズを選択すると、そのウィンドウの所属するプロセスを表示する機能も有している。

##PendMovesとMoveFile
このツールの説明の前にリブート時の移動について説明する。

サービスパックや修正プログラムのように再起動後に移動や削除をおこなうためにMoveFileEx APIのフラグにMOVEFILE_DELAY_UNTIL_REBOOTがある。
http://msdn.microsoft.com/ja-jp/library/cc429621.aspx

MoveFileツールは、MoveFileExAPIをMOVEFILE_DELAY_UNTIL_REBOOTとともに実行したものである。
もし、MOVEFILE_DELAY_UNTIL_REBOOTフラグをつけたときに、移動先にブランクを入れた場合は、移動ではなく削除になる。
このフラグをつけて実行した場合、下記のレジストリに、移動情報が格納され、再起動時に実行される。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

そして、このレジストリの内容を確認するのが、PendMovesコマンドになる。

##PsExec～PsSuspendコマンド
これらのコマンドは、リモートの端末に対して操作を行える。
ただし、リモートでこれらのコマンドを実行するにはリモート端末で、いくつかの設定が必要になる。

・ファイアーウォールの設定でポートを開ける
・WindowsXPの場合は、「簡易ファイルの共有を使用する」のチェックを外す
・Vista以降の場合はUACを無効にする必要がある。

これらは、セキュリティー的に不適切な設定なので、すくなくともVista以降で常時使うツールにすべきでない。

##Autologon
指定のユーザでリブート時にオートログインにできる。
当然、セキュリティー的にのぞましくない。
しかし、再起動が必要な自動テストを行う場合は必要になる。

例：
OS再起動後、アプリケーションの処理を実行して速度を計測する。
それを１０回繰り返すなど。

#まとめ
いくつかのツールはWinXP用で動作しないものもあるが、DbgView、ProcessMonitorなどは強力なツールなので、これの有無が生産性を劇的に変えると思われる。

なお、これらは、個別でもダウンロードできる。