- Published on
モダンPowerShell & Windows DevOps 2026 完全ガイド - PowerShell 7.5・WinGet・Sysinternals・DSC v3・Windows Terminal・WSL2 徹底解説
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 「Windows DevOpsは死んだ」という神話への別れ
- 1. PowerShell 7.5 と Windows PowerShell 5.1 の違い
- 2. PowerShell 7.5 の主要新機能
- 3. PowerShell Gallery と PSResourceGet
- 4. PSScriptAnalyzer によるLint
- 5. Pester 5 によるテスト
- 6. PSReadLine と Predictive IntelliSense
- 7. WinGet — Windows公式パッケージマネージャ
- 8. ChocolateyとScoopの立ち位置
- 9. Sysinternals 2024.x — Mark Russinovich の道具箱
- 10. Windows Terminal 1.21 — モダンなターミナル体験
- 11. WSL2 — Windowsの中の本物のLinuxカーネル
- 12. Windows コンテナ — Dockerではない別の道
- 13. DSC v3 — Desired State Configurationの復活
- 14. Windowsに対するAnsible
- 15. SCCM / Intune / Microsoft Endpoint Manager
- 16. Azure CLI 2 vs Az PowerShell
- 17. AWS Tools for PowerShell、GCP PowerShell、GitHub CLI
- 18. Try/Catch、共通パラメータ、Splatting
- 19. パイプラインオブジェクトとPSCustomObject
- 20. GUI自動化 — Out-GridView、ImportExcel、PSWriteHTML
- 21. Active Directory と Group Policy のcmdlet
- 22. Microsoft Graph PowerShell SDK
- 23. Windows Server 2025 の新機能
- 24. ベストプラクティス — 実戦的な推奨事項
- 25. PowerShell Universal と PowerShell Studio
- 26. 韓国 / 日本 / グローバルのWindows DevOps現場
- References
「Windows DevOpsは死んだ」という神話への別れ
2026年の現在、「DevOpsはLinuxだけのもの」という主張はもはや事実ではありません。Windows Server 2025がホットパッチとOpenSSHを既定で搭載して以来、Windowsは再びエンタープライズ自動化の一級市民として戻ってきました。NHN CloudのWindows VMワークロードは2025年時点でIaaS売上の22%を占め、Samsung SDSとLG CNSの大規模SIプロジェクトの多くはいまだにActive DirectoryとSCCMの上で動いています。日本のNEC、IIJ、富士通はWindows運用を中核サービスとして維持しており、Microsoft Japanの東京オフィスはPowerShell 7.5のPSReadLine日本語入力改善に直接コントリビュートしました。
本記事は2026年5月時点でPowerShell 7.5、WinGet、Sysinternals 2024.x、DSC v3、Windows Terminal 1.21といったツールを、単なるcmdletの羅列を超えて — 実際の運用パターン、ハマりどころ、そして韓国・日本・グローバルの具体例とともに掘り下げる実践ガイドです。Linuxしか触ったことがないエンジニアでも、30年来のWindows管理者でも、得られるものがあるはずです。
1. PowerShell 7.5 と Windows PowerShell 5.1 の違い
最初にはっきりさせておくべきことがあります。PowerShellは2つあります。
- Windows PowerShell 5.1: 2016年リリース、.NET Framework 4.x ベース、Windows 10/11に既定で含まれる。新機能の追加なし(セキュリティ修正のみ)。
- PowerShell 7.x: 2020年から始まったオープンソースのクロスプラットフォーム後継。2026年時点で7.4 LTSと7.5 GAが並行運用。.NET 8/9 ベース。
5.1を離れるべき理由は明確です。
- 速度 — 7.5は多くのワークロードで5.1の3〜5倍高速。ForEach-Object -Parallelは5.1には存在しません。
- .NET 9 — System.Text.JsonやHttpClientなどモダンなライブラリが使えます。
- ネイティブコマンド統合 — kubectl、terraform、azといったツールの出力解析が圧倒的に自然。
- クロスプラットフォーム — 同じスクリプトがLinuxとmacOSでも動きます。
- Predictive IntelliSense — Az PredictorやGitHub Copilot for CLIと統合。
ただし5.1を完全に切れないケースもあります。Active Directory(RSAT)の一部cmdlet、ConfigMgr(SCCM)モジュール、一部の旧Exchange Onlineモジュールは依然として5.1専用です。回避策としては7.5のWindowsCompatibilityモジュール、またはpwsh -WindowsPowerShellでの互換モード起動が定番です。
2. PowerShell 7.5 の主要新機能
#Requires -Version 7.4
# ForEach-Object -Parallel: 5.1にはない
1..100 | ForEach-Object -Parallel {
"Processing $_"
Start-Sleep -Seconds 1
} -ThrottleLimit 10
# 三項演算子 (7.0+)
$status = (Test-Path C:\foo) ? "exists" : "missing"
# パイプラインチェーン演算子
Get-Service Spooler && Restart-Service Spooler || Write-Warning "Service not found"
# Null条件演算子
$user?.Profile?.Email
# Splatting + 高度な関数
$params = @{
Path = "C:\Logs"
Recurse = $true
Filter = "*.log"
}
Get-ChildItem @params
7.5での注目すべき変更点は、ConvertTo-Json -EnumsAsStringsが既定動作になったこと、Test-Jsonのスキーマ検証強化、そしてPSResourceGetがPSGalleryクライアントを実質的に置き換えたことです。
3. PowerShell Gallery と PSResourceGet
PowerShellのパッケージマネージャは2種類あります。
- PowerShellGet 2.x (旧版) — Install-Module、Find-Module
- Microsoft.PowerShell.PSResourceGet (新版、7.4+に既定同梱) — Install-PSResource、Find-PSResource
# 新版(推奨)
Install-PSResource -Name Az -Scope CurrentUser
Install-PSResource -Name Microsoft.Graph -Scope AllUsers
# 旧版(互換性のため)
Install-Module -Name PSScriptAnalyzer -Scope CurrentUser -Force
# プライベートフィードの登録
Register-PSResourceRepository -Name "InternalNuGet" -Uri "https://nuget.internal/v3/index.json"
PSResourceGetはNuGet v3プロトコルをネイティブにサポートするため、Azure Artifacts、GitHub Packages、JFrog Artifactoryなど社内フィードと直接連携できます。これはPowerShellGet 2.xの最大の弱点でした。
4. PSScriptAnalyzer によるLint
Install-PSResource PSScriptAnalyzer -Scope CurrentUser
# 単一ファイル
Invoke-ScriptAnalyzer -Path .\Deploy.ps1 -Severity Warning,Error
# ディレクトリ再帰
Invoke-ScriptAnalyzer -Path .\scripts -Recurse -Settings PSGallery
# CIに統合(終了コード活用)
$results = Invoke-ScriptAnalyzer -Path .\scripts -Recurse
if ($results) {
$results | Format-Table
throw "Linting failed with $($results.Count) issues"
}
リポジトリのルートにPSScriptAnalyzerSettings.psd1を置けばチーム全体で同じルールを共有できます。韓国のKakao Enterpriseと日本のサイバーエージェントはこのパターンをCIゲートとして標準化しています。
5. Pester 5 によるテスト
PesterはPowerShellのデファクトスタンダードなテストフレームワークです。4.xと5.xで構文が大きく異なるため、新規プロジェクトは必ず5.xを使ってください。
# Tests/Get-UserInfo.Tests.ps1
BeforeAll {
. $PSScriptRoot/../src/Get-UserInfo.ps1
}
Describe "Get-UserInfo" {
Context "有効なユーザー" {
It "名前を返す" {
$result = Get-UserInfo -UserId 1
$result.Name | Should -Be "Alice"
}
It "モックAPIを呼ぶ" {
Mock Invoke-RestMethod { @{ name = "Test" } }
Get-UserInfo -UserId 1
Should -Invoke Invoke-RestMethod -Times 1
}
}
Context "エラー処理" {
It "存在しないIDでthrowする" {
{ Get-UserInfo -UserId -1 } | Should -Throw
}
}
}
# 実行
Invoke-Pester -Path ./Tests -Output Detailed
Pester 5の核心はdiscovery/runの分離です。BeforeAllはdiscoveryの後に実行され、Itの中だけで使えるcmdlet(Should、Mockなど)があります。4.xのつもりで書くとデバッグが非常に困難になります。
6. PSReadLine と Predictive IntelliSense
Windows TerminalでPowerShellが本当に強力になったのはPSReadLineのおかげです。
# 予測ソース: History + プラグイン
Set-PSReadLineOption -PredictionSource HistoryAndPlugin
Set-PSReadLineOption -PredictionViewStyle ListView
# キーバインド(bashスタイル)
Set-PSReadLineOption -EditMode Emacs
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
# Az Predictorをインストール
Install-PSResource Az.Tools.Predictor
Enable-AzPredictor
# GitHub Copilot for CLIは別途インストール
# gh extension install github/gh-copilot
$PROFILE(通常は~/Documents/PowerShell/Microsoft.PowerShell_profile.ps1)に上記設定を入れれば全セッションに反映されます。Az PredictorはAzure cmdletの次のパラメータをMLで提案し、Copilot for CLIは自然言語からコマンドを生成します。
7. WinGet — Windows公式パッケージマネージャ
WinGetはMicrosoftが2021年にリリースした公式パッケージマネージャで、2026年現在の安定版は1.10です。Windows 11とWindows 10 21H2以降に既定で搭載されています。
# 検索
winget search "vs code"
# インストール(silent、ユーザーレベル)
winget install Microsoft.VisualStudioCode --scope user --silent
# 全パッケージのアップグレード
winget upgrade --all
# エクスポート/インポート — 新規マシンセットアップの要
winget export -o C:\my-apps.json
winget import -i C:\my-apps.json
# 設定ファイル(DSCと統合)
winget configure --file workstation-setup.winget
WinGetの真の強みはMicrosoft Storeとコミュニティリポジトリの統合です。ChocolateyとScoopの弱点(ストアアプリ非対応、ライセンス検証の欠如)を解消し、企業ではプライベートソースを社内登録できます。
8. ChocolateyとScoopの立ち位置
WinGetが標準になりましたが、ChocolateyとScoopも依然として有効な選択肢です。
- Chocolatey — 2011年リリース、エンタープライズ機能(Chocolatey for Business)が強力。Windows専用としては最大のコミュニティパッケージプール(10,000+)。
- Scoop — 開発者フレンドリー、非管理者権限でインストール可、PATH/環境変数の自動管理、「1ツール=1フォルダ」の哲学。
# Chocolatey
choco install -y git nodejs python3
choco upgrade all -y
# Scoop
scoop install git nodejs python
scoop update *
# 比較基準
# - 管理者権限: choco (必要) vs scoop (不要)
# - パッケージ分離: choco (グローバル) vs scoop (~/scoop/apps)
# - エンタープライズ機能: chocoが優勢
実務での推奨: 開発者ワークステーションはScoop、サーバーはWinGetまたはChocolateyが良い出発点です。
9. Sysinternals 2024.x — Mark Russinovich の道具箱
Sysinternalsは1996年にMark RussinovichとBryce Cogswellが作ったツール群で、2006年にMicrosoftが買収しました。MarkはAzureの現CTOです。2024.xが2026年5月時点での最新ラインです。
主要ツール:
- Process Explorer (procexp) — タスクマネージャの上位互換。親子ツリー、ハンドル/DLL検索、デジタル署名検証。
- Process Monitor (procmon) — ファイル/レジストリ/ネットワーク/プロセスのリアルタイムトレース。デバッグの最終兵器。
- Autoruns — スタートアップ、サービス、ドライバ、スケジューラを1画面で表示。マルウェアハンティングに必須。
- TCPView — netstatのGUI、リアルタイム更新。
- RAMMap — メモリ使用分析、キャッシュ/ページプールの可視化。
- Strings — バイナリからASCII/Unicode文字列を抽出。
- SDelete — DoD 5220.22-M準拠のセキュア削除。
- BgInfo — デスクトップ壁紙にホスト情報を表示(サーバー識別用)。
- ZoomIt — 画面ズーム + 注釈。Mark本人が登壇で使うことで有名になったツール。
# Sysinternals Live — インストール不要で直接実行
# ネットワーク位置を割り当てるか \\live.sysinternals.com\tools を直接指定
Start-Process "\\live.sysinternals.com\tools\procexp64.exe"
# またはWinGetでスイートを一括インストール
winget install 9P7KNL5RWT25 # Sysinternals Suite
live.sysinternals.com\toolsは常に最新ビルドをホストしています。USBなしでもインシデント対応中に即座に起動できるため、セキュリティチームの標準装備です。
10. Windows Terminal 1.21 — モダンなターミナル体験
cmd.exeとPowerShell.exeの古いコンソールホストを離れるときです。Windows Terminalは2019年にオープンソースで始まり、2026年には1.21まで進化しました。
主要機能:
- タブと分割ペイン — Alt+Shift+Dで分割、Alt+Shift+- / + で横/縦分割
- プロファイル — pwsh、cmd、WSL2 Ubuntu、Azure Cloud Shell、SSHセッションを1か所に
- GPUレンダリング — DirectWriteで数万行の出力もスムーズ
- Quakeモード — Win+` で画面上からスライドダウン
- 設定UI — JSON直接編集とGUIの両方をサポート
- カラースキーム — Campbell、One Half Dark、Solarized などを内蔵
settings.json の例:
{
"defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"profiles": {
"list": [
{
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"name": "PowerShell 7.5",
"commandline": "pwsh.exe -NoLogo",
"colorScheme": "One Half Dark",
"font": { "face": "CaskaydiaCove Nerd Font", "size": 11 }
}
]
},
"keybindings": [
{ "command": { "action": "splitPane", "split": "auto" }, "keys": "alt+shift+d" }
]
}
Nerd Font(例: CaskaydiaCove)を使えば、oh-my-poshやstarshipなどプロンプトフレームワークのアイコンが正しく表示されます。
11. WSL2 — Windowsの中の本物のLinuxカーネル
WSL2はMicrosoftがHyper-V上で動かす軽量Linuxカーネルです。WSL1のsyscall変換方式とは異なり、WSL2は実際のLinuxカーネルをそのまま実行します。
# インストール
wsl --install
wsl --install -d Ubuntu-24.04
# ディストリビューション管理
wsl --list --verbose
wsl --set-default Ubuntu-24.04
wsl --shutdown # 全インスタンス停止
wsl --export Ubuntu-24.04 C:\backup.tar
wsl --import Ubuntu-prod C:\WSL\prod C:\backup.tar
WSL2の主要な使い道:
- Docker Desktop / Podman Desktop / Rancher Desktop — すべてWSL2バックエンドを既定で使用。
- 開発環境 — LinuxツールチェーンをWindows上でそのまま。
- systemdサポート(2022年から) —
/etc/wsl.confにsystemd=trueを追加。 - GUIアプリ(WSLg) — Waylandベース、X11/Wayland両対応。
.wslconfig(ユーザーホームディレクトリ)でリソース制限:
[wsl2]
memory=8GB
processors=4
swap=2GB
networkingMode=mirrored
firewall=true
mirroredネットワークモード(Windows 11 22H2+)はWSL2のIPをWindowsと共有するため、localhostが双方向にアクセス可能になります。
12. Windows コンテナ — Dockerではない別の道
WSL2上のLinuxコンテナとは別に、Windowsコンテナそのものが存在します。Windows Server 2016からサポートされ、IIS/MSSQL/レガシー.NET Frameworkワークロードをコンテナ化するときに使われます。
2つの分離モード:
- プロセス分離 — ホストとカーネル共有、高速、同じWindowsビルドが必要
- Hyper-V分離 — 各コンテナが軽量VM、より安全、異なるWindowsバージョン可
# Windows機能を有効化
Enable-WindowsOptionalFeature -Online -FeatureName containers -All
# Docker Engine for Windows containers
# 1) Docker Desktopで「Switch to Windows containers」(開発用)
# 2) もしくはMirantis Container Runtime(本番用)
docker run -it --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2025 powershell
NHN CloudではASP.NETレガシーをコンテナ化IISへ移行し、ホストマシン数を60%削減した事例があります。
13. DSC v3 — Desired State Configurationの復活
DSCはPowerShellベースの宣言型構成管理ツールで、2014年リリース後しばらく停滞していましたが、DSC v3(2024年GA、クロスプラットフォーム)で復活しました。v3はRustで書き直されたエンジンを使い、JSON/YAML入力を受け付けます。
# example.dsc.config.yaml
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
resources:
- name: Web server packages
type: Microsoft.WinGet/Package
properties:
id: Microsoft.IIS.Express
source: winget
- name: Service state
type: Microsoft.Windows/Service
properties:
name: W3SVC
startupType: Automatic
state: Running
# 適用
dsc config set --file example.dsc.config.yaml
# 現在の状態を取得
dsc config get --file example.dsc.config.yaml
# ドリフト検出
dsc config test --file example.dsc.config.yaml
DSC v3の強みはPowerShell、WinGet、レジストリ、サービス、ファイルをすべて統一インターフェースで管理できる点、そしてLinuxのリソース(systemd、aptなど)も同じ構文で扱える点です。Ansibleの冪等性にPowerShellの表現力を組み合わせた形と理解すれば良いでしょう。
14. Windowsに対するAnsible
AnsibleはSSHではなくWinRMまたはSSH(Windows Server 2019+で既定)経由でWindowsを管理します。
# playbooks/iis.yml
- hosts: windows
tasks:
- name: Install IIS
ansible.windows.win_feature:
name: Web-Server
state: present
include_management_tools: yes
- name: Deploy site files
ansible.windows.win_copy:
src: ./dist/
dest: C:\inetpub\wwwroot\
inventory.ini:
[windows]
win-01 ansible_host=10.0.0.5
[windows:vars]
ansible_user=Administrator
ansible_password={{ vault_admin_pw }}
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_port=5985
Ansibleの利点はプッシュ方式、エージェントレス、YAMLフレンドリーであること。欠点はWinRM設定のセキュリティ複雑度(Kerberos vs NTLM vs CredSSP)と、一部cmdletのラッピングが欠けていることです。
15. SCCM / Intune / Microsoft Endpoint Manager
エンタープライズデスクトップ/サーバー管理の二大柱:
- SCCM (System Center Configuration Manager) — オンプレベース。Windowsパッチ、ソフトウェア配信、OSイメージ配信。韓国大手SI環境のデファクトスタンダード。
- Intune (Microsoft Endpoint Manager) — クラウドベース。BYODやモバイルデバイスまでカバー。
2026年のトレンドはコマネージメント(SCCM + Intune併用)またはクラウドアタッチ(SCCMインフラを徐々にIntuneへ移行)です。Samsung SDSやLG CNSの多くのプロジェクトがこの段階にあります。
PowerShell連携:
# ConfigMgr cmdlet(5.1専用)
Import-Module ConfigurationManager
Set-Location "PRI:" # site code
Get-CMDevice -Name "PC-001"
# Microsoft Graph経由でIntune管理(7.x可)
Connect-MgGraph -Scopes "DeviceManagementConfiguration.ReadWrite.All"
Get-MgDeviceManagementManagedDevice -Top 10
ConfigMgrモジュールはまだPowerShell 5.1を要求するため、Intune側はMicrosoft Graph経由で7.xから統合管理するハイブリッドパターンが一般的です。
16. Azure CLI 2 vs Az PowerShell
Azureを自動化する2つの方法:
- Azure CLI 2 (az) — Pythonベース、bash/zsh/pwshで同一動作、JSON出力が既定。
- Az PowerShell — PowerShellネイティブ、オブジェクトパイプライン、splatting、PSCustomObject。
# Az PowerShell
Install-PSResource Az
Connect-AzAccount
Get-AzVM -ResourceGroupName "prod-rg" |
Where-Object { $_.PowerState -eq "VM running" } |
Select-Object Name, Location, HardwareProfile
# Azure CLI(pwshから呼び出し)
az vm list --resource-group prod-rg --query "[?powerState=='VM running'].{name:name,location:location}" -o table
選択基準:
- CI/CDパイプライン: Azure CLI(クロスプラットフォーム、JSON解析が単純)
- 運用自動化 / PowerShellフレンドリーなチーム: Az PowerShell(オブジェクトパイプラインの強み)
- Bicep/ARMデプロイ: どちらも同等に可能
17. AWS Tools for PowerShell、GCP PowerShell、GitHub CLI
# AWS
Install-PSResource AWS.Tools.Common
Install-PSResource AWS.Tools.EC2
Set-AWSCredential -AccessKey AKIA... -SecretKey ... -StoreAs prod
Get-EC2Instance -ProfileName prod
# GCP
Install-PSResource GoogleCloud
Get-GceInstance -Project my-project
# GitHub CLI (gh)
winget install GitHub.cli
gh auth login
gh pr list --json number,title,author | ConvertFrom-Json | Format-Table
とくにghは出力がクリーンなJSONなので、PowerShellのConvertFrom-Jsonと相性抜群です。PR/Issue自動化で広く使われています。
18. Try/Catch、共通パラメータ、Splatting
本番品質PowerShellの3要素:
function Invoke-SafeRestApi {
[CmdletBinding()]
param(
[Parameter(Mandatory)][string]$Uri,
[int]$Retries = 3,
[int]$DelaySeconds = 2
)
for ($i = 1; $i -le $Retries; $i++) {
try {
$params = @{
Uri = $Uri
Method = 'Get'
TimeoutSec = 30
MaximumRetryCount = 0
ErrorAction = 'Stop'
}
return Invoke-RestMethod @params
}
catch [System.Net.Http.HttpRequestException] {
Write-Warning "Attempt $i failed: $($_.Exception.Message)"
if ($i -eq $Retries) { throw }
Start-Sleep -Seconds $DelaySeconds
}
finally {
Write-Verbose "Attempt $i complete"
}
}
}
# 共通パラメータが自動有効化: -Verbose, -ErrorAction, -ErrorVariable
Invoke-SafeRestApi -Uri "https://api.example.com/health" -Verbose -ErrorAction Continue
[CmdletBinding()]の一行でVerbose、Debug、ErrorAction、WarningActionなどの共通パラメータが自動有効化されます。@paramsによるsplattingは可読性と再利用性の両方を向上させます。
19. パイプラインオブジェクトとPSCustomObject
PowerShellの真の力はオブジェクトパイプラインです。bashがテキストを流す一方で、PowerShellは.NETオブジェクトを流します。
# パイプラインの例
Get-Process |
Where-Object { $_.WorkingSet64 -gt 500MB } |
Sort-Object -Property WorkingSet64 -Descending |
Select-Object -First 10 Name, Id, @{N='RAM(MB)';E={[int]($_.WorkingSet64/1MB)}} |
Format-Table
# PSCustomObject = PowerShellのDTO
$report = Get-Service | ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
Status = $_.Status
StartType = $_.StartType
CheckedAt = Get-Date
}
}
$report | Export-Csv services.csv -NoTypeInformation
$report | ConvertTo-Json -Depth 3 | Set-Content services.json
ForEach-Object -Parallelを加えると、IOバウンドのタスクが劇的に高速化します。
$servers = Get-Content servers.txt
$servers | ForEach-Object -Parallel {
Test-NetConnection $_ -Port 443 -InformationLevel Quiet
} -ThrottleLimit 32
20. GUI自動化 — Out-GridView、ImportExcel、PSWriteHTML
PowerShellでも軽量GUIを作れます。
# Out-GridViewで対話的選択
$selected = Get-Process | Out-GridView -PassThru -Title "プロセス選択"
$selected | Stop-Process -WhatIf
# ImportExcel — Excelなしで.xlsxを読み書き
Install-PSResource ImportExcel
Get-Service | Export-Excel -Path C:\services.xlsx -AutoSize -TableStyle Medium2
# PSWriteHTML — インタラクティブHTMLレポート
Install-PSResource PSWriteHTML
New-HTML -FilePath C:\report.html -ShowHTML {
New-HTMLTab -Name "Services" {
New-HTMLTable -DataTable (Get-Service) -ScrollX
}
}
PSWriteHTMLで作るレポートはDataTablesとCharts.jsベースなので、検索・ソート・フィルタが全部できます。毎朝自動配信される運用レポートで頻繁に使われます。
21. Active Directory と Group Policy のcmdlet
Import-Module ActiveDirectory # RSAT必須、依然5.1フレンドリー
# ユーザー検索
Get-ADUser -Filter "Department -eq 'Engineering'" -Properties EmailAddress |
Select-Object SamAccountName, EmailAddress
# グループメンバ
Get-ADGroupMember -Identity "Domain Admins" -Recursive |
Get-ADUser -Properties LastLogonDate |
Select-Object Name, LastLogonDate
# ローカルユーザー
New-LocalUser -Name "deployer" -Password (Read-Host -AsSecureString) -Description "CI Deployer"
Add-LocalGroupMember -Group "Administrators" -Member "deployer"
# Group Policy
Get-GPO -All | Select-Object DisplayName, CreationTime, ModificationTime
Backup-GPO -Name "Default Domain Policy" -Path C:\GPOBackups
Active Directory cmdletは7.xでもWindowsCompatibility経由で使えますが、シナリオによっては5.1の方が安定です。
22. Microsoft Graph PowerShell SDK
既存のAzureADおよびMSOnlineモジュールは2024年に廃止され、Microsoft Graph PowerShell SDKが後継となりました。
Install-PSResource Microsoft.Graph -Scope CurrentUser
# 適切なスコープで接続
Connect-MgGraph -Scopes "User.Read.All","Group.Read.All"
# Azure ADユーザー検索
Get-MgUser -Filter "department eq 'IT'" -Top 100 |
Select-Object DisplayName, UserPrincipalName, Mail
# Conditional Accessポリシー
Get-MgIdentityConditionalAccessPolicy |
Select-Object DisplayName, State
# Intuneデバイス
Get-MgDeviceManagementManagedDevice -Top 50 |
Where-Object { $_.OperatingSystem -eq "Windows" }
Disconnect-MgGraph
Microsoft GraphはREST API全体をPowerShellでラップした結果として60+のサブモジュールを持ちます。Microsoft.Graph.Authenticationだけ入れて、必要なサブモジュールをその都度取得するのが軽量で良いでしょう。
23. Windows Server 2025 の新機能
2024年11月にGAしたWindows Server 2025のDevOps関連主要変更:
- Windows Server向けホットパッチ — 再起動なしでセキュリティパッチ(Azure Arc登録時は無料)。
- OpenSSHが既定搭載(サーバー側) —
Add-WindowsFeature -Name OpenSSH-Server。 - Sysmonが既定統合 — セキュリティイベントログの強化。
- DTrace — Linuxのstrace / eBPFに相当。
- WSL2 on Server — サーバーSKUでもWSL2が動作。
- SMB over QUIC — VPNなしでインターネット越しのファイル共有。
- Active Directoryの30年ぶりの大規模アップデート — 32kページサイズ、OPTIONAL_FEATURE導入。
# SSHを有効化
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service sshd -StartupType Automatic
# 既定シェルをpwshに
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Program Files\PowerShell\7\pwsh.exe" -PropertyType String -Force
これによりLinuxスタイルのワークフロー(SSH + 標準ツール)がWindowsでも一級市民になりました。
24. ベストプラクティス — 実戦的な推奨事項
長期運用のためのベストプラクティス:
#Requires -Version 7.4— スクリプト先頭に宣言、誤ったインタプリタを遮断。- エイリアス禁止 —
gci、?、%ではなくGet-ChildItem、Where-Object、ForEach-Objectを使用。可読性と静的解析の両方が向上。 - 承認された動詞(Approved Verbs) —
Get-Verbで確認。新規関数名は必ずGet-、Set-、New-、Invoke-などの公式動詞を使用。 - コード署名証明書 — 本番スクリプトは必ず署名:
Set-AuthenticodeSignature -FilePath script.ps1 -Certificate $cert。 - 実行ポリシー — マシンは
RemoteSignedまたはAllSigned、絶対にBypassを恒久適用しないこと。 - Constrained Language Mode — 外部入力を扱う環境では有効化を検討。
- PSScriptAnalyzer + PesterをCIゲートに — マージ前に自動ブロック。
- モジュールマニフェスト(.psd1) — バージョン、依存関係、エクスポート関数を明示。
- ロギング —
Start-Transcriptでセッション全体を記録、またはWrite-Information/Write-Verboseを明確に区別。 - エラー処理 — 既定で
$ErrorActionPreference = 'Stop'、try/catchで明示的に処理。
25. PowerShell Universal と PowerShell Studio
Ironman SoftwareのPowerShell UniversalはPowerShellスクリプトをWeb API/ダッシュボード/スケジューラとして即座に公開できるツールです。社内セルフサービスポータルの構築で最もよく使われます。
# PSUのページ定義(疑似コード)
New-UDPage -Name "VM Restart" -Content {
New-UDTextbox -Id "vmName"
New-UDButton -Text "Restart" -OnClick {
$name = (Get-UDElement -Id "vmName").value
Restart-AzVM -Name $name -ResourceGroupName "prod-rg"
Show-UDToast "Restarted $name"
}
}
**PowerShell Studio (SAPIEN Technologies)**はGUIビルダーを含むフルIDEで、フォームベースの運用ツールを視覚的に作る際に便利です。VS Code + PowerShell拡張が標準ですが、フォーム作業が多いチームには依然として良い選択肢です。
26. 韓国 / 日本 / グローバルのWindows DevOps現場
韓国の事例:
- NHN Cloud — Windows VMとSQL Serverワークロード、独自のPowerShell自動化ライブラリ。
- Samsung SDS — グローバルサイト運用にSCCM + Intune + PowerShell DSC v3を導入中。
- Naver Cloud — Windowsサーバーホスティング、Hyper-Vベースのクラウドコンソール。
- LG CNS — SIプロジェクトのActive Directory + GPO + ConfigMgr標準パターン。
- Kakao Enterprise — Pester + PSScriptAnalyzerをCIゲートとして標準化。
日本の事例:
- NEC — 官公庁・金融システムのWindows運用、JIS認証された自動化ツール。
- IIJ — Windows VPSホスティング、WSUS + PowerShellパッチ自動化。
- Microsoft Japan(東京) — PowerShell 7.5のi18n、PSReadLine日本語入力の安定化に貢献。
- サイバーエージェント — ゲーム運用にWindowsコンテナを活用。
- 富士通 — エンタープライズSCCM/Intune SI事業。
グローバルなトレンド:
- Microsoft自身がBing/Officeインフラの相当部分をPowerShell 7で運用。
- GitHub Actionsの
windows-2022、windows-2025ランナーにPS 7.5が既定で含まれる。 - Azure DevOps Pipelines + Azure PowerShellは依然として強力な組み合わせ。
Windows DevOpsは死んでいません。むしろPowerShell 7、WSL2、OpenSSH、DSC v3、Microsoft Graphが集約することでLinux DevOpsに近いワークフローが可能になり、同時にActive DirectoryやSCCMといったエンタープライズ資産もそのまま活用できます。2026年のWindows DevOpsエンジニアは両世界の最良のツールを手にしています。
References
- PowerShell公式ドキュメント — https://learn.microsoft.com/powershell/
- PowerShell GitHub — https://github.com/PowerShell/PowerShell
- PowerShell Gallery — https://www.powershellgallery.com/
- PSScriptAnalyzer — https://github.com/PowerShell/PSScriptAnalyzer
- Pester — https://pester.dev/
- PSReadLine — https://github.com/PowerShell/PSReadLine
- WinGet (Windows Package Manager) — https://learn.microsoft.com/windows/package-manager/
- Chocolatey — https://chocolatey.org/
- Scoop — https://scoop.sh/
- WSL2公式 — https://learn.microsoft.com/windows/wsl/
- Windows Terminal — https://github.com/microsoft/terminal
- Sysinternals — https://learn.microsoft.com/sysinternals/
- Sysinternals Live — https://live.sysinternals.com/
- DSC v3 — https://learn.microsoft.com/powershell/dsc/overview
- Ansible Windows — https://docs.ansible.com/ansible/latest/os_guide/windows.html
- Az PowerShell — https://learn.microsoft.com/powershell/azure/
- AWS Tools for PowerShell — https://aws.amazon.com/powershell/
- Microsoft Graph PowerShell SDK — https://learn.microsoft.com/powershell/microsoftgraph/
- Windows Server 2025 — https://learn.microsoft.com/windows-server/get-started/whats-new-in-windows-server-2025
- Mark Russinovich — https://learn.microsoft.com/sysinternals/community/mark-russinovich
- Ironman Software PowerShell Universal — https://ironmansoftware.com/powershell-universal
- SAPIEN PowerShell Studio — https://www.sapien.com/software/powershell_studio
- GitHub CLI — https://cli.github.com/
- NHN Cloud — https://www.nhncloud.com/
- Samsung SDS — https://www.samsungsds.com/