﻿ObservePC Ver2.1
技術情報(外部設定ファイル・ソースコード)TECHNICAL_v2.1

1.はじめに
───────────────────────────────────────────────
ObservePC は AI に与える「PC環境前提情報」を自動生成するツールとして、幅広い PC 情報を取得します。
開発を進める中で、環境によっては不要な項目があったり、管理ツールとして利用する場合には不要な機能があると感じました。
ソースコードを同梱しているためユーザー自身がカスタマイズすることも可能ですが、C# に触れないユーザー向けに、
Ver2.0 から外部設定ファイルによる制御機能を追加しました。


2.外部設定ファイルの概要
───────────────────────────────────────────────
本機能は、設定ファイルが存在する場合、プログラム内部の定数を動的に書き換えます
特定の項目だけを定期的に監視したい場合（例：イベントログだけを常に多めに取得する等）は、.cfg を書き換えることで自分専用の調査ツールにカスタマイズ可能です

・設置場所
外部設定ファイルは ObservePC.exe と同じフォルダに置いてください。

・使用するファイル
ObservePC.cfg(テキストファイル)

・設定ファイルが存在しない場合
設定ファイルが無い場合は、ObservePC.exe 標準のデフォルト動作になります。
削除や拡張子変更で簡単にデフォルト挙動へ戻せます。

- ObservePC.cfg の仕様
行先頭が'#'の場合はコメント行

・書式
実行エンジン
ObservePCには取得速度と精度が異なるエンジンが3種類搭載されています。
取得エンジンを明示的に設定。
S = 逐次（安全）
F = 全並列（高速）
M = 多段並列（標準）

書式例
Engine = M

拡張モード
通常モードと拡張モードがあり、拡張モードでは一部の表示が拡張されると
共に取得表示される項目も増加する。falseで通常。true で拡張項目を有効化

書式例
ExpertMode = true

最大出力件数
出力上限値を変更する。設定範囲は1～200まで

書式例
MaxData = 20

マスターテーブル（内部・ソースコード上）
("OS情報", OutputOSInfo, false, 1, 2, 0,true)
cfg ファイル（外部・ファイル内）
OS情報, OutputOSInfo, false, 1, 2, 0,true
・パラメータ説明
第1引数：取得名称
第2引数：メソッド名
第3引数：
false → 通常モードで取得
true  → ExpertMode（-E）でのみ取得
第4-6引数：一般的に変更する必要は無い。
WmiLevel:0-3
LoadLevel:1-4
ConflictGroup:0-8
取得メソッドをAIに見せて評価を受けて決定した値です。
これらの評価値で多段並列エンジンが最適な段構成を自動生成します。
第7引数:取得ON/OFFスイッチ

- 設定の優先度（オーバーライド構造） 本ツールは以下の順序で設定を上書き（Override）します。
初期設定→起動オプション→ObservePC.cfgの実行エンジン・取得上限→
マスターテーブルの取得項目とパラメーター→ObservePC.cfgの取得項とパラメーター

- 各モードの動作
・SafetyMode(S)
逐次取得
取得漏れチェックあり
必要に応じて再取得
確実性は高いが処理速度は遅い
・FastMode(F)
全項目を一斉並列取得
チェックなし
高速だが確実性に欠ける場合がある
・通常モード / ExpertMode（M）
動的に多段並列を生成
逐次取得＋漏れチェック＋再実行
標準的な動作で、一般的な環境では推奨

- 設定例
ObservePC.cfg
出力はマスターテーブル記入順に行われます。

--- ObservePC.cfg 記入例 ---
Engine = M
ExpertMode = true
MaxData = 20
OS情報, OutputOSInfo, false, 1, 2,0,true
ドライバー情報, OutputDriverAnalysis, false, 1, 4,8,true
最近のシステムイベントログ, OutputEventLog, false, 0, 4,5,true
NTP同期状態, OutputNtpStatus, false, 0, 1,0,true
--- ここまで---

上記の場合、4 項目のみ取得して出力されます。
通常は -E 専用の「NTP同期状態」も、第3引数false 指定により通常モードで取得されます。

極端な設定をするなら、システムイベントだけ、ドライバーだけ100件出力も設定出来ます。
---ObservePC.cfg 記入例---
Engine = M
ExpertMode = true
MaxData = 100
最近のシステムイベントログ, OutputEventLog, false, 0, 4,5,true
ドライバー情報, OutputDriverAnalysis, false, 1, 3, 8, true
---ここまで-----


3.コードで無効化されている項目の有効化
───────────────────────────────────────────────
出力が冗長や一般的な使用に向かない取得項目はソースコードで無効化されている。
これら無効化されている取得項目をObservePC.cfgの設定で有効化することが可能。
必要に応じて第7引数をtrueに変更してください。
ObservePC.cfgでのコメントアウトと挙動は似ているが、コメントは設定ファイル解析時に設定
として反映しない。第7引数falseは取得エンジンにて処理対象から除かれる。

