Skip to content
Published on

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

Authors

「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を離れるべき理由は明確です。

  1. 速度 — 7.5は多くのワークロードで5.1の3〜5倍高速。ForEach-Object -Parallelは5.1には存在しません。
  2. .NET 9 — System.Text.JsonやHttpClientなどモダンなライブラリが使えます。
  3. ネイティブコマンド統合 — kubectl、terraform、azといったツールの出力解析が圧倒的に自然。
  4. クロスプラットフォーム — 同じスクリプトがLinuxとmacOSでも動きます。
  5. 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クライアントを実質的に置き換えたことです。


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の主要な使い道:

  1. Docker Desktop / Podman Desktop / Rancher Desktop — すべてWSL2バックエンドを既定で使用。
  2. 開発環境 — LinuxツールチェーンをWindows上でそのまま。
  3. systemdサポート(2022年から)/etc/wsl.confsystemd=trueを追加。
  4. 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()]の一行でVerboseDebugErrorActionWarningActionなどの共通パラメータが自動有効化されます。@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. ベストプラクティス — 実戦的な推奨事項

長期運用のためのベストプラクティス:

  1. #Requires -Version 7.4 — スクリプト先頭に宣言、誤ったインタプリタを遮断。
  2. エイリアス禁止gci?%ではなくGet-ChildItemWhere-ObjectForEach-Objectを使用。可読性と静的解析の両方が向上。
  3. 承認された動詞(Approved Verbs)Get-Verbで確認。新規関数名は必ずGet-Set-New-Invoke-などの公式動詞を使用。
  4. コード署名証明書 — 本番スクリプトは必ず署名: Set-AuthenticodeSignature -FilePath script.ps1 -Certificate $cert
  5. 実行ポリシー — マシンはRemoteSignedまたはAllSigned、絶対にBypassを恒久適用しないこと。
  6. Constrained Language Mode — 外部入力を扱う環境では有効化を検討。
  7. PSScriptAnalyzer + PesterをCIゲートに — マージ前に自動ブロック。
  8. モジュールマニフェスト(.psd1) — バージョン、依存関係、エクスポート関数を明示。
  9. ロギングStart-Transcriptでセッション全体を記録、またはWrite-Information/Write-Verboseを明確に区別。
  10. エラー処理 — 既定で$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-2022windows-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

  1. PowerShell公式ドキュメント — https://learn.microsoft.com/powershell/
  2. PowerShell GitHub — https://github.com/PowerShell/PowerShell
  3. PowerShell Gallery — https://www.powershellgallery.com/
  4. PSScriptAnalyzer — https://github.com/PowerShell/PSScriptAnalyzer
  5. Pester — https://pester.dev/
  6. PSReadLine — https://github.com/PowerShell/PSReadLine
  7. WinGet (Windows Package Manager) — https://learn.microsoft.com/windows/package-manager/
  8. Chocolatey — https://chocolatey.org/
  9. Scoop — https://scoop.sh/
  10. WSL2公式 — https://learn.microsoft.com/windows/wsl/
  11. Windows Terminal — https://github.com/microsoft/terminal
  12. Sysinternals — https://learn.microsoft.com/sysinternals/
  13. Sysinternals Live — https://live.sysinternals.com/
  14. DSC v3 — https://learn.microsoft.com/powershell/dsc/overview
  15. Ansible Windows — https://docs.ansible.com/ansible/latest/os_guide/windows.html
  16. Az PowerShell — https://learn.microsoft.com/powershell/azure/
  17. AWS Tools for PowerShell — https://aws.amazon.com/powershell/
  18. Microsoft Graph PowerShell SDK — https://learn.microsoft.com/powershell/microsoftgraph/
  19. Windows Server 2025 — https://learn.microsoft.com/windows-server/get-started/whats-new-in-windows-server-2025
  20. Mark Russinovich — https://learn.microsoft.com/sysinternals/community/mark-russinovich
  21. Ironman Software PowerShell Universal — https://ironmansoftware.com/powershell-universal
  22. SAPIEN PowerShell Studio — https://www.sapien.com/software/powershell_studio
  23. GitHub CLI — https://cli.github.com/
  24. NHN Cloud — https://www.nhncloud.com/
  25. Samsung SDS — https://www.samsungsds.com/