メインコンテンツまでスキップ

管理ツールによる一括セットアップ

管理ツールを使って組織内の開発者端末に一括でセットアップするために利用できる、配信用スクリプトを提供しています。ご利用の管理ツールに応じて、カスタマイズしてご利用ください。

有料機能

この機能を利用するには、Guard を有効化した基本サブスクリプションが必要です。詳しくは料金と請求を参照してください。

概要

一括セットアップは、管理者が管理ツール(Jamf、Intune、Ansible など)を使って、組織内の開発者端末に Takumi Guard のレジストリプロキシ設定を一括で配信する仕組みです。開発者自身がコマンドを実行したり、設定ファイルを編集する必要はありません。

以下の図は、一括セットアップの全体構成を示しています。

管理者がコンソールで Bot と管理用 API キーを作成し、セットアップスクリプトとともに管理ツール経由で各端末に配信します。各端末ではスクリプトが自動的に Guard API にトークン発行をリクエストし、npm・pip・uv・Poetry・Bundler の設定ファイルを更新します。以降、各端末からのパッケージインストールは Guard レジストリプロキシを経由するようになります。

セットアップスクリプトによって発行されたトークンは、コンソールの Guard > トークン で一覧・管理できます。

トークン管理画面

セットアップは大きく 2 つのフェーズに分かれます。

  1. 準備:Takumi / Shisho Cloud コンソールで Bot を作成し、セットアップスクリプトをダウンロードします
  2. 配信:管理ツール用のラッパースクリプトを作成し、セットアップスクリプトと合わせて対象端末に配信します

前提条件

配信の前に、Takumi / Shisho Cloud コンソールで以下の設定を完了してください。

  1. Bot を作成する:設定 > Bot ページの「ボットの追加」ボタンから作成してください

    設定 > Bot ページの「ボットの追加」ボタン

  2. ロールを付与する:Bot に「Takumi Guard トークン発行者」ロールを付与してください

    ボットの追加画面で「Takumi Guard トークン発行者」ロールを選択

  3. API キーを取得する:作成した Bot の詳細ページで「API キーの作成」ボタンから静的 API キーを作成し、安全に保管してください

    Bot 詳細ページの「API キーの作成」ボタン

info

Bot の作成と API キーの発行手順の詳細はこちらも参照してください。

セットアップスクリプト

トークンの発行とパッケージマネージャーの設定を行うセットアップスクリプトを提供しています。お使いのプラットフォームに合わせてダウンロードしてください。

info

対象端末には curl がインストールされている必要があります(macOS および Linux の場合)。

使い方

セットアップスクリプトは、実行したユーザーの設定ファイルのみを変更します。組織内の全ユーザーに一括展開する場合は、後述の配信例のラッパースクリプトを使用してください。

セットアップスクリプトを以下のように実行してください。API キーは環境変数 TG_BOT_API_KEY で渡してください。

TG_BOT_API_KEY="shisho_apikey_..." ./setup.sh <BOT_ID> <USER_IDENTIFIER>

各パラメータの意味は以下の通りです。

パラメータ説明
TG_BOT_API_KEYBot の API キー(環境変数)
BOT_IDTakumi / Shisho Cloud コンソールの Bot ID
USER_IDENTIFIERデバイスやユーザーを識別するユニークな値

対象を限定したい場合は、第 3 引数でスコープを指定してください。

TG_BOT_API_KEY="..." ./setup.sh BOT_ID USER_IDENTIFIER npm,rubygems
スコープ設定されるパッケージマネージャー
npmnpm, pnpm, yarn(v2+), bun
pypipip, uv, poetry
rubygemsBundler

参考:USER_IDENTIFIER の決め方

USER_IDENTIFIER は、デバイスやユーザーを識別する文字列です。組織内で一貫した命名規則を決めておくことを推奨します。

文字種の制約は以下の通りです。

  • 使用可能な文字: a-z, A-Z, 0-9, -, _, ., @, +
  • 文字数: 4〜255 文字

以下の例を参考に、組織に合った識別子を選んでください。

説明
デバイスのシリアルナンバー + OS ユーザー名C02X1234_jdoeデバイス BIOS のハードウェアシリアルナンバーを使用
資産管理 ID + 社員 IDASSET0042_EMP12345組織で管理している ID を使用
MDM のデバイス ID + OS ユーザー名a401c7d0_jdoeMDM ツールが割り当てるデバイス ID を使用
警告

