見出し画像

キッティング用のバッチファイルを作ってちょっとだけキッティングを楽にするんじゃ

こんばんは、しがない情シスです。

今回はキッティングのお話です。

キッティングといったらPCを箱から出して、お仕事に使えるようにする、いわゆる「初期セットアップ」的な作業ですが…皆さんキッティングって好きですか?

私は割と好きです。
あんまり頭使わなくてよくて、無心でポチポチ出来て、なにより新品のデバイスを開封できるのが良い。

とはいえ、台数が増えたり入退社が多かったりすると、楽しい作業も途端に苦行と化すかと思います。
というわけで「キッティング用のバッチ」を作って効率化しましょう。

あ、もちろんMDMがあってゼロタッチキッティングとかができるならそっちの方が早いですし、クローニングとかでOKならそれでいいと思います。(うちにはどっちも環境が無い!)

経緯

バッチ作る前は以下の状態でした。

  • キッティング手順は一応ある

  • ただし全部手作業

この状態で、いちど50台ちかく入れ替えたことがありまして。
流石にこれは効率悪いなぁ、と思いながら忙しさにかまけて放置してたのをようやっと効率化した次第で。

環境と前提など

  • 対象デバイス(PC)はすべてWindows

  • ADあり(AADConnectは未接続)

  • GPOは一部設定済み(IEモード、WindowsUpdateなど限られた設定)

  • M365契約中

  • 組織の独自なツールは一部業務システムのみ

バッチ作成前はPC開封からAD参加、電源オプションやスクリーンセーバー、アプリのインストールまで全部手作業状態です。

M365導入過渡期(が延々続いている)なのでADとAADは接続していません。
AADConnect勉強してそのうち同期させたいな…と思ってます。

幸いにして、私の入社時には未整備ながらも「キッティング手順」は最初から最後まで用意されていたので、「業務上どんなものが必要か」ということは概ね分かった状態でのスタートでした。

この方法が向いている人

  • 環境がWindowsメイン

  • Intuneを導入していない

  • ADを導入していない

  • AD入れててもポリシーで縛れない・縛りたくない

  • 余り手間をかけたくない

  • 割りとすぐ効率化したい

準備編1:現状の作業を全部棚卸しよう

作業をコマンドプロンプトさんやパワーシェルさんに任せるにしても、まず任せる作業内容を整理しないといけません。

キッティングにまつわる全作業をリストアップしながら、

  • コマンドで自動化できる作業

  • 対話型のコマンドなら実行可能な作業

  • コマンドで実行できないけど実行手前までならいける作業

  • 意味ないから止める作業

に分類していきます。

それと、ADがあるならGPOを設定してしまえばドメイン参加するだけでキッティングそのものが不要になるので、積極的に利用していきましょう。
もちろん、事情に応じてポリシーを適用できない・したくないケースもあると思うので、そういう時はコマンドの出番ですね。

「現状把握」は何をするにしてもスタート地点です。
材料が出そろったらどう改善していくかを考えるフェーズに移ります。

また、作業を全部把握しておけば、IT環境のポリシーを見直したり、将来的にMDMを導入するときに初期の導入がちょっと楽になるのではないでしょうか。
ちゃんとリストアップするだけでも、色々な判断材料になると思います。
これも一つの情報資産、財産ですね。

あ、それとこれは大事なのですが、止めれる作業は積極的に止めていきます。
いらない仕事をやんないことは自動化するより効率化になるので。

準備編2:コマンドを作る方法

コマンドラインで作る際に、Windowsの場合コマンドプロンプトかPowerShellかで迷うことになると思います。
やりたいことに応じてどちらかを選択すればよいのですが、一般的には以下の感じですね。

コマンドプロンプト

作成難易度:かんたん
自動化範囲:Windowsの基本的なこと、ファイル操作など

PowerShell

作成難易度:ちょっとむずかしい
自動化範囲:結構いろいろできる、M365にも繋げて操作できたりする

