Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

ゼロタッチキッティングにおけるPC名の自動設定について

こんにちは。コーポレートシステム部の寺園です。
社内情報システムのインフラ構築や、業務改善の設計・開発を担当しています。

前回の記事 からだいぶ空いてしまいました。
サービスの進化は早いもので日進月歩で新しい技術が次々と出てきており当社でも色々と変化が起きていますが、システム担当としては既に運用されているサービスへの影響を最小限にしつつ新しい技術を取り入れていくにはどうすれば良いか、ということに日々頭を悩ませています。

今回はそんな中で対応したキッティングに関する裏側のお話をさせていただきます。

Intuneの導入における課題

Macは既に Jamf Pro で管理する構成になっていましたが、Windowsは所謂オンプレAD (オンプレミスのActive Directory) からなかなか抜け出せずにいました。

これを先日ようやく全社的に Microsoft Intune 管理への移行を行いました。
このお話はこれだけで記事が書けるのでまたの機会にしますが、その中で出てきた課題が「PC名どうする?」です。

当社の社用PCは基本的に PC名=資産管理番号 を設定するようにしています。

オンプレAD時代は手動での設定を行っていましたが、Intuneを導入したのは Windows Autopilot (PCの自動セットアップ機能) によるゼロタッチキッティングを行えるようにすることが目的です。ここに一部でも手作業が入ってしまうとユーザー側だけで作業が完結できなくなるためこれは避けたいと考えました。

Intuneの機能で実現できないかも検討しましたが、Intuneで利用可能なのは「デバイス名のテンプレート」というものだけです。これは以下の2つの変数と固定文字列しか利用できません。

  • %SERIAL% : PCのシリアル番号
  • %RAND:x% : 任意の桁数のランダム数値

Intuneデバイス名のテンプレート設定画面

困りました。ランダム値は逆にPC名と資産管理台帳との紐付けが難しくなりますし、シリアル番号は紐付けはできるもののあまりユーザーフレンドリーではありません。

MacでのPC名設定方法

少し話を変えて、それではMacではどうしていたのかというとこれは簡単です。
Jamfのポリシー機能でPC名変更のスクリプトを実行しています。

察しの良い方はその中で資産管理番号をどうやって取得するのかを疑問に思われたと思いますが、これは単純にスクリプトで資産管理台帳のAPIから取得する処理を実行しています。

フローとしては以下のような処理です。ご覧いただければお分かりいただけると思いますが、クライアント側で処理させるにしてはそこそこ複雑になってしまっています。これは資産管理台帳のAPIから取得したデータを整形するなどの処理が必要となっているためです。

Macはこれでも良かったのですが、Intuneで利用可能なのは基本的に Powershell です。

異なる言語による同様の複雑な処理を作成するのは手間もありますし、何より管理が煩雑になってしまうためこの解決方法を考えました。

機能分離によるサーバ側での処理

そこで元々クライアント側で実行させていた処理を分離し、サーバ側で処理させるため専用のAPIを設けることにしました。具体的には “資産管理台帳APIへの問い合わせ” から “資産管理番号を取得する” 所までです。

AWSに API Gateway を作成し、これをクライアントからの問い合わせ先とします。

認証は Lambda Authorizer で行い、Lambda Function でそれまでクライアント側で実行していた処理を実装しました。問い合わせへのレスポンス値はPC名である資産管理番号になります。

これによりクライアント側の処理がかなりシンプルになったのと、資産管理台帳APIの認証情報をクライアント側で利用しなくても良くなったためセキュリティ向上にも繋がりました。

IntuneアプリでのPC名設定

ここからはIntuneでの実装についてです。

Intuneでは Powershell を使用して実装します。

実行タイミングのコントロールが難しい点やセキュリティの問題 *1 もあるためIntuneのPowershellスクリプト機能は利用しません。

Win32 アプリを利用して .intunewin というインストールファイルにすることでPowershellなどのスクリプトも実行することができるようになります。ここらへんの実装方法は詳しい記事が沢山ありますので割愛させていただきます。

さて、前述で実施していた処理分割により実装は割と簡単になりました。

Powershellでの実装となりますが、資産管理番号の問い合わせはサーバ側 (Lambda) で実行してくれるのでここではAPI Gatewayに問い合わせするだけで資産管理番号=PC名が返ってきます。

処理としてはこれを元にPC名を設定するだけの処理になります。

抜粋すると以下のような処理になります。

# シリアル番号を取得
$Serial = (Get-CimInstance -Class Win32_BIOS).SerialNumber