選択した識別子が組織内でユニークであることを確認してください。一部の識別子(シリアルナンバーなど)は、自作 PC や仮想マシンなどの環境では空になったり、デバイス間でユニークでない場合があります。各デバイスとユーザーを確実に区別できる値を使用してください。

参考:詳細な挙動

初回実行時

セットアップスクリプトがトークンを発行し、既存の設定ファイルのタイムスタンプ付きバックアップ(例:~/.npmrc-backup-20260408-162351)を作成してから、Guard の設定を追記します。既存の Guard 以外の設定は変更されません。

トークンが上書きされるケース

セットアップスクリプトは、Guard が管理対象とするすべての設定ファイルを確認し、既存のトークンを検出した場合はそのトークンを検証します。また、設定ファイルごとに異なる複数のトークンが存在する場合は、それらすべてのトークンを検証します。

検出されたすべてのトークンが、以下のいずれかの条件に該当する場合、新しい組織ユーザートークンを発行し、既存のトークンをその新しいトークンで上書きします。一方で、有効かつ指定された組織に紐づく組織ユーザートークンが 1 つでも存在する場合は、そのトークンを再利用します。

  • メール認証トークンである場合
  • 存在しないトークンである場合
  • 無効化(失効)されたトークンである場合
  • 別の組織で発行されたトークンである場合

上書き前には、各設定ファイルのタイムスタンプ付きバックアップが作成されます。

再実行時

有効な組織ユーザートークンを検出して再利用するため、上記のケースを除き、新しいトークンは発行されません。また、既に Guard が設定済みのツールはスキップされます(変更もバックアップも行われません)。スコープの増分追加にも対応しています。たとえば、先に npm スコープで実行し、後から pypi スコープを追加できます。

手動ロールバック

セットアップスクリプトは、設定ファイルを変更する前にタイムスタンプ付きの永続バックアップを作成します(例:~/.npmrc-backup-20260408-162351)。Guard の設定を元に戻したい場合は、このバックアップファイルを元のファイル名にコピーしてください(例:cp ~/.npmrc-backup-20260408-162351 ~/.npmrc)。

note

端末の入れ替えや従業員の退職などで不要になったトークンは、Takumi / Shisho Cloud コンソールから失効させてください。詳しくは組織ユーザートークンの失効を参照してください。

警告

パッケージマネージャーに別のレジストリ(プライベート npm レジストリなど)が既に設定されている場合、セットアップスクリプトは既存のレジストリ設定を Guard のレジストリで上書きします。上書き前にタイムスタンプ付きのバックアップファイルが作成されますが、念のため、配信前に対象端末で使用中のレジストリ設定を確認してください。

配信例(端末のユーザー毎に個別トークン)

セットアップスクリプトの配信方法は、お使いの管理ツールや OS によって異なります。ここでは、代表的な配信パターンを紹介します。

必要に応じて配信スクリプトを修正してください

以下のラッパースクリプトは出発点としての例です。実際の環境では、管理用のサービスアカウントや、Takumi Guard を設定したくないユーザーを除外したいケースがあります。ラッパースクリプト側でユーザーを絞り込めば対応できます。

macOS / Linux の例:

# 特定のユーザー名をスキップ
case "$USER_NAME" in
corp-admin|service-account|Guest) continue ;;
esac

Windows の例:

# 特定のユーザー名をスキップ
$Skip = @('corp-admin', 'Guest', 'defaultuser0')
if ($Skip -contains $UserName) { continue }

同様の方針で、対象ディレクトリの絞り込み(/Users/dev-* だけを対象にする等)や、所属グループでの絞り込み(id -Gn "$USER_NAME" | grep -q developers など)も実装できます。

macOS / Linux

管理ツールによるスクリプト実行は通常 root 権限で行われます。各開発者の環境に展開するには、以下のようなラッパースクリプトでユーザーを切り替えて実行してください。macOS では Jamf Pro のスクリプト実行機能 など、管理ツール提供の手順に従って配信してください。

note

root ユーザーにも Guard を適用したい場合は、ラッパースクリプト内でユーザー切り替えなしにセットアップスクリプトを一度実行してください。

macOS

#!/bin/bash
# Admin deployment wrapper

