RustDeskのOSSセルフホストでIDをコンピューター名にした～い！なんならキッティングも自動化した～い！

と思う人は多いと思ったので作ってみました。
**営利目的**とか**会社で**使うならRustDesk Server Proのライセンス買ってあげて下さいね。

https://rustdesk.com/pricing.html

```toml:RustDesk2.toml
rendezvous_server = 'RustDeskメインサーバのIPまたはホスト名:21116'
[options]
key = '生成済みの公開鍵'
custom-rendezvous-server = 'RustDeskメインサーバのIPまたはホスト名'
relay-server = 'RustDeskリレーサーバのIPまたはホスト名'
```

上記以外の設定はRustDeskクライアント側で設定変更をした後、AppDataディレクトリから該当の`RustDesk2.toml`を見ると設定内容を確認できます。

```powershell:Installer.ps1
# 管理者権限昇格要求用
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }
Set-Location -Path (Split-Path -Path $MyInvocation.MyCommand.Definition -Parent)

# RustDeskのクライアントが存在していた場合、一旦アンインストールする
if (Test-Path "$env:APPDATA\RustDesk") {
    & "C:\Program Files\RustDesk\rustdesk.exe" --uninstall
    Start-Sleep -Seconds 15
}

# サービスのデータも削除する
Remove-Item -Recurse -Force "C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk" -ErrorAction SilentlyContinue

# 各ユーザーのデータも削除する
Get-ChildItem -Directory "C:\Users" | ForEach-Object {
    $userDir = $_.FullName
    $rustDeskPath = "$userDir\AppData\Roaming\RustDesk"
    if (Test-Path $rustDeskPath) {
        Remove-Item -Recurse -Force $rustDeskPath -ErrorAction SilentlyContinue
    }
}

# rustdeskのインストーラーを実行する
& ".\rustdesk.exe" --silent-install

# インストールしてrustdesk.exeが叩けるようになるまで待つ
do {
    Start-Sleep -Seconds 1
} until (Test-Path "C:\Program Files\RustDesk\rustdesk.exe")

# コンピューター名関連の処理をする
$computerName = $env:COMPUTERNAME

# コンピューター名の1文字目が英字以外の場合"R"を接頭語にする(好きなように変えられます　)
if ($computerName[0] -notmatch '^[a-zA-Z]') {
    $computerName = "R" + $computerName
}

# 英数字以外(ハイフンとか)使われている場合ヌル文字に置き換える
$cleanedComputerName = $computerName -replace '[^a-zA-Z0-9]', ''

#16文字を超える場合16文字以内に切り捨てる
if ($cleanedComputerName.Length -gt 16) {
    $cleanedComputerName = $cleanedComputerName.Substring(0, 16)
}

$RDCN = $cleanedComputerName

# 事前に生成した設定ファイルを突っ込む
$configDir = "C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config"
New-Item -ItemType Directory -Path $configDir -Force
Copy-Item -Path "RustDesk2.toml" -Destination "$configDir\"

# 事前に生成したIDを突っ込む
$idContent = "id = '$RDCN'"
$idContent | Out-File -FilePath "$configDir\RustDesk.toml" -Encoding utf8

# 各ユーザーで同じことをする
Get-ChildItem -Directory "C:\Users" | ForEach-Object {
    $userDir = $_.FullName
    $userConfigDir = "$userDir\AppData\Roaming\RustDesk\config"
    if (-not (Test-Path $userConfigDir)) {
        New-Item -ItemType Directory -Path $userConfigDir -Force
        Copy-Item -Path "RustDesk2.toml" -Destination "$userConfigDir\"
        $idContent | Out-File -FilePath "$userConfigDir\RustDesk.toml" -Encoding utf8
    }
}

# 念の為ちょっと寝かせる
Start-Sleep -Seconds 10

# 無人アクセス用パスワードを設定する(ちゃんとセキュリティには気をつけて設定して下さい)
& "C:\Program Files\RustDesk\rustdesk.exe" --password HogeFuga
```

上記をiexpressとかでパッケージ化、配布すれば無人インストールセットアップが出来ます。

:::note warn
IDが重複してしまった場合の処理は行っていません。また、判定もしていません。
OSS版サーバはユーザー側でのID変更は対応していません。(サーバ側のsqliteをさわさわすれば弄ることは可能、但しクライアント側も反映が必要)(--set-idを使わなかったのはこれが理由)
一度使用したIDは別のコンピューターに割り振ることはそのままでは出来ません。
サーバのsqliteを削除して再起動するか、編集すれば再利用することが出来ます。
:::