BLOG株式会社ラクーンホールディングスのエンジニア/デザイナーから技術情報をはじめ、世の中のためになることや社内のことなどを発信してます。by一緒にラクーンのサービスをつくりませんか?採用情報カジュアル面談2017.3.1WindowsPCセットアップをスクリプトで自動化する自動化キッティングこんにちは、情シス担当のますいです。弊社では社内のPCは4年(開発チームは2年)を目安に交換することになっており、新人入社や突発的な故障による交換の分も合わせると、年間60台程度の新規PCをセットアップしています。Directoryで管理しています。PCはドメイン参加やソフトウェアインストール等の初期セットアップを行ってユーザーに渡しますが、作業が繁雑なため各種操作を極力自動で実行できるようスクリプトを組んでいます。ここではスクリプトの細部については解説せず、どのような処理をどういうコマンドで実行しているかの概略を説明します。Windowsを起動すると青い画面が出て、ユーザーアカウントなどいくつかの入力を求められます。いうものですが、これは手入力で普通に処理します。PC名の変更Windows8.1まではOOBEの段階でPC名を付けられたのですが、Windows10では初期名称を勝手に命名されてしまうので、起動後にログインしてから変更しなければなりません。変更コマンドをバッチにして、PC名だけ入力すれば良いようにしています。name="%newname%"変更を確定するために一回再起動します。Windows8.1以前に比べて無駄な再起動が1回増えてしまいました。スクリプトによる自動設定ここから自動スクリプトの出番です。ネットワークへの接続やドメイン参加などを行うスクリプト1と、ソフトウェアのインストールやOSの設定を行うスクリプト2に分割してあります。言語はJScriptを使用していますが、VBSやPowerShellなどでも可能でしょう。(スクリプト例はWindowsコマンドとJScriptのメソッドが混在していますが、WindowsコマンドはWScript.Shellのexecまたはrunメソッドで実行しています。)一連の操作は管理者権限を求められるものが多いので、いちいちUACによって中断されることがないよう、コマンドプロンプトを「管理者として実行」で開いてからスクリプトを実行します。弊社ではDHCPサーバにMACアドレスを登録してIPアドレスを固定で割り当てるので、この段階ではネットワークに繋がっていません。割り当てるIPアドレスは別途管理表に記録しています。R2)にリモデで入って予約して...と煩雑な手順が必要になりますが、スクリプトから下記手順で登録しています。エリア接続」、Windows8以降は「イーサネット」と名称が異なるので、スクリプト内でOSバージョンをチェックして指定先を設定しています。1この後、DHCPサーバにPINGを打って疎通を確認しています(スクリプト省略)。コマンドでIPアドレスを予約することができます。このコマンドを、PsExecを用いて遠隔でDHCPサーバに実行させます。PsExec:Microsoftが公開しているWindows管理ツール群[PsTools]の1つで、遠隔PCにコマンドを実行させることができる。MACアドレスの取得にはWMIのWin32_NetworkAdapterConfigurationクラスを使用します(スクリプト省略)。dhcp無線LANを搭載している場合は上記2と同じ手順で無線LANのIPアドレスも予約しておきます。ドメインへの参加ドメインの参加にはWMIのWin32_ComputerSystemクラスでJoinDomainOrWorkgroupメソッドを使用します。3);スクリプト2ソフトウェアインストール部署により異なりますがインストールするソフトウェアは20本程度あります。ソフトウェアのインストール方式は下記のように大別されますのでそれぞれについて解説します。パラメータとしてファイルを指定してインストールします。サイレントモードのオプションがあるので、カスタマイズする必要がなければ簡単にインストールできます。サイレントオプションのあるexeこれも各ソフトウェアの指定に従い実行します。サイレントインストールオプションを指定してインストールします。ファイルをコピーするだけ一部のフリーウェアや社内アプリはローカルの所定の場所にコピーし、デスクトップにショートカットを作成します。[実行ファイルのあるディレクトリ];objShortCut.Save();対話式インストーラこれが一番やっかいです。GUIを操作しなければインストールできないのですが手動ではやりたくない。メソッドを使用してGUIに対して所定の順番でキー入力を行うという、かなり無理矢理な方法をとります。キー入力時に、対象ウィンドウがアクティブになっていない可能性があるので、1入力ごとにウィンドウをアクティブにする処理を入れます。objShell.AppActivate([ウィンドウ名]);ここで、例えば[次へ(N)]というボタンを押す操作の場合、仮にデフォルトでそのボタンにフォーカスが当たっているとしてもエンターキーを送信することはお勧めしません。何らかの影響でフォーカスがずれている可能性があるので必ず[Alt+n]を送信します。objShell.SendKeys("%n");画面遷移に時間がかかる箇所は適宜スリープを挟みますが、遷移状況をスクリプト側から把握できないため、遷移タイミングが予定より遅いと失敗するのが難点です。ソフトウェアの初期設定メーラーなど初期設定が必要なものについては、あらかじめ設定済みのconfを置いたり、レジストリに書き込んだりして可能な限り自動化します。プリンタインストールプリントサーバを使っても良いのですが、慣習で弊社では各PCにプリンタドライバを直接インストールしています。使ってドライバのインストールとプリンタの登録を行います。インストールには、プリンタドライバのインストーラに含まれるinfファイルのパスと、そこに記述されたプリンタ名、IPアドレス、表示名といった情報が必要になります。[表示名]インストール後、通常使うプリンタの選択やプリンタのプロパティ設定は手動で行います。業務能率を上げるため、Windowsの標準設定から変更する部分を設定します。レジストリの操作で可能です。検索結果にWeb検索結果を含めないタスクバーに検索窓を表示しないエクスプローラーからOneDriveを削除するOneDriveをスタートアップから削除するスタートメニューからおすすめを削除する3.おわりにここまで自動化しても手作業の部分は多く残っており、効率化を日々模索しています。会社の規模が大きくなってPC台数が増えてきたら、VDIの導入など抜本的な改善も検討したいと思っています。