PowerShellでスタートアッププログラムを一覧表示する方法

PowerShellでスタートアッププログラムを一覧表示する代表的な方法は、Get-CimInstance Win32_StartupCommandです。現在のユーザーや全ユーザー向けのRunキー、スタートアップフォルダーなどから、名前、実行コマンド、場所、対象ユーザーをまとめて確認できます。ただし、Windowsで自動的に起動する仕組みは、設定アプリの「スタートアップ」、レジストリ、フォルダー、タスクスケジューラ、サービス、ドライバーなど複数あります。一つの一覧を完全な自動起動監査と考えず、目的に応じて範囲を補うことが重要です。本記事では何も無効化せず、安全に列挙して判断する方法を解説します。

目次

最初にログオン時とOS起動時を区別する

一般に「スタートアップアプリ」は、ユーザーがサインインしたときに起動するアプリを指すことが多く、設定アプリやタスクマネージャーで管理できます。一方、Windowsサービスやドライバーはユーザーのサインイン前から開始する場合があり、タスクスケジューラには起動時、ログオン時、時刻、イベントなど多様なトリガーがあります。調査対象がログオンの遅さ、OS起動、常駐プロセス、セキュリティ監査のどれかを決めます。

現在実行中のプロセス一覧は、自動起動設定の一覧とは一致しません。自動起動したアプリがすでに終了している、設定はあるが無効、手動起動したプロセスが動作中、別ユーザーのセッションで起動、という場合があります。設定場所、構成上の有効状態、実行時刻、現在プロセスを別々に確認し、「一覧にある=今動作中」「プロセスにある=自動起動」と判断しません。

Win32_StartupCommandで主要なログオン項目を一覧にする

Get-CimInstance -ClassName Win32_StartupCommandを実行し、Name、Command、Location、User、UserSIDを表示します。Win32_StartupCommandは、レジストリのRun系やスタートアップフォルダーなど、ユーザーのログオン時に実行される代表的なコマンドをまとめて確認する入口です。Locationを見ると、どの保存場所から検出されたかを区別できます。

Get-CimInstance -ClassName Win32_StartupCommand |
    Select-Object Name, Command, Location, User, UserSID |
    Sort-Object Location, Name

Commandには実行ファイルだけでなく引数、引用符、環境変数、ランチャーが含まれる場合があります。表示された文字列をそのままコピーして実行しません。不明な項目はLocation、署名、ファイルの所有者、インストール済み製品、更新履歴を照合します。CommandやUserSIDは内部パス、ユーザー名、サーバー名、トークンに相当する文字列を含む可能性があるため、公開フォーラムへ全出力を貼らず必要部分を伏せます。

ユーザー別と全ユーザー向けの項目を区別する

Win32_StartupCommandのUser、UserSID、Locationを確認すると、現在ユーザー、特定ユーザー、全ユーザー向けの候補を区別できます。ただし、実行したアカウントの権限や読み込まれているユーザープロファイルにより、別ユーザーの項目を完全に取得できない場合があります。管理者で実行すればすべて見えると決めつけず、監査対象のユーザーセッションと管理ポリシーを確認します。

共有PCやリモートデスクトップサーバーでは、複数ユーザーのRunキーやスタートアップフォルダーが存在します。ユーザー名を結果へ含める必要がある場合は、個人情報としてアクセス権と保管期限を設定します。削除済みユーザーではUserが解決できずUserSIDだけが残ることもあります。古いSIDを見つけても、プロファイルやレジストリをその場で消さず、端末管理者が所有者と保持要件を確認します。

RunレジストリをGet-ItemPropertyで読み取る

Windowsのスタートアップアプリは、現在ユーザーのHKCU\Software\Microsoft\Windows\CurrentVersion\Run、全ユーザー向けのHKLM側Runキー、64ビットWindowsのWow6432Node側などに登録される場合があります。PowerShellのRegistryプロバイダーとGet-ItemPropertyを使えば、値を変更せず読み取れます。存在しないキーは正常な構成の場合もあるため、エラーを未検出として記録します。

$paths = @(
    "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run",
    "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run",
    "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"
)
foreach ($path in $paths) {
    if (Test-Path -LiteralPath $path) {
        Get-ItemProperty -LiteralPath $path
    }
}

Get-ItemPropertyの出力にはPSPathなどのPowerShellメタデータも含まれるため、自動化では実際の値名だけを選ぶ処理が必要です。RunOnceなど別の場所もありますが、目的なしにレジストリ全体を走査しません。レジストリ値を直接消す、名前を変える、バックアップなしで編集する操作は、更新機能、セキュリティ製品、同期、デバイス管理を壊す可能性があります。確認段階では読み取りに限定します。

スタートアップフォルダーのショートカットを確認する

現在ユーザーと全ユーザーのスタートアップフォルダーは、[Environment]::GetFolderPathで実環境のパスを取得できます。固定した日本語フォルダー名やユーザープロファイルパスを組み立てず、SpecialFolderのStartupとCommonStartupを使います。Get-ChildItemでショートカットやファイルを列挙し、Name、FullName、LastWriteTimeを確認します。

$folders = @(
    [Environment]::GetFolderPath("Startup"),
    [Environment]::GetFolderPath("CommonStartup")
) | Where-Object { $_ } | Select-Object -Unique
$folders | ForEach-Object {
    Get-ChildItem -LiteralPath $_ -Force -ErrorAction SilentlyContinue |
        Select-Object Name, FullName, LastWriteTime
}

ショートカットの存在は、リンク先が有効、署名済み、現在起動中という保証ではありません。リンク切れ、ネットワーク先、アンインストール済みアプリの残骸もあり得ます。ファイル名だけで不要と判断せず、ショートカットのTargetPath、Arguments、発行元、製品の設定画面を確認します。フォルダーからファイルを移動・削除する前に、ユーザー範囲、業務用途、復元方法を決めます。

