Windows/Mac端末のインストールアプリ情報の抽出方法

###まえがき
有償IT資産管理ツールを使用せずに端末のインストールアプリケーション情報を
管理するための元データ作成を行います。作成後はEXCELのピボットやBIツール等に
取り込んで活用可能です。

ただしあくまで目安ですが、100台超の拠点及び職場ならば、
LanScopeCatやSKYSEA Client View、SCCMなどの有償ツールを利用されたほうが、
対費用効果が高いので導入することをお勧めします。

###対象環境
- Windows端末32bit/64bit(XP～10までのOSは動作確認済み)
- Mac OS端末(対応OSわからないです。すみません)
- 管理者権限ユーザ(実行時に利用)

###Windows端末での情報取得
WindowsOSは下記レジストリパスにインストールアプリの情報を
格納しています。OSが32bitか64bitかで格納先が変わるので注意です。

```registrty:32bitOSのレジストリパス
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
```

```registry:64bitOSのレジストリパス
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
```

ということで、上記パスから情報を抜き出すツールを作成します。
VBSでも構いませんが今回はなぜかbatファイルで作成してみました。
管理者権限で実行します。以下は構文例です。


```bat:WindowsApp.bat
@echo off

set DT=%DATE:~-8,2%%DATE:~-5,2%

rem ソフトウェアの一覧情報のパスを指定(64bit版用にWow6432Node)を追加
echo "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" > registry_path.txt
echo "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" >> registry_path.txt

rem ソフトウェア名をファイルに出力(DisplayNameで開始している行のみ、セキュリティの更新ソフトは無視)
for /F	"delims=" %%A IN (registry_path.txt) DO (
	for /F "tokens=2,*" %%I in ('reg query %%A /s ^| findstr "\<DisplayName" ^| findstr /V "更新 修正 (KB"') do (
		echo %COMPUTERNAME%,%%J >> %COMPUTERNAME%_%DT%.txt
	)
)

rem ソフトウェア名の昇順で並び替え
sort %COMPUTERNAME%_%DT%.txt > install_sort_list.txt

rem 重複しているソフトウェア名があるので、重複データを削除
type nul > %COMPUTERNAME%_%DT%.txt
for /f "delims=" %%I in (install_sort_list.txt) do findstr /X /C:"%%I" %COMPUTERNAME%_%DT%.txt >NUL || (echo;%%I) >> %COMPUTERNAME%_%DT%.txt

rem 不要なファイルの削除
del registry_path.txt
del install_sort_list.txt
```

すると、batファイルと同一のフォルダに「PC名_yymm.txt」というファイルが
出力されます。ファイル内は以下の通り「PC名,アプリケーション名」のように
並んでいるように出力しています。これは後々PCごとにピボット管理するために整形しました。
![111.PNG](https://qiita-image-store.s3.amazonaws.com/0/198785/19bd866a-d4ea-9256-36c4-559c9deb24ce.png)

このあと出力されたファイルを共有スペースに自動で移動されるように
するとなおよいと思います。


###MacOS端末での情報取得
MacOSは、./Applicationsに各種アプリケーションが格納されているので、
ここの情報をシェルで抜き出します。一例として、以下のcommandファイルを
作成しました。

```Mac:MacApp.command
#!/bin/sh

#ファイル名を変数に格納
HoT=$HOSTNAME
Str1=_
Str2=,
DAT=$(date +%y%m)
FlN=$HoT$Str1$DAT

#ソフトウェア一覧情報をリダイレクト
ls -1 /Applications > $FlN.txt

#sedで各行にホスト名を追加
sed -e s/^/${HoT}${Str2}/ ${FlN}.txt > INPUTFILE.TXT
cp INPUTFILE.TXT ${FlN}.txt
rm INPUTFILE.TXT
```

ただしMacOSで上記ファイルを実行する前に、
実行権限を付与するためパーミッションを変更するコマンドを実行します。
以下、手順を記載します。

> 1.検索ボックスで「terminal.app」と入力してEnter
>
> 2.terminal画面上で以下のコマンドを入力
>
>```
>chmod +x <commandファイル格納先のフルパス><アプリケーション名>.command
>```

これ以降はcommandファイルをGUI上でダブルクリックすれば実行できます。

出力されたテキストファイルの中身はWindows端末時と同じ体裁に整形しています。
どこか一箇所へ集めましょう。

###テキストファイルの内容をCSVファイルに集約
一箇所のフォルダに集約後、コマンドプロンプトで以下を実行します。
この時集約ファイルのPC名か年月部分をワイルドカードで指定しておきます。

```bat:AllApp.bat
type '<PC名の一部>*'.txt > AllApp_yymm.csv
```

CSVファイルに指定したファイル分のデータが結合されて元データ完成です。


以上です。

###まとめ
このデータを元データとして利用すれば、
EXCELのピボット等で活用できるかと思います。

この方法を応用すればOS情報やウィルス対策ソフトのバージョン情報等々も
抽出し、同じ管理台帳にまとめることが可能です。

ツールさえ作成すれば上記の情報収集はほぼ無料で実施できます。

しかし有償のIT資産管理ツールと比較した場合、
以下の機能を補うことは工数の都合上難しいのではと考えております。

- 操作ログの取得(大半の市販ツールはオプションの一つとして利用可能)
- 特定アプリケーションの起動禁止
- 特定端末のネットワーク利用の禁止(MACアドレス/IPアドレスでの任意禁止)
- ソフトウェアの一括配布・実行


管理に膨大な時間を要するほど組織が大規模化した場合は、
冒頭で記載したIT資産管理ツールを導入することを検討したほうがよいと思います。

加筆・修正する点などがあればご指摘頂けるとありがたいです。