ActiveDirectory内のコンピューターにソフトを自動でインストールしようとして試行錯誤していたらうまくいったので共有します。
ある特定のソフトのインストールに成功しただけなのでうまくいかないこともあると思います。
状況
- msiインストーラがないのでソフトウェア配布機能は使えない
- ユーザーは管理者権限を持っていないのでユーザーのログインスクリプトでインストーラを実行させることはできない
検討事項
- コンピュータのスタートアップスクリプトでインストーラを実行させる
- インストール済みかどうか判別して未インストールの時のみ実行したい
- 各コンピュータのインストール状況を確認したい
やったこと
- ADサーバに共有フォルダを作成してそこにインストーラとバッチファイルを保存
- そのフォルダにコンピュータのインストール状況を保存できるように Domain Computers に書き込み権限を付与
- 以下、バッチファイルを作成して共有フォルダに保存。
- グループポリシーオブジェクトを作成(SoftwareInstall)して「コンピューターの構成→ポリシー→Windowsの設定→スクリプト→スタートアップ」に上のバッチファイルを追加。ドメインコンピュータが実行できるようにUNC表記で追加(¥¥サーバー名¥フォルダ¥install.bat)
- Active Directory ユーザーとコンピューターで対象のコンピュータを入れるOU(ソフトインストール用)を作成
- 上記OU(ソフトインストール用)に作成したグループポリシーオブジェクト(SoftwareInstall)をリンク
- インストールしたいコンピュータを上記OU(ソフトインストール用)に移動
これで対象のコンピュータを再起動すればインストールされました!
共有フォルダ内に[コンピュータ名].txtが作成されて、そのコンピュータのインストール状況が記録されます。
参考にしたサイト
-
http://rukifiel.net/ms-dos-001/
インストール済みソフトを調べる方法 -
https://jj-blues.com/cms/wantto-changevalueinfor/
バッチのFOR文中で変数を更新して利用する方法
作成したバッチファイル
install.bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET filepath=%~dp0\%COMPUTERNAME%.txt
SET softname=[インストールソフト名(事前に調べておく)]
SET installed=False
SET installcommand=[インストーラ実行コマンド文字列(UNC表記)]
FOR /F "delims=" %%S IN ('reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall" /s') DO (
SET TMP=%%S
IF NOT "!TMP:DisplayName=!" == "!TMP!" (
IF NOT "!TMP:%softname%=!" == "!TMP!" (
SET installed=True
)
)
)
FOR /F "delims=" %%S IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s') DO (
SET TMP=%%S
IF NOT "!TMP:DisplayName=!" == "!TMP!" (
IF NOT "!TMP:%softname%=!" == "!TMP!" (
SET installed=True
)
)
)
IF "%installed%" == "True" (
@ECHO %DATE% %TIME% なにもしません。。。 [%username%] >> %filepath%
) ELSE (
START /WAIT %installcommand%
@ECHO %DATE% %TIME% インストール完了! [%username%] >> %filepath%
)