【PowerShell】 サービス一覧を出力するスクリプト【忘備録】

#概要
WindowsのService一覧をCSVに出力するスクリプト。
トリガー開始や遅延開始など詳細を出力することができます。

参考資料を基に組み込んだ。

もっと良い方法があれば教えてください。

#ソースコード
##Ver2.1

構築の都合でログオン名を取得する必要が出たため、
取得できるように追記しました。
大きな変更はしてません。
※ID付きサービスは取れない…

```Powershell:ExportServiceList.PS1
#Script ：Windows Services List Export Scripts
#Creater：海里
#Version：2.1
#Update ：2021.02.04

$triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
    Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
    ForEach-Object { $_.Name.Split("\")[-1] }

$startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
$startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }

$serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
    @{ n = "表示名";               e = { $_.DisplayName } }
    @{ n = "サービス名";           e = { $_.Name } }
    @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
    @{ n = "状態";                 e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
    @{ n = "ログオン";             e = { $_.StartName } }

)

$serviceData."表示名"
$serviceData | Export-Csv Outputlog.csv -NoTypeInformation -Encoding Default

"`nサービス一覧を記録しました。"

```



##Ver2.0

toruntaさんから提案頂いたもの。
Ver1よりも処理速度が速い。

```powershell:ServiceCSVoutput(Ver2).ps1
#Script ：Windows Services List Export Scripts
#Creater：海里
#Version：2.0
#Update ：2019

$triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
    Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
    ForEach-Object { $_.Name.Split("\")[-1] }

$startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
$startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }

$serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
    @{ n = "表示名";              e = { $_.DisplayName } }
    @{ n = "サービス名";          e = { $_.Name } }
    @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
    @{ n = "状態";                e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
)

$serviceData."表示名"
$serviceData | Export-Csv Outputlog.csv -NoTypeInformation -Encoding Default

"`nサービス一覧を記録しました。"

```



##Ver1.0

```powershell:ServiceCSVoutput(Ver1).ps1

#Script ：Windows Services List Export Scripts
#Creater：海里
#Version：1.0
#Update ：2019

$OutputSVS= @()

Get-WmiObject -Class Win32_Service | Foreach{
    $ts = 0
    $ds = 0

    $Properties=@{
        "DisplayName" = $_.DisplayName
        "Name"        = $_.Name
        "StartMode"   = $_.StartMode
        "State"       = $_.State
    }
    switch($Properties.StartMode) {
        "Manual"   { $Properties.StartMode = "手動" }
        "Disabled" { $Properties.StartMode = "無効" }
        "Auto"     { $Properties.StartMode = "自動" }
    }
    switch($Properties.State) {
        "Running" {$Properties.State="実行"}
        "Stopped" {$Properties.State="停止"}
    }

    if (Test-Path -Path "HKLM:\SYSTEM\CurrentControlSet\Services\$($Properties.Name)\TriggerInfo\") {
        $ts = 1
    }
    if ($Properties.StartMode -eq "Auto" -and $Properties.DelayedAutoStart -eq 1){ 
        $ds = 1
    }
    if ($ts -eq 1 -Or $ds -eq 1) {
        if ($ts -eq 1 -and $ds -eq 1) {
            $Properties.StartMode = "$($JS) (遅延開始、トリガー開始)"
        }
        Elseif ($ts -eq 1) {
            $Properties.StartMode = "$($JS) (トリガー開始)"
        }
        Elseif ($ds -eq 1) {
            $Properties.StartMode = "$($JS) (遅延開始)"
        }
    }

   		$OutputSVS += (New-Object -typename PSObject -property $Properties|Select @{name="表示名";Expression={$Properties.DisplayName}},`
		@{name="サービス名";Expression={$Properties.Name}},@{name="スタートアップの状態";Expression={$Properties.StartMode}},`
        @{name="状態";Expression={$Properties.State}})
		Write-Host $Properties.DisplayName 
}
$OutputSVS |Export-CSV Outputlog.csv  -NoTypeInformation -encoding Default
Write-Host "サービス一覧を記録しました。"

```

#参考資料
●[Windowsの謎 ～サービス一覧を出すコマンド～](https://qiita.com/Mr-K/items/0ab787135eb4ec3b3a1c)


●[ファイアーウォールの送受信規則をCSVでエクスポートする方法](http://www.chabnet.jp/oboe/psatnd2015.htm)

●[Powershell:サービスのログオンアカウントを取得、抽出](http://mtgpowershell.blogspot.com/2011/07/blog-post.html)