# TODO: Replace with your Bot ID and API key from Shisho Cloud console
BOT_ID="BTXXXXXXXXXXXXXXXXXXXXXXXXXX"
export TG_BOT_API_KEY="shisho_apikey_XXXXX"

# TODO: Update VERSION when a newer setup script becomes available
VERSION="0.5.0"

# Download the setup script
curl -sL -o /tmp/takumi-guard-setup.sh https://shisho.dev/releases/takumi-guard-setup-${VERSION}.sh
chmod 755 /tmp/takumi-guard-setup.sh

# Get the device serial number for USER_IDENTIFIER generation
SERIAL=$(ioreg -l | grep IOPlatformSerialNumber | awk -F'"' '{print $4}')

# Run the setup script for each user on this machine
for USER_HOME in /Users/*; do
USER_NAME=$(basename "$USER_HOME")

# Skip system directories and non-existent paths
[ "$USER_NAME" = "Shared" ] && continue
[ ! -d "$USER_HOME" ] && continue

# Skip if the user account does not exist
id "$USER_NAME" >/dev/null 2>&1 || continue

# Build a unique identifier for this device + user combination
USER_IDENTIFIER="${SERIAL}_${USER_NAME}"

# Run the setup script as this user.
# Use zsh -lic (login + interactive) so that ~/.zshrc is loaded and
# package managers installed outside the default PATH are found.
sudo -u "$USER_NAME" -H zsh -lic '
TG_BOT_API_KEY="'"$TG_BOT_API_KEY"'" \
/tmp/takumi-guard-setup.sh "'"$BOT_ID"'" "'"$USER_IDENTIFIER"'"
'

echo "[Done] $USER_NAME (USER_IDENTIFIER: $USER_IDENTIFIER)"
done

# Clean up credentials and temporary files
unset TG_BOT_API_KEY
rm -f /tmp/takumi-guard-setup.sh

Linux

#!/bin/bash
# Admin deployment wrapper

# TODO: Replace with your Bot ID and API key from Shisho Cloud console
BOT_ID="BTXXXXXXXXXXXXXXXXXXXXXXXXXX"
export TG_BOT_API_KEY="shisho_apikey_XXXXX"

# TODO: Update VERSION when a newer setup script becomes available
VERSION="0.5.0"

# Download the setup script
curl -sL -o /tmp/takumi-guard-setup.sh https://shisho.dev/releases/takumi-guard-setup-${VERSION}.sh
chmod 755 /tmp/takumi-guard-setup.sh

# Get the device serial number for USER_IDENTIFIER generation
SERIAL=$(dmidecode -s system-serial-number)

# Run the setup script for each user on this machine
for USER_HOME in /home/*; do
USER_NAME=$(basename "$USER_HOME")

# Skip non-existent paths
[ ! -d "$USER_HOME" ] && continue

# Skip if the user account does not exist
id "$USER_NAME" >/dev/null 2>&1 || continue

# Build a unique identifier for this device + user combination
USER_IDENTIFIER="${SERIAL}_${USER_NAME}"

# Run the setup script as this user.
# Detect the user's login shell and run it in login + interactive mode
# so that ~/.bashrc (or ~/.zshrc) is loaded and package managers
# installed outside the default PATH are found.
# Explicitly source .bashrc as a fallback for environments where
# .bash_profile does not source it (e.g. CentOS).
USER_SHELL=$(getent passwd "$USER_NAME" | cut -d: -f7)
sudo -u "$USER_NAME" -H "$USER_SHELL" -lic '
[ -f "$HOME/.bashrc" ] && . "$HOME/.bashrc" 2>/dev/null
TG_BOT_API_KEY="'"$TG_BOT_API_KEY"'" \
/tmp/takumi-guard-setup.sh "'"$BOT_ID"'" "'"$USER_IDENTIFIER"'"
'

echo "[Done] $USER_NAME (USER_IDENTIFIER: $USER_IDENTIFIER)"
done

# Clean up credentials and temporary files
unset TG_BOT_API_KEY
rm -f /tmp/takumi-guard-setup.sh

Windows

各端末には複数のユーザーが存在することがあります。これらすべてに対して Guard 設定を一括で適用するか、あるいは特定のユーザーのみに適用するかを検討のうえ、以下いずれかの方法で進めてください。

  • 端末上のすべてのユーザーに一括で適用する場合: 管理ツールがスクリプトを SYSTEM 権限で実行する形となります。Microsoft Configuration Manager(旧 SCCM)、グループポリシーのスタートアップスクリプト、PDQ Deploy など、多くの MDM ツールが既定でこの動作です。
  • ログオン中のユーザーのみに適用する場合: 管理ツールがそのユーザーの資格情報でスクリプトを実行する形となります。Microsoft Intune の「ログオンした資格情報を使用してこのスクリプトを実行する」オプションや、グループポリシーのログオンスクリプトがこの形にあたります。

端末内全ユーザーにインストールする

以下のスクリプトを保存し、管理ツールから各端末へ配信したうえで SYSTEM 権限で実行させてください。SYSTEM 権限で動かす必要があるため、配信経路は基本的に管理ツール経由となります。スクリプトはセットアップスクリプトをダウンロードしたうえで、Win32_UserProfile 経由で端末上の各ユーザープロファイルを順に巡回しながらセットアップを行います。

# Admin deployment wrapper (all-users mode)
# Run as SYSTEM (or any administrator). Requires PowerShell 5.1 or later.

# TODO: Replace with your Bot ID and API key from Shisho Cloud console
$BotId = 'BTXXXXXXXXXXXXXXXXXXXXXXXXXX'
$env:TG_BOT_API_KEY = 'shisho_apikey_XXXXX'

# TODO: Update VERSION when a newer setup script becomes available
$Version = '0.5.0'

# Download the setup script
$ScriptPath = 'C:\Windows\Temp\takumi-guard-setup.ps1'
Invoke-WebRequest -Uri "https://shisho.dev/releases/takumi-guard-setup-$Version.ps1" `
-OutFile $ScriptPath -UseBasicParsing

# Get the device serial number for USER_IDENTIFIER generation
$Serial = (Get-CimInstance -ClassName Win32_BIOS).SerialNumber

# Run the setup script for each user profile on this machine.
# Win32_UserProfile excludes built-in service profiles (SYSTEM, LocalService,
# NetworkService) via `Special = false`. Profiles whose directories no longer
# exist (deleted users with leftover registry entries) are also filtered out.
foreach ($profile in (Get-CimInstance -ClassName Win32_UserProfile -Filter "Special = false" |
Where-Object { $_.LocalPath -and (Test-Path $_.LocalPath) })) {
$UserHome = $profile.LocalPath
$UserName = Split-Path $UserHome -Leaf

# Build a unique identifier for this device + user combination
$UserIdentifier = "${Serial}_${UserName}"

# Invoke setup.ps1 with USER_HOME pointing at this profile. The script
# resolves the profile owner from USER_HOME so that the resulting config
# files grant access to the target developer, not just SYSTEM.
$env:USER_HOME = $UserHome
try {
& powershell.exe -ExecutionPolicy Bypass -File $ScriptPath $BotId $UserIdentifier
} catch {
Write-Output "[Error] Failed for $UserName : $_"
} finally {
Remove-Item Env:USER_HOME -ErrorAction SilentlyContinue
}

Write-Output "[Done] $UserName (USER_IDENTIFIER: $UserIdentifier)"
}

# Clean up credentials and the temporary script
Remove-Item Env:TG_BOT_API_KEY -ErrorAction SilentlyContinue
Remove-Item $ScriptPath -Force -ErrorAction SilentlyContinue

ログオン中のユーザーにインストールする

以下のスクリプトを保存し、管理ツールから各端末へ配信するか、共有ストレージなど別経路で配布のうえ、各端末での実行を依頼してください。

# Admin deployment wrapper (logged-in user mode)
# Run as the logged-in user. Requires PowerShell 5.1 or later.

# TODO: Replace with your Bot ID and API key from Shisho Cloud console
$BotId = 'BTXXXXXXXXXXXXXXXXXXXXXXXXXX'
$env:TG_BOT_API_KEY = 'shisho_apikey_XXXXX'

# TODO: Update VERSION when a newer setup script becomes available
$Version = '0.5.0'

# Download the setup script
$ScriptPath = Join-Path $env:TEMP 'takumi-guard-setup.ps1'
Invoke-WebRequest -Uri "https://shisho.dev/releases/takumi-guard-setup-$Version.ps1" `
-OutFile $ScriptPath -UseBasicParsing

# Build a unique identifier for this device + user combination
$Serial = (Get-CimInstance -ClassName Win32_BIOS).SerialNumber
$UserIdentifier = "${Serial}_${env:USERNAME}"

& powershell.exe -ExecutionPolicy Bypass -File $ScriptPath $BotId $UserIdentifier

# Clean up credentials and the temporary script
Remove-Item Env:TG_BOT_API_KEY -ErrorAction SilentlyContinue
Remove-Item $ScriptPath -Force -ErrorAction SilentlyContinue
note

Windows の既定の実行ポリシーは署名されていない .ps1 をブロックするため、上記のラッパーは実行ポリシーを bypass した状態で起動する必要があります。Microsoft Intune、Microsoft Configuration Manager、グループポリシーのスタートアップスクリプトといった主要な MDM ツールは、PowerShell スクリプトを自動的にこの形で実行するため追加の設定は不要です。PsExec などから手動で起動する場合に限り、powershell.exe -ExecutionPolicy Bypass -File <ラッパースクリプト>.ps1 の形で呼び出してください。

配信例(端末あたり1トークン)

前節のラッパーは(端末, ユーザー)の組ごとにトークンを発行します。1 台の端末に複数の開発者アカウントが存在する環境(共用ワークステーション、MDM が作成する管理者アカウントと利用者アカウントが併存する端末、IdP が発行するアカウントとビルトインローカルアカウントが併存する端末など)では、同じ端末でアカウント数分のライセンスを消費することになります。

1 端末あたり 1 ライセンスに揃えたい場合は、以下のラッパーをご利用ください。端末上のいずれかのアカウントに有効なトークンが存在しないかを確認したうえで、存在する場合は再利用し、存在しない場合だけ新しくトークンを 1 つ発行したうえで、端末上の各開発者アカウントに対して同じトークンで設定します。本節のラッパーと前節のラッパーのいずれも、有効なトークンを検出した場合は再利用するため、定期実行はどちらのモデルでも安全です。

macOS

#!/bin/bash
# Admin deployment wrapper (one token per device)

# TODO: Replace with your Bot ID and API key from Shisho Cloud console
BOT_ID="BTXXXXXXXXXXXXXXXXXXXXXXXXXX"
export TG_BOT_API_KEY="shisho_apikey_XXXXX"

# TODO: Update VERSION when a newer setup script becomes available
VERSION="0.5.0"

# Download the setup script
curl -sL -o /tmp/takumi-guard-setup.sh "https://shisho.dev/releases/takumi-guard-setup-${VERSION}.sh"
chmod 755 /tmp/takumi-guard-setup.sh

# Device-level USER_IDENTIFIER: serial number only -- the token is shared
# across every user on this device, so the identifier does not embed a user.
SERIAL=$(ioreg -l | grep IOPlatformSerialNumber | awk -F'"' '{print $4}')
USER_IDENTIFIER="$SERIAL"

# Phase 1 -- discover an existing active token on this device.
DEVICE_TOKEN=""
for USER_HOME in /Users/*; do
USER_NAME=$(basename "$USER_HOME")
[ "$USER_NAME" = "Shared" ] && continue
[ ! -d "$USER_HOME" ] && continue
id "$USER_NAME" >/dev/null 2>&1 || continue

CANDIDATES=$(sudo -u "$USER_NAME" -H /tmp/takumi-guard-setup.sh discover 2>/dev/null) || continue

while IFS= read -r CAND; do
[ -n "$CAND" ] || continue
STATUS=$(TG_BOT_ID="$BOT_ID" /tmp/takumi-guard-setup.sh verify "$CAND" 2>/dev/null)
case "$STATUS" in
active)
DEVICE_TOKEN="$CAND"
break 2
;;
unknown)
# Network down / API unreachable: abort instead of burning a
# fresh license under uncertainty.
echo "[Error] Could not verify token status against the Shisho Cloud API. Re-run after the API is reachable." >&2
rm -f /tmp/takumi-guard-setup.sh
exit 1
;;
esac
done <<EOF
$CANDIDATES
EOF
done

# Phase 2 -- if no active token exists yet, mint exactly one for the device.
if [ -z "$DEVICE_TOKEN" ]; then
DEVICE_TOKEN=$(TG_BOT_ID="$BOT_ID" /tmp/takumi-guard-setup.sh issue "$USER_IDENTIFIER")
if [ -z "$DEVICE_TOKEN" ]; then
echo "[Error] Failed to obtain device token" >&2
exit 1
fi
fi

# Phase 3 -- install the same token for every developer account.
for USER_HOME in /Users/*; do
USER_NAME=$(basename "$USER_HOME")
[ "$USER_NAME" = "Shared" ] && continue
[ ! -d "$USER_HOME" ] && continue
id "$USER_NAME" >/dev/null 2>&1 || continue

sudo -u "$USER_NAME" -H zsh -lic "
/tmp/takumi-guard-setup.sh install '$DEVICE_TOKEN'
"

echo "[Done] $USER_NAME"
done

# Clean up credentials and temporary files
unset TG_BOT_API_KEY
rm -f /tmp/takumi-guard-setup.sh

Linux

#!/bin/bash
# Admin deployment wrapper (one token per device)

# TODO: Replace with your Bot ID and API key from Shisho Cloud console
BOT_ID="BTXXXXXXXXXXXXXXXXXXXXXXXXXX"
export TG_BOT_API_KEY="shisho_apikey_XXXXX"

# TODO: Update VERSION when a newer setup script becomes available
VERSION="0.5.0"

# Download the setup script
curl -sL -o /tmp/takumi-guard-setup.sh "https://shisho.dev/releases/takumi-guard-setup-${VERSION}.sh"
chmod 755 /tmp/takumi-guard-setup.sh

# Device-level USER_IDENTIFIER: serial number only.
SERIAL=$(dmidecode -s system-serial-number)
USER_IDENTIFIER="$SERIAL"

# Phase 1 -- discover an existing active token on this device.
DEVICE_TOKEN=""
for USER_HOME in /home/*; do
USER_NAME=$(basename "$USER_HOME")
[ ! -d "$USER_HOME" ] && continue
id "$USER_NAME" >/dev/null 2>&1 || continue

CANDIDATES=$(sudo -u "$USER_NAME" -H /tmp/takumi-guard-setup.sh discover 2>/dev/null) || continue

while IFS= read -r CAND; do
[ -n "$CAND" ] || continue
STATUS=$(TG_BOT_ID="$BOT_ID" /tmp/takumi-guard-setup.sh verify "$CAND" 2>/dev/null)
case "$STATUS" in
active)
DEVICE_TOKEN="$CAND"
break 2
;;
unknown)
echo "[Error] Could not verify token status against the Shisho Cloud API. Re-run after the API is reachable." >&2
rm -f /tmp/takumi-guard-setup.sh
exit 1
;;
esac
done <<EOF
$CANDIDATES
EOF
done

# Phase 2 -- if no active token exists yet, mint exactly one for the device.
if [ -z "$DEVICE_TOKEN" ]; then
DEVICE_TOKEN=$(TG_BOT_ID="$BOT_ID" /tmp/takumi-guard-setup.sh issue "$USER_IDENTIFIER")
if [ -z "$DEVICE_TOKEN" ]; then
echo "[Error] Failed to obtain device token" >&2
exit 1
fi
fi

# Phase 3 -- install the same token for every developer account.
for USER_HOME in /home/*; do
USER_NAME=$(basename "$USER_HOME")
[ ! -d "$USER_HOME" ] && continue
id "$USER_NAME" >/dev/null 2>&1 || continue

USER_SHELL=$(getent passwd "$USER_NAME" | cut -d: -f7)
sudo -u "$USER_NAME" -H "$USER_SHELL" -lic "
[ -f \"\$HOME/.bashrc\" ] && . \"\$HOME/.bashrc\" 2>/dev/null
/tmp/takumi-guard-setup.sh install '$DEVICE_TOKEN'
"

echo "[Done] $USER_NAME"
done

# Clean up credentials and temporary files
unset TG_BOT_API_KEY
rm -f /tmp/takumi-guard-setup.sh

Windows

端末内全ユーザーにインストールする

# Admin deployment wrapper (all-users, one token per device)
# Run as SYSTEM (or any administrator). Requires PowerShell 5.1 or later.

# TODO: Replace with your Bot ID and API key from Shisho Cloud console
$BotId = 'BTXXXXXXXXXXXXXXXXXXXXXXXXXX'
$env:TG_BOT_API_KEY = 'shisho_apikey_XXXXX'

# TODO: Update VERSION when a newer setup script becomes available
$Version = '0.5.0'

# Download the setup script
$ScriptPath = 'C:\Windows\Temp\takumi-guard-setup.ps1'
Invoke-WebRequest -Uri "https://shisho.dev/releases/takumi-guard-setup-$Version.ps1" `
-OutFile $ScriptPath -UseBasicParsing

# Device-level USER_IDENTIFIER: serial number only.
$Serial = (Get-CimInstance -ClassName Win32_BIOS).SerialNumber
$UserIdentifier = $Serial

# Win32_UserProfile excludes built-in service profiles (SYSTEM, LocalService,
# NetworkService) via `Special = false`. Profiles whose directories no longer
# exist (deleted users with leftover registry entries) are also filtered out.
$Profiles = Get-CimInstance -ClassName Win32_UserProfile -Filter "Special = false" |
Where-Object { $_.LocalPath -and (Test-Path $_.LocalPath) }

# Phase 1 -- discover an existing active token on this device.
$DeviceToken = $null
:OuterDiscover foreach ($profile in $Profiles) {
$env:USER_HOME = $profile.LocalPath
$candidates = & powershell.exe -NoProfile -ExecutionPolicy Bypass -File $ScriptPath discover 2>$null
Remove-Item Env:USER_HOME -ErrorAction SilentlyContinue
if (-not $candidates) { continue }
foreach ($c in @($candidates)) {
if (-not $c) { continue }
$env:TG_BOT_ID = $BotId
$status = & powershell.exe -NoProfile -ExecutionPolicy Bypass -File $ScriptPath verify $c 2>$null
Remove-Item Env:TG_BOT_ID -ErrorAction SilentlyContinue
switch ($status) {
'active' {
$DeviceToken = $c
break OuterDiscover
}
'unknown' {
Write-Output "[Error] Could not verify token status against the Shisho Cloud API. Re-run after the API is reachable."
Remove-Item $ScriptPath -Force -ErrorAction SilentlyContinue
exit 1
}
}
}
}

# Phase 2 -- if no active token exists yet, mint exactly one for the device.
if (-not $DeviceToken) {
$env:TG_BOT_ID = $BotId
$DeviceToken = & powershell.exe -NoProfile -ExecutionPolicy Bypass -File $ScriptPath issue $UserIdentifier
Remove-Item Env:TG_BOT_ID -ErrorAction SilentlyContinue
if (-not $DeviceToken) {
throw "Failed to obtain device token"
}
}

# Phase 3 -- install the same token for every user profile.
foreach ($profile in $Profiles) {
$UserHome = $profile.LocalPath
$UserName = Split-Path $UserHome -Leaf
$env:USER_HOME = $UserHome
try {
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File $ScriptPath install $DeviceToken
} catch {
Write-Output "[Error] Failed for $UserName : $_"
} finally {
Remove-Item Env:USER_HOME -ErrorAction SilentlyContinue
}
Write-Output "[Done] $UserName"
}

# Clean up credentials and the temporary script
Remove-Item Env:TG_BOT_API_KEY -ErrorAction SilentlyContinue
Remove-Item $ScriptPath -Force -ErrorAction SilentlyContinue

セキュリティ上の注意事項

  • Bot の API キーの取り扱い:漏洩した場合は、Takumi / Shisho Cloud コンソールから直ちに無効化してください。既に発行済みのトークンには影響しません。
  • キーのローテーション:すべての対象端末への配信が完了したら、予防策として Takumi / Shisho Cloud コンソールで Bot の API キーをローテーションしてください。
  • トークンの失効:トークンが漏洩した場合は、Takumi / Shisho Cloud コンソールからトークンを失効させてください。失効は最大 60 秒で反映されます。

Tips: 定期実行も検討してください

セットアップスクリプトは、再実行時に Guard が設定済みのツールをスキップし、有効なトークンを再利用するように設計されています。したがって、管理ツール経由で 定期的に実行する運用 にも適しています。

定期実行することで、以下のようなケースに自動で追随できます。

  • 新しく組織に参加した開発者の端末に、初回ログイン後に自動でセットアップが行き渡る
  • 端末を初期化した・再セットアップした場合に、改めて配信を依頼しなくても再構成される
  • ユーザーが誤って Takumi Guard 設定を削除・上書きした場合に、次回実行時に復旧される

実行間隔はおおよそ日次〜週次が現実的です。