以下、標準で無効化されている取得項目

クラッシュ・異常終了サマリ, OutputCrashSummary_E, true, 0, 2, 5, false
  取得元： イベントログ
  内容： 異常終了・クラッシュの要約
  補足： Windowsの強制終了・アプリが落ちる等の調査用
タスクスケジューラ一覧, GetTaskSchedulerInfo, true, 0, 4, 7, false
　取得元：schtasks.exe 出力を整形  
　内容：登録者、状態、トリガー種別、実行コマンド  
　注意：Microsoft 製タスクは除外、不審なタスクの発見用
削除ソフト痕跡, OutputUninstallTraces, true, 0, 4, 6, false
　取得元：レジストリ Uninstall キーの残骸、イベントログ（MsiInstaller）  
　内容：削除された可能性のあるソフトを推定または確定表示
  補足： レジストリの残骸調査用
Windows標準以外のサービス一覧, OutputThirdPartyServices, true, 1, 3, 4, false
  取得元： Win32_Service
  内容：Windows 標準サービスは除外し、後から追加されたサービスのみ抽出
  補足：サードパーティ製サービスの確認用
Windows Search 状態, OutputWSearchDetail_E, true, 1, 2, 4, false
  取得元： Win32_Service､イベントログ
  内容：Windows Searchの詳細状態
  補足：Windows Search不調時の詳細調査用

---ObservePC.cfg 記入例---
Engine = M
ExpertMode = true
MaxData = 30
タスクスケジューラ一覧, GetTaskSchedulerInfo, true, 0, 4, 7, true
クラッシュ・異常終了サマリ, OutputCrashSummary_E, true, 0, 2, 5,true
---ここまで-----


4. ソースコードと改変方法
───────────────────────────────────────────────
ObservePC は Visual Studio 上で改変可能な C# ソースコードを同梱しています。
LICENSE.txtにも書いていますが、公共的に許されない悪用を除き自由な改変と配布を許可しています。

・ファイル名：Source code_2.1.cs.txt  
・推奨環境：Visual Studio 2022 / .NET Framework 4.7.2  
・改変例：  
　- 出力件数の調整（MaxDataOutput変数の書き換え）  
  - ディスプレイ情報の複数台対応
　- FW ルールフィルタの強化  
　- 既存セクションの表示位置変更 static void InitializeMethodMaps()内の位置を入れ替えるだけ
　- 任意のセクション追加 新規メソッドを作成する必要があります
　- GUI 実装や LAN 送信機能（OutputSender.cs）の利用


5. Visual Studio での実行手順（初心者向け）
───────────────────────────────────────────────
1. Visual Studio を起動し「新しいプロジェクトの作成」を選択  
2. C# → .NET Framework → コンソールアプリ を選択  
3. Program.cs に同梱のソースコードを貼り付け  
4. 参照追加が必要な場合は System.Management / Microsoft.Win32 を追加  
5. 「開始」ボタンで実行

※ Ver 1.4 以前のコードは構造が素直で初心者向けです。
※ C# の並列処理や、メソッドを動的に割り当てて実行する仕組みを見たいなら Ver2.0 が良いです


6. 既存メソッドの改造
───────────────────────────────────────────────
章 6 は「既存メソッドの改造」、章 7 は「新規メソッドの追加」を扱います。
static string OutputNtpStatus()のような単純なメソッドなら簡単に変更可能。
sb.AppendLine(RunCmd("w32tm /query /peers")); を"w32tm /query /status"へ変更するだけで
NTP同期状態の表示が変更されます。一歩進めて"ipconfig /all"など別なコマンドへ変更して
追加機能化することも簡単です。新規メソッドについては詳しくは次章7をご覧下さい。

本格的な改造を行うなら、ソースコード全体をAIへ読ませてから変更したい点を入力すれば
変更すべきコードを提案してくれるはずです。
機能を変更するメソッドだけ提示でもAIは提案してくれますが、整合性の無いコードをAIが提案する場合があります。
その時は整合性について新たにAIへ指示するか、ご自身で書き換えて組み込んでください。
また、動作環境の指定が無ければ依存性の高いコードが生成される場合があります。
メソッドの組み替えが終了後にマスターテーブルへ登録しますが、大規模な改変だとパラメーターについても
AIへ質問してください。AIからの返答にしたがってマスターテーブルを書き換えれば完成です。


7. 新規取得項目の追加(新規メソッド作成)
───────────────────────────────────────────────
新しい取得機能を追加する場合、自作または生成AIの利用が可能です。
技術的に不安がある場合は、生成AIの活用を推奨します。

7-1. 実装可否の確認

まず、追加したい機能が C# で実装可能かを確認します。
その際、以下の点を明確にしてください。

外部 DLL の必要性

WMI 依存の有無

管理者権限の要否