本当に基本的な設定(主にWindows関連)であれば信頼と実績のコマンドプロンプトでOKです。
もうワンステップ踏み込んで色々やりたい、という場合や、PowerShellを最初から知ってる(書ける)のであればPowerShellですね。

コマンドプロンプトであっても結構いろいろできるので、こういうことに慣れてないよ、という人はコマンドプロンプトから初めて良いかと思います。

私?
PowerShellめんどくさいコマンドプロンプトで作業の大半は効率化できそうだったので、コマンドプロンプトにしました。

以下、コマンドプロンプトである前提で書いていきます。

実装編:コマンドを書いていこう

作業がリストアップできたら、あとはコマンドを作っていきます。

必要な物

  • リストアップした作業

  • テキストエディタ

事前に検討したリストにある作業のコマンドをググって調べて、テキストエディタに実行順に書いていきます。
再起動が入る箇所など、適宜バッチファイルを分けます。
名前を付けて保存する、を選んで拡張子を「.bat」にして保存します。

おしまい!

…だけだと不親切すぎるので、実際に私が使ったコマンドのサンプルを置いておきますね。

バッチ1号:
まずはPC名の変更。これは対話形式にしておきました。

@echo off

echo コンピューター名を変えるコマンド
set /p NEW_PC_NAME="コンピュータ名を入力して下さい。 >"
echo コンピュータ名を%NEW_PC_NAME%に変更します。
wmic computersystem where name="%computername%" call rename name=%NEW_PC_NAME%
echo リターンコード 0; で成功
echo.

echo 設定を終了します。何かキーを押すと1秒後に再起動します。
pause > nul
shutdown -t 1 -r

一回再起動して、別バッチを実行します。

バッチ2号:
次のバッチはADへの参加などですね。
パスワードベタ打ちはおっかないので対話型です。
ローカルのアドミングループにも入れたりしてますが、ユーザー権限で利用するなら省略ですかね。

@echo off

echo ローカルドメイン参加
set DOMAIN_NAME=XXX
set /p DOMAIN_USERNAME="ユーザーネーム >"
set /p DOMAIN_PASSWORD="パスワード >"
wmic ComputerSystem WHERE "name='%computername%'" CALL JoinDomainOrWorkgroup Name="%DOMAIN_NAME%" Password="%DOMAIN_PASSWORD%" Username="%DOMAIN_USERNAME%" FJoinOptions=3
echo リターンコード 0; で成功
echo.

echo ドメインユーザーアカウント追加
echo domainname\username の形式で指定してください。
set /p USERNAME="ドメインユーザーユーザーネーム >"
net localgroup Administrators %USERNAME% /add
echo.

echo 設定を終了します。何かキーを押すと1秒後に再起動します。
pause > nul
shutdown -t 1 -r

ADへの参加とコンピューター名の変更は一つのバッチで同時にやりたかったのですが、何故かうちの環境では失敗…。
順番入れ替えで成功する、というケースもあるようなのですが、入れ替えた状態でテストしても上手くいかなかったので、バッチを分けて1回再起動を増やして妥協です。
(GUI手作業より速度は劇的に向上するのでまあいいや)

バッチ3号:
次のバッチはWindowsの設定周りですね。
この辺は一律で設定できればGPOとかの方が良いと思います。
うーん、作ってはみたものの、拡張子表示と高速スタートアップ無効はGPOで縛った方が良いですね。
ほぼ必須設定(と私は思ってる)ですし。
スクリーンセーバーはうちの場合はあくまで初期設定、必要に応じて変更を許容するという形にしました。(端末によっては時間を伸ばしたりしたいので)

@echo off

echo ファイルの拡張子を表示する
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d "0" /f
echo.

echo 高速スタートアップ無効化
reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power" /v "HiberbootEnabled" /t REG_DWORD /d "0" /f
echo.

