Windows 10 端末の初期設定時に役立つ PowerShell スクリプト

# 複数端末を設定しなければならない時の PowerShell スクリプト活用
Windows 10 （未検証だが Windows 11 でも動くかも）の新規端末を複数のユーザー向けに設定しなければならない場合、 GUI でポチポチするのもいいが、10台とか超えてくると大変なので、 PowerShell スクリプトで何とかしようという取り組み。
## 前提条件
* 基本は PowerShell スクリプトなので、新端末にネットワーク経由でも USB 経由でも送り込ませる方法が必要
* Windows の初期設定時のユーザーは管理用として普通に作成されるものとしている。管理用にてサインイン後のユーザー作成等が対象
* 新たに必要となった設定等は順次追加更新していくとして、現時点で作られたスクリプトとして公開
## ユーザーの新規作成
コード的には簡単だが、ユーザーネームとフルネーム、パスワード等を組み込まなくてはならないので、 Excel で作成したいユーザーの一覧を作っておいて、コードに組み込み形で自動生成する表を作っておいて、ユーザーごとにコピペで対応した。具体的には以下のような感じだ。
```powershell
="New-LocalUser -Name " & LEFT(E3, FIND("@", E3)-1) & " -Password (ConvertTo-SecureString " & UNICHAR(34) & I3 & UNICHAR(34) & " -AsPlainText -Force) -PasswordNeverExpires -FullName " & UNICHAR(34) & B3 & UNICHAR(34) & " | Add-LocalGroupMember -Group ""Administrators"" -Member " & UNICHAR(34) & LEFT(E3, FIND("@", E3)-1) & UNICHAR(34) 
```
B3 にフルネーム、 E3 にメールアドレス、I3 にパスワードが入力されている前提。メールアドレスからユーザーネームを作成している。
これをコピーすると以下のコードを取得できる。
```powershell
# User Add
New-LocalUser -Name <username> -Password (ConvertTo-SecureString <"password"> -AsPlainText -Force) -PasswordNeverExpires -FullName <"名前 太郎"> | Add-LocalGroupMember -Group <"Administrators"> -Member <"username">
```

## 不要なアプリケーションの削除
ここからは新規ユーザーを作成後、該当のユーザーでサインイン後にスクリプトとして実行する必要がある。ひとつの ps1 ファイルにしておいて実行でも問題ない。

メーカー製端末だと、結構いろいろなアプリが事前インストールされていたり、ネットワークにつなぐと Windows がゲームアプリをどんどんインストールしていったりするので、まとめて削除する。Windows を導入したタイミング、メーカーによっても内容が違うので、最初にひとつ端末を作ってから、不要なアプリを確認し 2 台目以降にスクリプト適用していくと手間が少なくなっていい。
```powershell
# Uninstall Package
Get-AppxPackage king.com.CandyCrushSaga | Remove-AppxPackage
Get-AppxPackage king.com.CandyCrushSodaSaga | Remove-AppxPackage
Get-AppxPackage king.com.FarmHeroesSaga | Remove-AppxPackage
Get-AppxPackage *.HiddenCityMysteryofShadows | Remove-AppxPackage
Get-AppxPackage *MarchofEmpires* | Remove-AppxPackage
Get-AppxPackage *.DropboxOEM | Remove-AppxPackage
Get-AppxPackage *McAfeeSecurity* | Remove-AppxPackage
Get-AppxPackage *Netflix* | Remove-AppxPackage
Get-AppxPackage *Booking.com* | Remove-AppxPackage
Get-AppxPackage SpotifyAB.SpotifyMusic | Remove-AppxPackage
Get-AppxPackage *Linkedin* | Remove-AppxPackage
Get-AppxPackage Microsoft.MixedReality.Portal | Remove-AppxPackage
```
ちなみに、パッケージ名の取得方法は以下のサイトを参考にしている。
PowerShell コマンドで調べて上記コマンドで削除しているような感じだ。

https://ascii.jp/elem/000/001/918/1918304/

## 特殊なアプリケーションの削除
上記`Remove-AppxPackage`でも簡単に消えてくれないアプリが存在する。そんな場合は違う手法にてアンインストールする必要があるようだ。以下は McAfee を削除する場合の方法である。レジストリの場所等はバージョンで違う可能性があるため、事前に確認しておこう。
```powershell
# Uninstall McAfee Security App
$mcafee = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "McAfee Security" } | select UninstallString
if ($mcafee) {
	$mcafee = $mcafee.UninstallString -Replace "C:\Program Files\McAfee\MSC\mcuihost.exe",""
	Write "Uninstalling McAfee..."
	start-process "C:\Program Files\McAfee\MSC\mcuihost.exe" -arg "$mcafee" -Wait
}
```

## 必要なアプリケーションのインストール
不要なファイルがある一方、全員にインストールしておかなければならないアプリも存在する。 Teams や Zoom などの場合、インターネットから直接最新版をダウンロードできるので、ダウンロードディレクトリ等に落としてきてインストールを実施してしまえばよい。
直接ダウンロードできないアプリはネットワーク上の共有ディレクトリに配置しておく方法もある。事前にダウンロードしておく場合、常に最新版を置いておくようにしよう。
```powershell
# Install Teams
Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/p/?LinkID=869426&clcid=0x411&culture=ja-jp&country=JP&lm=deeplink&lmsrc=groupChatMarketingPageWeb&cmpid=directDownloadWin64" -OutFile ~/Downloads/Teams_windows_x64.exe
~/Downloads/Teams_windows_x64.exe -ms

# Install Zoom
Invoke-WebRequest -Uri "https://zoom.us/client/latest/ZoomInstaller.exe" -OutFile ~/Downloads/ZoomInstaller.exe
~/Downloads/ZoomInstaller.exe -ms
```
最近は Microsoft Store にアプリが充実してきており、 Microsoft Store からインストールしておいた方が、アップデート等の管理手間が省けると思っている。
Microsoft Store からのコマンドインストールはまだ調査中だ。

この辺りのコードを網羅しておけば、複数の端末のセットアップも多少は楽になるだろう。
AD で端末の管理等を一括で実施できる環境ならこんな方法はいらないが、中小レベルでも 10 台、 20 台、入れ替えでセットアップなんてことはよくあることなので、覚えておくと便利に使える。