ネットワーク依存の有無

他環境での再現性

機能として実装可能であっても、
配布や汎用利用に適するかは別問題です。

本ツールへ組み込む前に、依存性と運用影響を十分検討してください。

7-2. AIを利用する場合の進め方

AIにコード生成を依頼する場合、仕様が曖昧だと意図と異なる実装になることがあります。

そのため、以下を推奨します。

可能であれば簡易な下書きを作成する
（コメントのみ、擬似コードでも可）

入力・出力形式を明確に示す

既存メソッドの再利用を明示する

文章のみの依頼よりも、
未完成でもコード形式で提示した方が精度は向上します。

7-3. ObservePCメソッド構造の基本要件

ObservePCの取得メソッドは、以下の構造を持ちます。

戻り値は string

最終的に return 値;

セクションタイトルを先頭に出力

出力が空の場合は再取得対象となる

例：

static string OutputExample()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("?? 取得項目名：");
    ...
    return sb.ToString();
}


※ エラー内容を出力したい場合は Console.WriteLine を使用してください。
※ return値が空文字列の場合、逐次取得エンジンで再取得対象になります。

7-4. 動作検証手順

新規メソッド作成後は、必ず単体テストを行ってください。

新規メソッドのみを呼び出す簡易 Main を作成

期待通りの出力になるか確認

想定外の挙動があれば修正

安定動作を確認後、マスターテーブルへ登録

大規模改変の場合は、
パラメータ（WmiLevel / LoadLevel / ConflictGroup）の設定について
AIへ評価を依頼することも可能です。

7-5. マスターテーブル登録

メソッド完成後、InitializeMethodMaps() 内へ追加登録します。

既存項目の書き換えではなく「追加」になります。

登録パラメータが不明な場合は、
既存の類似項目を参考にするか、AIへ評価を依頼してください。

7-6. AIへの指示例
ObservePCのソースを読み込み、
[取得したい項目] を追加するためのメソッドを作成してください。
既存の RunCmd や WMI取得ロジックを再利用し、
戻り値は string とし、マスターテーブルへの登録コードも提示してください。

まとめ

新規機能の追加は、

依存性確認

単体動作確認

マスターテーブル登録

の順で進めることで、安全かつ安定した拡張が可能です。

ObservePCは拡張を前提とした構造を持っています。
追加機能も既存設計に沿って実装することで、並列エンジンとの整合性を維持できます。


8. ObservePC のメソッドの再利用ガイド
───────────────────────────────────────────────
既存の強力なヘルパーメソッドを活用することで、AIに新しい情報取得機能を追加させる際の「下書き」が格段に楽になります。

RunCmd(string command, string arguments)

用途: PowerShellや外部コマンドの結果を文字列で取得する。

例: RunCmd("powershell", "-Command \"Get-HotFix\"") で修正プログラム一覧を取得。

GetWmiData(string query, string properties, string title)

用途: WMIから特定のプロパティを抽出し、整形して返す。

例: Win32_VideoController から Name, DriverVersion を抜く等。

GetRegValue(RegistryKey root, string subKey, string valueName)

用途: レジストリから特定の設定値を安全に読み取る。

特徴: キーが存在しない場合の例外処理が内包されているため、AIに「レジストリを読んで」と頼む際にこのメソッドを指定するとコードが安定します。

OutputSection(string title, string content)

用途: セクションのタイトル（?? タイトル）と内容を、ObservePCの標準フォーマットで整形する。

利点: 出力の一貫性を保つための必須メソッドです。


・AIへ機能追加を依頼する際のコツ

AIに新しい取得メソッドを書かせる際は、以下の「ObservePC流テンプレート」を渡すと、手直しがほぼ不要なコードが返ってきます。

AIへの指示（プロンプト）例：

「GetRegValue を使って、Windowsのテーマ設定（ダークモードかライトモードか）を取得する GetWindowsTheme() メソッドを書いてください。戻り値は string で、セクションタイトルは ?? 視覚テーマ: とし、内部で OutputSection を使って整形してください」

・取得エンジンと並列処理の注意点

Ver 2.1では、.cfg や起動オプションで並列エンジン（F や M）が選択されます。

スレッドセーフの維持: 新しいメソッド内で static な共有変数に書き込みを行うと、並列実行時にデータが壊れる可能性があります。


9.まとめ
───────────────────────────────────────────────
ObservePCのソースコードは、単なる「情報の羅列」ではなく、**「Windowsの内部情報をいかに効率よく、並列で、安全に引っこ抜くか」**というノウハウの塊です。

「自分の会社の独自アプリがインストールされているか調べたい」

「特定のセキュリティ設定が全社的に統一されているか確認したい」

こうした個別具体的なニーズに対し、一からツールを作るのは大変ですが、ObservePCは拡張を前提とした構造を持っています。
必要に応じて機能を取捨選択し、自身の環境に最適化してください。