echo スクリーンセーバー有効化(ピクチャ、10分、ログオン時に画面に戻る)
pushd [ファイルサーバーの画像パス]
mkdir %UserProfile%\Pictures\スクリーンセーバー
xcopy /e スクリーンセーバー %UserProfile%\Pictures\スクリーンセーバー /Y
popd
echo.

reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v "ScreenSaveActive" /t REG_SZ /d "1" /f
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v "SCRNSAVE.EXE" /t REG_SZ /d "C:\Windows\System32\PhotoScreensaver.scr" /f
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v "ScreenSaveTimeOut" /t REG_SZ /d "600" /f
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v "ScreenSaverIsSecure" /t REG_SZ /d "1" /f
echo.

echo 電源オプション
powercfg /x /monitor-timeout-dc xx
powercfg /x /monitor-timeout-ac xx
powercfg /x /standby-timeout-dc xx
powercfg /x /standby-timeout-ac xx
echo.

echo アプリをファイルサーバーからローカルへコピー
pushd [ファイルサーバーのパス]
xcopy /e [フォルダパス] %UserProfile%\Desktop /Y
popd
echo.

バッチ4号:
その他、一回Edgeを開いて初回セットアップしたり、対話型インストーラーの最新版入手が必要な物はダウンロードページを表示したりしてます。

Edgeで最初にアクセスするページはChromeのダウンロードページです。皮肉ゥ!

最後にWindowsUpdateを走らせて半自動化作業はおしまい。
サンプルには書いてませんが、他にもインストーラーをファイル置き場からローカルに置いて起動してたりします。

echo Edgeを初回起動してセットアップ
start https://www.microsoft.com/ja-jp/edge
echo ブラウザの初回起動が終わって設定画面をいったん閉じましょう。閉じたらキーを押して次へ進みましょう。
pause > nul
echo.

echo Chromeのダウンロードページを開く
start https://www.google.com/intl/ja_jp/chrome/
echo.

echo WindowsUpdate実行
C:\Windows\System32\UsoClient.exe StartInteractiveScan
echo.

echo 設定終了します。ログに問題無ければ何かキーを押して終了してください。
pause > nul

正直、初手で不要な作業を省いて作業ステップ自体ををガンガン減らしたので、自動化率そのものは高くないです。
それでも「GUIをクリックして、画面を開いて、入力して、ボタンを押して…」というステップが秒で終わるので、その辺は大分楽になりましたね。

対話型アプリインストール作業も、エンター連打で何とかなるのでVBSでSendkeysでも発行してやればいいんでしょうけど、スリープタイミングを調整するのが面倒なので妥協です。

バッチによる処理後、業務内容に応じて個別設定があります。
アプリインストールしたり、専用のドライバーインストールしたり。
ここはおま環なので、完全手作業ですね。ここをやっつけるには会社のIT環境の根っこに手が届きそうなので、そっと蓋を閉じておきます。


[追記]プリインストールソフトのアンインストール

そうそう、プリインストールされてるけど絶対要らない奴&ポップアップが滅茶苦茶邪魔だったりする奴はアンインストールしましょうねー。

例えばHP製のパソコンに最初から入ってるWolf Securityとかはネットから落としたファイルを既定でブロックするというお節介マンなので、サードパーティ製のアンチウイルスやセキュリティソフトウェアを入れている場合は不要になります。
消していいの?って心配されますが、企業内での利用を想定する場合、集中管理機能のあるアンチウイルスソフトが入ってたら存在価値のないソフトになります。

ソフトウェアのアンインストールはPowerShellを利用します。
ここまでコマンドプロンプトで書いてきたので、アンインストール用のPowerShellのバッチ処理のps1は別で書いて、batからキックする形にしてじっそうしました。

PowerShell(.ps1)のサンプル

echo "プリインストールされているアプリケーションを削除します。"

echo "HPSupportAssistant リムーブ"
Get-AppxProvisionedPackage -Online | Where DisplayName -Like "AD2F1837.HPSupportAssistant" | Remove-AppxProvisionedPackage -Online
Get-AppxPackage AD2F1837.HPSupportAssistant | Remove-AppxPackage