# 資産管理台帳APIに問い合わせし資産管理番号=PC名を取得する
$Headers = @{"Authorization" = "$Secret"}
$Query = "serial=$Serial"
$ComputerName = Invoke-RestMethod `
    -Method Get `
    -Headers $headers `
    -Uri $ApiUrl + "?$Query"

# PC名を設定しリターンコード1641(ハードリブート)で終了する
Rename-Computer -PassThru -NewName "$ComputerName" -Force
exit 1641

いくつか実装にあたっての注意点があるので解説させていただきます。

PC名変更時の再起動はリターンコードを利用する

Macと違い、WindowsはPC名変更時に再起動が必須になります。

PC名変更の Rename-Computer コマンドレットには -Restart パラメータが指定可能で、これを指定すると自動的に再起動を実行してくれます。

# 単体で利用する場合はこのように再起動(-Restart)も合わせて指定することが多い
Rename-Computer -PassThru -NewName "$ComputerName" -Restart -Force

しかしこれを指定してしまうと、Intuneが "アプリ (スクリプト) が正常終了した" という判定をする前に再起動が実行されてしまうためここでは利用すべきではありません。

それではどうするのかと言うとスクリプト終了時のリターンコードを指定します。

IntuneのWin32アプリでは、設定したアプリから返されるリターンコードを元に再起動の動作を制御する設定が可能です。再起動に関連するリターンコードは以下2つ *2 です。

  • 3010: ソフトリブート
  • 1641: ハードリブート

ソフトリブートはその他アプリのインストールを待ってから再起動が実行されますが、ハードリブートはこのアプリインストール完了後に即時再起動が実行され、その後にその他アプリのインストールが再開されます。

ここでは即時再起動したいためリターンコードをハードリブートの1641で指定します。

exit 1641

後はWin32アプリの “プログラム” の設定で以下を変更しておきます。
これによりリターンコードを受け取ると再起動が実行されるようになります。

  • デバイスの再起動:リターンコードを基に動作を決定する

Win32アプリのプログラム設定画面

構成図

PC名自動設定の全体的な構成図としては以下のようになりました。

サーバ側に処理を分割したことでMacとWindowsで実装方法や使用言語が異なっても、シンプルな構成にすることができたと思います。

つまづきポイント

実はこの機能実装と合わせて、冒頭で紹介していたIntuneの「デバイス名のテンプレート」機能を使用していたのですがこれにより問題が発生しました。

当初はこの機能を利用して “シリアル番号” を初期のPC名として利用する計画でした。

テンプレートとしてシリアル番号を設定した例

まず前提としてIntune登録時のPC名デフォルト値は DESKTOP-xxxx になります。

PC名自動設定の処理によりPC名はこのデフォルト値から変更されるのですが、この結果がIntuneに反映されるまで時間がかかります。その反映までの間にテンプレートで設定されたシリアル番号が表示されることを期待していました。

想定していたのは以下のような流れです。

  1. Intune登録時のPC名がデフォルト値の DESKTOP-xxxx になる
  2. デバイス名のテンプレートが適用されて シリアル番号 がPC名に変わる
  3. 自動設定により 資産管理番号 がPC名に変わる

しかし、実際のAutopilotの動作は以下のようになってしまいました。

  1. Intune登録時のPC名がデフォルト値の DESKTOP-xxxx になる
  2. 自動設定により 資産管理番号 がPC名に変わる
  3. デバイス名のテンプレートが適用されて シリアル番号 がPC名に変わる

せっかく自動設定されたPC名がテンプレートにより上書きされてしまいました。

これにはすぐに気づけず何度か検証を重ねるうちに発覚したのですが、これはタイミングによっては前述のパターン (つまり想定通りの動作) になることもあったためです。

問題点が判明したため、このデバイス名テンプレート機能はオフにして利用しないことで解決しました。(しばらく DESKTOP-xxxx になるのは致し方なしとしました)

まとめ

今回は Mac、Windows のそれぞれでゼロタッチキッティング時に実行しているPC名の自動設定という内容についてご紹介しました。こういった構成は各社工夫されているのだろうと思いますが当社の事例が参考になれば幸いです。

サービスの導入時には色々と課題も発生してくるのですが、それを1つ1つ解決していくこともまた楽しみであると思います。

こういった業務に興味がおありでしたら是非 採用情報 もご覧いただけると幸いです。

さて、インフラ寄りの話が続きましたので次回は私がもう1つ担当している業務改善 (DX) の活動についても記事にしたいと思います。お楽しみに!

*1:Intuneのスクリプト機能で実行されたPowershellスクリプトは、そのソース内容がクライアント側のログに残ってしまうため認証情報を扱うようなスクリプトを扱うのは推奨されません

*2:リターンコードは任意のコードに変更することも可能です

© Sansan, Inc.