タスクスケジューラのログオントリガーを別に調べる

Get-ScheduledTaskは登録済みタスクを取得し、TaskPath、TaskName、State、Triggers、Actions、Principal、Settingsなどを確認できます。ログオン時や起動時にアプリを開始するタスクは、Win32_StartupCommandや設定アプリの一覧へ出ない場合があります。すべてのタスクがスタートアップではないため、Triggersの種類と対象ユーザー、Actionsを確認して候補を絞ります。

Get-ScheduledTask |
    Select-Object TaskPath, TaskName, State, Triggers, Actions |
    Sort-Object TaskPath, TaskName

TriggersとActionsは入れ子オブジェクトで、表表示やCSVへそのまま渡すと内容が省略されることがあります。対象タスクを一件ずつFormat-Listで確認し、実行ファイル、引数、開始条件、履歴を照合します。Microsoftや製品が作成した保守タスクを無効化すると、更新、バックアップ、証明書、セキュリティ監視が止まる可能性があります。不明なタスクを見つけても、削除や無効化を急ぎません。

サービスとドライバーは別の自動起動カテゴリとして扱う

WindowsサービスはGet-ServiceやWin32_Service、システムドライバーはWin32_SystemDriverで確認します。AutomaticやBoot、Systemなどの開始方式を持ちますが、設定アプリのスタートアップアプリとは対象が異なります。ログオンが遅い調査でサービスが関係する場合もありますが、ユーザー向けアプリ一覧と一つに混ぜると、名前、状態、開始契機の意味が曖昧になります。

現在Runningのサービスが自動開始とは限らず、Automaticでもトリガーや遅延、障害でStoppedの場合があります。ドライバーやセキュリティサービスを「不要なスタートアップ」として停止すると、起動不能、ネットワーク断、暗号化、監視停止を招く可能性があります。自動起動監査ではカテゴリ、所有製品、署名、開始方式、現在状態、業務依存を別列にし、変更は製品の公式手順へ従います。

設定アプリとタスクマネージャーの表示を照合する

Windows 11とWindows 10では、設定の「アプリ」「スタートアップ」やタスクマネージャーの「スタートアップ アプリ」で、対応するログオンアプリの有効・無効や影響を確認できます。Microsoftのサポート資料では、設定とタスクマネージャーが同じスタートアップアプリ一覧を示し、タスクマネージャーは起動への影響も表示すると説明されています。

PowerShellでRunキーやWin32_StartupCommandに項目が見えても、WindowsのStartupApproved状態などによりUIでは無効として扱われる場合があります。単に登録があることと実際に有効であることを分け、UI、次回サインイン後のプロセス、イベントを確認します。影響がHighでも不要とは限らず、セキュリティ、同期、入力、通信など業務上必要なアプリを利用者判断だけで無効にしません。

Autorunsは広範な自動起動監査の補助に使う

Microsoft SysinternalsのAutorunsは、Run、RunOnce、スタートアップフォルダーだけでなく、Explorer拡張、Winlogon、サービス、ドライバー、スケジュールタスクなど幅広い自動起動場所を表示します。標準コマンドで把握しにくい端末のトラブルシューティングやセキュリティ調査では有用ですが、公式配布元から取得し、組織のツール利用ルールへ従います。

Autorunsにはエントリの無効化や削除、署名検証、VirusTotal連携などの機能があります。本記事では表示と照合だけに使い、チェックを外したり削除したりしません。VirusTotalへ未知ファイルを送信する設定は、社内バイナリや機密情報の外部送信につながる可能性があるため、組織の承認なしに有効化しません。署名済みMicrosoft項目を隠す表示も、監査範囲を理解した上で使います。

不明な項目は実行せず由来を検証する

不明なスタートアップ項目を見つけたら、Nameだけで検索せず、Location、完全な実行ファイルパス、署名者、ファイルハッシュ、インストール日時、親製品、タスクやサービスとの対応を確認します。コマンドラインにURL、スクリプト、環境変数、引用符のないパスが含まれていても、その文字列を手動実行して試しません。隔離された分析やセキュリティ担当の手順を使います。

正規アプリでも更新後に名前やパスが変わり、古いエントリが残ることがあります。反対に見慣れた名前を装う不正項目も考えられます。デジタル署名だけで安全性を断定せず、ファイルの場所、発行元、導入経路、エンドポイント保護の検知、複数端末の共通性を照合します。証拠を失わないよう、削除前に取得時刻と必要なメタデータを安全なチケットへ保存します。

実務での確認チェックリスト

  • ログオンアプリ、OS起動タスク、サービス、ドライバーのどれを調べるか決めたか
  • Win32_StartupCommandのName、Command、Location、Userを確認したか
  • Runキーをユーザー別・全ユーザー別・32/64ビット側で区別したか
  • StartupとCommonStartupを実環境のSpecialFolderから取得したか
  • Get-ScheduledTaskのTriggersとActionsを入れ子のまま見落としていないか
  • 設定アプリやタスクマネージャーの有効状態と登録の存在を分けたか
  • 不明なCommandを実行せず、署名・所有製品・導入経路を確認したか

結果は、取得日時、端末名、Windowsのエディションとビルド、PowerShellの版、実行ユーザー、対象範囲、取得方法とともに保存します。空の結果は「存在しない」と断定せず、権限、OS、実行コンテキスト、管理方式、保持期間、取得失敗を確認します。無効化、削除、アンインストール、再起動、設定変更へ進む場合は読み取り確認と分け、利用者への影響、承認、バックアップ、復旧方法を決めます。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次