echo "Wolf Security アンインストール中..."
$app = Get-WmiObject -Class Win32_Product -Filter "Name = 'HP Wolf Security'"
$app.Uninstall()

キックするバッチ

echo PowerShellでHPの不要プリインストールアプリを削除
cd /d %~dp0
powershell -NoProfile -ExecutionPolicy Unrestricted -File .\Uninstall.ps1
echo アンインストール完了。キーを押して次へ進みましょう。
pause > nul

ps1ファイルはbatと同じ階層に置きます。
cdコマンドでbatを実行している階層に移動→実行権限を一時的にUnrestrictedにしてps1をキックしてます。

パスが正しくないと実行がそもそも出来ないし、権限が無いとPowerShellに権限足らんよって怒られて実行エラーになります。(Unrestrictedは強力なやつ)

プリインストールのソフトウェアには普通にアンインストールでOKなものと、プロビジョニングパッケージごと根こそぎ消さないと復活するものがあります。
上記の例だとHPSupportAssistantがプロビジョニングパッケージとして展開されているので、消します。

消したい対象が他にもあれば、同じ処理をコピーコピーして別のパッケージ名にリネームしたらいいと思います。
流石に全削除するような件数が多い場合は配列に格納してループで回した方がコードは美しくなりますが…。
消せればよかろうなのだァーーーッ!!!

実行編1:試走しよう

さあ楽しいデバッグの時間だ。(悩ましい時間でもある)

作ったものは当然ながら思った通りに動くとは限らないので、誰かの端末を実験台にして検証機があればそれで試しに動かしてみます。

上手く動いているかどうか、想定通りの結果になっているか確認して、なっていない場合はコマンドを変更してリトライします。
ここら辺は地味にトライ&エラーですね。

新人PGだったころを思い出します。(遠い目)

実行編2:妥協しよう

「ぐぬぬ…これ出来たらいいのに…」と思うかもしれませんが、時間は有限です。
妥協することも大事です。

可能であれば人間が触る部分は減らして効率を上げたいですよね。
ただ、情シスは忙しく、人生は短く、キッティングを効率化することが本業ではありません。

ここまで出来たらいいかな、これ以上は時間効率が悪くなりそう、みたいなラインは決めて、ズルズルと引き延ばさずに撤収することも時には大事です。

そりゃ私だってこういう事はずっとしてたいですけど、「黒い画面に向かってブツブツニヤニヤしながら長時間あーだのうーだの言ってる人」に対する視線を考えたら怖い。(いやそんな事は無いでしょうけど)

結果編:効果測定しよう

さて、一通り半自動化できて効率化も出来たら、効果測定しましょう。
ざっくりでいいです。何なら体感ベースでもいいです。(誰も厳密に検証しないし)

私の場合、こんな感じでした。

拘束されていた手作業時間は、

効率化前:2時間弱

効率化後:30〜40分くらい

に減少しました。

多分作業後のWindowsUpdateが一番時間かかるんじゃないかなぁ。

効果測定の良いところは、何かしら定数的な記録として残しておけば、「情シスの成果」として残せたりすることですね。
社内で業務改善活動だったり、何らかの改善目標や事例収集が有ったりする場合はよいアピールチャンスになったりするのではないでしょうか。
そんな場合はストップウォッチ片手にタイムアタックですね。
(私はこの件でアピールすることもなさそうなので「体感で効率化できた!」くらいにとどめてます)

このくらいのお手軽改善だったら、明日からでも実行できそうですね。
ここで挙げた内容もごくごく一部のサンプルですので、環境ややりたいことはもっと色々だと思います。

君だけのバッチファイルで、最強のキッティング環境を構築しよう!


と、ここまで書いておいてなんですが。
IntuneほしいなぁIntune。
私もゼロタッチキッティングってやつ、やってみてぇ〜〜〜。

この記事が気に入ったらサポートをしてみませんか?