Introduction
ようこそ!
このページにたどり着いたということは、PowerShell の魅力を耳にして、もっと深く知りたいと思っているか、あるいは「コマンドラインモジュール」の第一章(Windowsコマンドライン)から航海してきたのかもしれません。
いずれにせよ、これからWindowsシステムの秘密を解き明かす旅が始まります。さあ、出航の時です!
学習目標
このルームは「コマンドラインモジュール」の第2章にあたります。PowerShell についての入門的な内容を扱っており、Windows向けに開発された2番目のコマンドラインツールです。
- PowerShellとは何か、その機能を学ぶ
- PowerShellの基本的な構文や構造を理解する
- 基本的なPowerShellコマンドを実行してみる
- PowerShellがサイバーセキュリティ分野でどのように活用されているかを知る
What Is PowerShell
PowerShellは、Microsoftが提供するタスク自動化と構成管理のためのツールです。コマンドラインシェル、スクリプト言語、構成管理フレームワークの3つの要素で構成されており、.NETフレームワークの上に作られています。
従来のコマンドラインツールとは異なり、PowerShellは「オブジェクト指向」で動作します。これにより、複雑なデータの操作やシステムとの連携がしやすくなっています。もともとはWindows専用でしたが、現在ではmacOSやLinuxにも対応しており、さまざまな環境で利用できます。
PowerShellの歴史
PowerShellは、従来のコマンド(cmd.exeやバッチファイル)では対応しきれなかった複雑な管理作業を効率化するために、2000年代初頭に開発されました。
開発の中心となったのは、MicrosoftのエンジニアであるJeffrey Snoverです。彼は、Windowsでは構造化データとAPIが中心である一方、Unixではテキストが中心であるという違いに注目しました。そして、.NETの機能を活かしつつ、スクリプトでも扱いやすい「オブジェクト指向のシェル」を作るという発想から、PowerShellが生まれました。
2006年に最初のバージョンがリリースされ、その後、IT環境の多様化に対応する形で、2016年にはWindows以外のOSでも動作する「PowerShell Core(オープンソース)」が登場しました。
PowerShellの特徴
PowerShellの特徴のひとつは「オブジェクトを扱えること」です。
たとえば、車を例にすると「色」「モデル」「燃料の量」などの情報がプロパティ(属性)で、「走る」「クラクションを鳴らす」「給油する」といった操作がメソッド(動作)になります。PowerShellでも同様に、ファイル名やサイズ、ユーザー情報などをプロパティとして持ち、コピーや削除といった操作をメソッドとして実行できます。
従来のコマンドラインではすべての出力が文字列(テキスト)でしたが、PowerShellではコマンドを実行するとオブジェクトが返ってきます。そのため、余計な文字列の加工をせずに、効率的に情報を操作できます。
今後のセクションでは、PowerShellで使えるコマンド(cmdlet)について、より詳しく見ていきます。
What do we call the advanced approach used to develop PowerShell?
object-oriented
PowerShell Basics
PowerShellの学習を進める前に、ラボ環境に接続しましょう。
PowerShellの起動方法
PowerShellは、利用する環境や目的に応じて、いくつかの方法で起動できます。Windowsのグラフィカルユーザーインターフェース(GUI)から操作する場合、主な起動方法は以下の通りです。
・スタートメニューから
スタートメニューの検索バーに「powershell」と入力し、表示された「Windows PowerShell」または「PowerShell」をクリックします。
・「ファイル名を指定して実行」から
Windowsキー + R を押して「ファイル名を指定して実行」ダイアログを開き、「powershell」と入力して Enter キーを押します。
・エクスプローラーから
任意のフォルダーを開き、アドレスバーに「powershell」と入力して Enter キーを押すと、そのフォルダーをカレントディレクトリとしてPowerShellが起動します。
・タスクマネージャーから
タスクマネージャーを開き、「ファイル」→「新しいタスクの実行」を選択し、「powershell」と入力して Enter キーを押します。
また、コマンドプロンプト(cmd.exe)を使っている場合は、「powershell」と入力して Enter キーを押すことでPowerShellを起動できます。
Terminal
captain@THEBLACKPEARL C:\Users\captain>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows
PS C:\Users\captain>
PowerShellが起動すると、現在の作業ディレクトリを示す「PS」プロンプトが表示されます(「PS」はPowerShellの略です)。
基本構文:動詞-名詞の形式
先述のとおり、PowerShellのコマンドは「コマンドレット(cmdlet)」と呼ばれます。従来のWindowsコマンドに比べて、cmdletはより強力で、複雑なデータの操作も可能です。
PowerShellのcmdletは、基本的に「動詞-名詞(Verb-Noun)」の形式で命名されています。この命名規則により、それぞれのコマンドが何をするのかが直感的に理解しやすくなっています。
・動詞(Verb):どのような動作を行うか
・名詞(Noun):その動作の対象となるもの
例:
Get-Content
→ ファイルの内容を取得し、コンソールに表示します。
Set-Location
→ 作業ディレクトリ(カレントディレクトリ)を変更します。
このように、PowerShellのコマンドは一貫した構文を持っており、学習しやすくなっています。
基本的なコマンドレット(cmdlet)
現在のPowerShellセッションで使用できるコマンドレット、関数、エイリアス、スクリプトを一覧表示するには、次のコマンドを実行します。
Get-Command
このコマンドは、どのような操作が可能かを確認するための基本的な手段であり、PowerShellを使い始める際に非常に役立ちます。
Terminal
PS C:\Users\captain> Get-Command
CommandType Name Version Source
----------- ---- ------- ------
Alias Add-AppPackage 2.0.1.0 Appx
Alias Add-AppPackageVolume 2.0.1.0 Appx
Alias Add-AppProvisionedPackage 3.0 Dism
[...]
Function A:
Function Add-BCDataCacheExtension 1.0.0.0 BranchCache
Function Add-DnsClientDohServerAddress 1.0.0.0 DnsClient
[...]
Cmdlet Add-AppxPackage 2.0.1.0 Appx
Cmdlet Add-AppxProvisionedPackage 3.0 Dism
Cmdlet Add-AppxVolume 2.0.1.0 Appx
[...]
このコマンドレットによって取得される各コマンド情報(CommandInfoオブジェクト)には、いくつかの基本的な情報(プロパティ)がコンソールに表示されます。
表示されたプロパティの値を使って、コマンドの一覧を絞り込むことも可能です。たとえば、「関数(function)」タイプのコマンドだけを表示したい場合は、以下のように入力します。
Get-Command -CommandType “Function”
このように条件を指定することで、必要なコマンドだけを効率よく確認できます。
Terminal
PS C:\Users\captain> Get-Command -CommandType "Function"
CommandType Name Version Source
----------- ---- ------- ------
Function A:
Function Add-BCDataCacheExtension 1.0.0.0 BranchCache
Function Add-DnsClientDohServerAddress 1.0.0.0 DnsClient
Function Add-DnsClientNrptRule 1.0.0.0 DnsClient
[...]
今後の課題では、cmdletの出力をより効率的にフィルタする方法について学んでいきます。
もう一つ、ぜひ覚えておきたい重要なコマンドレットが「Get-Help」です。
このコマンドは、各cmdletの使い方やパラメータ、実行例などの詳しい情報を表示してくれるもので、PowerShellの使い方を学ぶうえで欠かせない存在です。
PowerShellコマンドの使い方に迷ったときは、まずこのGet-Helpを使うのが基本です。
Terminal
PS C:\Users\captain> Get-Help Get-Date
NAME
Get-Date
SYNOPSIS
Gets the current date and time.
SYNTAX
Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>] [-DisplayHint {Date | Time | DateTime}] [-Format <System.String>] [-Hour <System.Int32>] [-Millisecond <System.Int32>] [-Minute <System.Int32>] [-Month <System.Int32>] [-Second <System.Int32>] [-Year <System.Int32>] [<CommonParameters>]
Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>] [-DisplayHint {Date | Time | DateTime}] [-Hour <System.Int32>] [-Millisecond <System.Int32>] [-Minute <System.Int32>] [-Month <System.Int32>] [-Second <System.Int32>] [-UFormat <System.String>] [-Year <System.Int32>] [<CommonParameters>]
DESCRIPTION
The `Get-Date` cmdlet gets a DateTime object that represents the current date or a date that you specify. `Get-Date` can format the date and time in several .NET and UNIX formats. You can use `Get-Date` to generate a date or time character string, and then send the string to other cmdlets or programs.
`Get-Date` uses the current culture settings of the operating system to determine how the output is formatted. To view your computer's settings, use `(Get-Culture).DateTimeFormat`.
RELATED LINKS
Online Version: https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/get-date?view=powershell-5.1&WT.mc_id=ps-gethelp
ForEach-Object
Get-Culture
Get-Member
New-Item
New-TimeSpan
Set-Date
Set-Culture xref:International.Set-Culture
REMARKS
To see the examples, type: "get-help Get-Date -examples".
For more information, type: "get-help Get-Date -detailed".
For technical information, type: "get-help Get-Date -full".
For online help, type: "get-help Get-Date -online".
前述の結果にあるように、Get-Help コマンドは、基本構文にオプションを追加することで、さらに有用な情報を得られることを教えてくれます。たとえば、「-examples」というオプションを付けることで、そのcmdletがどのように使われるかの具体的な例を確認できます。
PowerShellは、既存のWindowsユーザーやITエンジニアが移行しやすいように、「エイリアス(alias)」と呼ばれる別名(ショートカット)を多数用意しています。これは、従来のコマンドラインに慣れているユーザーにとって非常に便利な機能です。
エイリアスの一覧を確認するには、次のコマンドを使います。
Get-Alias
たとえば、「dir」は「Get-ChildItem」のエイリアスであり、「cd」は「Set-Location」のエイリアスです。つまり、昔ながらのコマンドに近い書き方でもPowerShellを扱えるようになっています。
Terminal
PS C:\Users\captain> Get-Alias
CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
Alias asnp -> Add-PSSnapin
Alias cat -> Get-Content
Alias cd -> Set-Location
Alias CFS -> ConvertFrom-String 3.1.0.0 Microsoft.PowerShell.Utility
Alias chdir -> Set-Location
Alias clc -> Clear-Content
Alias clear -> Clear-Host
[...]
コマンドレットの入手方法とダウンロードについて
PowerShellの特徴のひとつに、オンラインリポジトリから追加のコマンドレットをダウンロードして、機能を拡張できる点があります。
※注意:このセクションで紹介するコマンドレットを使うには、インターネット接続が必要です。
PowerShell Galleryのようなオンラインリポジトリでモジュール(複数のコマンドレットを含むパッケージ)を検索するには、次のコマンドを使います。
Find-Module
モジュール名がはっきり分からない場合は、部分的な名前でも検索できます。「Name」プロパティを指定し、モジュール名の一部のあとにワイルドカード(*)を付けて検索することで、似た名前のモジュールを探せます。
標準的なPowerShellの書き方は次のとおりです。
コマンドレット名 -プロパティ名 "部分名*"
モジュール名をうろ覚えのときなどに便利な方法です。
Terminal
PS C:\Users\captain> Find-Module -Name "PowerShell*"
Version Name Repository Description
------- ---- ---------- -----------
0.4.7 powershell-yaml PSGallery Powershell module for serializing and deserializing YAML
2.2.5 PowerShellGet PSGallery PowerShell module with commands for discovering, installing, updating and publishing the PowerShell artifacts like Modules, DSC Resources, Role Capabilities and Scripts.
1.0.80.0 PowerShell.Module.InvokeWinGet PSGallery Module to Invoke WinGet and parse the output in PSOjects
0.17.0 PowerShellForGitHub PSGallery PowerShell wrapper for GitHub API
目的のモジュールが見つかったら、Install-Module コマンドを使ってリポジトリからダウンロードおよびインストールすることができます。これにより、そのモジュールに含まれる新しいコマンドレットが使用可能になります。
Terminal
PS C:\Users\captain> Install-Module -Name "PowerShellGet"
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"):
これらの基本的なツールを身につけたところで、いよいよPowerShellのさまざまな機能を探っていきましょう。
Answer the questions below
How would you retrieve a list of commands that start with the verb Remove? [for the sake of this question, avoid the use of quotes (" or ') in your answer]
Get-Command -Name Remove*
What cmdlet has its traditional counterpart echo as an alias?
Write-Output
What is the command to retrieve some example usage for the cmdlet New-LocalUser?
Get-Help New-LocalUser -examples
Navigating the File System and Working with Files
PowerShellには、ファイルシステムの移動やファイル操作に使えるコマンドレットが多数用意されています。これらの多くは、従来のWindowsコマンドライン(CLI)にあるコマンドと似た機能を持っています。
たとえば、コマンドプロンプトの「dir」や、Unix系システムの「ls」に相当するのが「Get-ChildItem」です。このコマンドレットは、-Path パラメータで指定した場所のファイルやフォルダーを一覧表示します。
ディレクトリの中身を確認したいときに使える便利なコマンドです。Pathを省略した場合は、現在の作業ディレクトリの内容が表示されます。
Terminal
PS C:\Users\captain> Get-ChildItem
Directory: C:\Users\captain
Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r--- 5/8/2021 9:15 AM Desktop
d-r--- 9/4/2024 10:58 AM Documents
d-r--- 5/8/2021 9:15 AM Downloads
d-r--- 5/8/2021 9:15 AM Favorites
d-r--- 5/8/2021 9:15 AM Links
d-r--- 5/8/2021 9:15 AM Music
d-r--- 5/8/2021 9:15 AM Pictures
d----- 5/8/2021 9:15 AM Saved Games
d-r--- 5/8/2021 9:15 AM Videos
別のディレクトリへ移動したい場合は、「Set-Location」コマンドレットを使用します。これは現在の作業ディレクトリを変更し、指定したパスに移動するためのコマンドです。コマンドプロンプトで使う「cd」と同じような働きをします。
Terminal
PS C:\Users\captain> Set-Location -Path ".\Documents"
PS C:\Users\captain\Documents>
従来のWindowsコマンドラインでは、ディレクトリやファイルなどの項目ごとに別々のコマンドを使って作成・管理していましたが、PowerShellではそれらをひとつのコマンドレットでシンプルに扱えるようになっています。
新しい項目を作成するには、「New-Item」コマンドレットを使用します。作成する項目のパスと、ファイルかディレクトリかといった種類を指定する必要があります。
Terminal
PS C:\Users\captain\Documents> New-Item -Path ".\captain-cabin\captain-wardrobe" -ItemType "Directory"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 9/4/2024 12:20 PM captain-wardrobe
PS C:\Users\captain\Documents> New-Item -Path ".\captain-cabin\captain-wardrobe\captain-boots.txt" -ItemType "File"
Directory: C:\Users\captain\Documents\captain-cabin\captain-wardrobe
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 11:46 AM 0 captain-boots.txt
同様に、「Remove-Item」コマンドレットを使えば、ディレクトリとファイルの両方を削除できます。従来のWindowsコマンドラインでは、「rmdir」と「del」という別々のコマンドを使い分けていましたが、PowerShellではひとつのコマンドで対応できます。
Terminal
PS C:\Users\captain\Documents> Remove-Item -Path ".\captain-cabin\captain-wardrobe\captain-boots.txt"
PS C:\Users\captain\Documents> Remove-Item -Path ".\captain-cabin\captain-wardrobe"
ファイルやディレクトリをコピーしたり移動したりするには、それぞれ「Copy-Item」(copyコマンドに相当)と「Move-Item」(moveコマンドに相当)を使います。どちらもファイルとディレクトリの両方に対応しています。
Terminal
PS C:\Users\captain\Documents> Copy-Item -Path .\captain-cabin\captain-hat.txt -Destination .\captain-cabin\captain-hat2.txt
PS C:\Users\captain\Documents> Get-ChildItem -Path ".\captain-cabin\"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 9/4/2024 12:50 PM captain-wardrobe
-a---- 9/4/2024 12:50 PM 0 captain-boots.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat2.txt
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
最後に、ファイルの内容を読み取って表示するには、「Get-Content」コマンドレットを使います。これは、コマンドプロンプトの「type」コマンドや、Unix系システムの「cat」に相当する動作をします。
Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-Content -Path ".\captain-hat.txt"
_ _
| | | |
| |__ __ _| |_
| '_ \ / _ | __|
| | | | (_| | |_
|_| |_|\__,_|\__|
Don't touch my hat!
Answer the questions below
What cmdlet can you use instead of the traditional Windows command type?
Get-Content
What PowerShell command would you use to display the content of the "C:\Users" directory? [for the sake of this question, avoid the use of quotes (" or ') in your answer]
Get-ChildItem -Path C:\Users
How many items are displayed by the command described in the previous question?
4
Piping, Filtering, and Sorting Data
パイプ(piping)は、コマンドライン環境でよく使われるテクニックのひとつで、あるコマンドの出力結果を、次のコマンドの入力として渡す方法です。これにより、複数の処理を連続して実行することができ、データが一連のコマンドの中を流れていくような仕組みになります。パイプは「|」という記号で表され、WindowsのコマンドラインやUnix系のシェルでも広く使われています。
PowerShellでは、このパイプ処理がさらに強力になっており、単なるテキストではなく「オブジェクト」を渡すことができます。オブジェクトは、データだけでなく、そのデータに関する属性(プロパティ)や操作(メソッド)も含んでいます。
たとえば、あるディレクトリ内のファイル一覧を取得して、それをサイズ順に並べ替えたい場合は、次のようなコマンドをPowerShellで実行します。
Get-ChildItem | Sort-Object Length
このように、パイプを使うことで処理の流れを効率的に構築できます。
Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Sort-Object Length
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:50 PM 0 captain-boots.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat2.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat.txt
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
d----- 9/4/2024 12:50 PM captain-wardrobe
この例では、Get-ChildItem がファイルをオブジェクトとして取得し、パイプ(|)を使ってそれらのオブジェクトを Sort-Object に渡します。Sort-Object は、そのオブジェクトの Length(サイズ)プロパティを基に並べ替えを行います。
このように、PowerShellではオブジェクトを扱うことで、より詳細で柔軟なコマンドの組み合わせが可能になります。
上記の例では、Sort-Object コマンドレットを使って、指定したプロパティを基準にオブジェクトを並べ替えました。PowerShell にはこれ以外にも、パイプと組み合わせて使える便利なコマンドレットが多数用意されており、高度なデータ操作や分析が可能です。
特定の条件に合致するオブジェクトだけを抽出(フィルタ)したい場合は、「Where-Object」コマンドレットを使います。
たとえば、あるディレクトリ内の .txt ファイルだけを一覧表示したい場合は、次のように入力します。
Get-ChildItem | Where-Object {$_.Extension -eq ".txt"}
このように、条件を指定することで、目的のファイルやデータだけを効率よく抽出できます。
Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Where-Object -Property "Extension" -eq ".txt"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:50 PM 0 captain-boots.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat.txt
-a---- 9/4/2024 12:14 PM 264 captain-hat2.txt
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
上記の例では、Where-Object コマンドレットがファイルの Extension プロパティ(拡張子)を基にフィルタを行い、拡張子が ".txt" のファイルだけを表示しています。
ここで使われている「-eq」演算子は、「等しい(equal)」という意味で、Bash や Python など他のスクリプト言語にも共通する比較演算子のひとつです。
PowerShellのフィルタ機能の幅広さを示すために、よく使われる比較演算子をいくつか紹介します。
-ne:等しくない(not equal)
指定した条件に合わないオブジェクトを除外するときに使います。
-gt:より大きい(greater than)
指定された値より大きいオブジェクトだけを抽出します。等しいものは含まれません(厳密な比較)。
-ge:以上(greater than or equal to)
-gt と -eq の組み合わせで、指定値以上のオブジェクトを抽出します(非厳密)。
-lt:より小さい(less than)
指定された値より小さいオブジェクトだけを抽出します。等しいものは含まれません。
-le:以下(less than or equal to)
-lt と -eq の組み合わせで、指定値以下のオブジェクトを抽出します。
さらに、特定のパターンに一致するプロパティを基にフィルタすることもできます。その際は「-like」演算子を使います。以下にその例を示します。
Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Where-Object -Property "Name" -like "ship*"
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
次に紹介するフィルタ用のコマンドレット「Select-Object」は、オブジェクトから特定のプロパティだけを抜き出したり、出力されるオブジェクトの数を制限したりするために使います。
必要な情報だけを表示したいときに、出力内容を絞り込むのに便利なコマンドレットです。
Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-ChildItem | Select-Object Name,Length
Name Length
---- ------
captain-wardrobe
captain-boots.txt 0
captain-hat.txt 264
captain-hat2.txt 264
ship-flag.txt 2116
PowerShellのパイプラインは、2つのコマンドレットだけでなく、さらに多くのコマンドをつなげて拡張することができます。
練習として、次のような課題にチャレンジしてみましょう。
C:\Users\captain\Documents\captain-cabin フォルダー内で、最もサイズの大きいファイルを表示するようなコマンドレットのパイプラインを作ってみてください。
この課題では、並べ替えやフィルタを活用して、出力結果を目的の情報に絞り込む練習になります。
課題の答え
Get-ChildItem | Sort-Object Length -Descending | Select-Object -First 1
Directory: C:\Users\captain\Documents\captain-cabin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/4/2024 12:37 PM 2116 ship-flag.txt
今回紹介するフィルタ系コマンドレットの最後は「Select-String」です。
このコマンドレットは、ファイル内のテキストパターンを検索するために使われます。Unix系システムの「grep」や、Windowsのコマンドプロンプトにある「findstr」と同じような働きをします。
ログファイルやドキュメントの中から特定の内容を探したいときによく使われる便利なコマンドレットです。
Terminal
PS C:\Users\captain\Documents\captain-cabin> Select-String -Path ".\captain-hat.txt" -Pattern "hat"
captain-hat.txt:8:Don't touch my hat!
Select-String コマンドレットは、正規表現(regex)に完全対応しています。
この高度な機能を使うことで、より複雑なパターンでの検索が可能になり、ファイル内のテキストデータを柔軟かつ強力に調査・分析することができます。
Answer the questions below
How would you retrieve the items in the current directory with size greater than 100? [for the sake of this question, avoid the use of quotes (" or ') in your answer]
Get-ChildItem | Where-Object -Property Length -gt 100
System and Network Information
PowerShellは、システム管理者やIT技術者のために、より強力な自動化および管理ツールが必要とされていたことを背景に開発されました。
そのため、システムの構成やネットワーク設定などに関する詳細な情報を取得できるコマンドレットが数多く用意されています。
その中のひとつ「Get-ComputerInfo」は、オペレーティングシステムの情報、ハードウェアの仕様、BIOSの詳細など、システム全体の構成情報を一括で取得できるコマンドレットです。
従来の「systeminfo」コマンドも似た機能を持ちますが、取得できる情報は限定的であり、「Get-ComputerInfo」の方がはるかに多くの詳細を提供します。
Terminal
PS C:\Users\captain> Get-ComputerInfo
WindowsBuildLabEx : 20348.859.amd64fre.fe_release_svc_prod2.220707-1832
WindowsCurrentVersion : 6.3
WindowsEditionId : ServerDatacenter
WindowsInstallationType : Server Core
WindowsInstallDateFromRegistry : 4/23/2024 6:36:29 PM
WindowsProductId : 00454-60000-00001-AA763
WindowsProductName : Windows Server 2022 Datacenter
[...]
ローカルユーザーアカウントの管理や、システムのセキュリティ設定を把握するうえで重要なのが「Get-LocalUser」コマンドレットです。
このコマンドを使うと、システム上に存在するすべてのローカルユーザーアカウントを一覧表示できます。
標準の出力では、各ユーザーについて「ユーザー名」「アカウントの状態」「説明」などの情報が表示されます。
Terminal
PS C:\Users\captain> Get-LocalUser
Name Enabled Description
---- ------- -----------
Administrator True Built-in account for administering the computer/domain
captain True The beloved captain of this pirate ship.
DefaultAccount False A user account managed by the system.
Guest False Built-in account for guest access to the computer/domain
WDAGUtilityAccount False A user account managed and used by the system for Windows Defender Application Guard scenarios.
従来の「ipconfig」コマンドと同様に、システムのネットワーク構成に関する詳細な情報を取得するためのコマンドレットがいくつか用意されています。
そのひとつが「Get-NetIPConfiguration」です。このコマンドレットを使うと、IPアドレス、DNSサーバー、デフォルトゲートウェイなど、ネットワークインターフェースに関する詳細な情報を確認することができます。
Terminal
PS C:\Users\captain> Get-NetIPConfiguration
InterfaceAlias : Ethernet
InterfaceIndex : 5
InterfaceDescription : Amazon Elastic Network Adapter
NetProfile.Name : Network 3
IPv4Address : 10.10.178.209
IPv6DefaultGateway :
IPv4DefaultGateway : 10.10.0.1
DNSServer : 10.0.0.2
ネットワークインターフェースに割り当てられているIPアドレスの詳細を確認したい場合は、「Get-NetIPAddress」コマンドレットを使用します。
このコマンドレットを実行すると、現在アクティブでないものも含めて、システムに設定されているすべてのIPアドレスの情報が表示されます。
Terminal
PS C:\Users\captain> Get-NetIPAddress
IPAddress : fe80::3fef:360c:304:64e%5
InterfaceIndex : 5
InterfaceAlias : Ethernet
AddressFamily : IPv6
Type : Unicast
PrefixLength : 64
PrefixOrigin : WellKnown
SuffixOrigin : Link
AddressState : Preferred
ValidLifetime : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource : False
PolicyStore : ActiveStore
IPAddress : ::1
InterfaceIndex : 1
InterfaceAlias : Loopback Pseudo-Interface 1
AddressFamily : IPv6
[...]
IPAddress : 10.10.178.209
InterfaceIndex : 5
InterfaceAlias : Ethernet
AddressFamily : IPv4
[...]
IPAddress : 127.0.0.1
InterfaceIndex : 1
InterfaceAlias : Loopback Pseudo-Interface 1
AddressFamily : IPv4
[...]
これらのコマンドレットを使うことで、IT担当者は重要なシステム情報やネットワーク情報をコマンドラインから素早く取得できます。
その結果、ローカルマシンだけでなく、リモートマシンの監視や管理もより効率的に行えるようになります。
Answer the questions below
Other than your current user and the default "Administrator" account, what other user is enabled on the target machine?
p1r4t3
This lad has hidden his account among the others with no regard for our beloved captain! What is the motto he has so bluntly put as his account's description?
A merry life and a short one.
Now a small challenge to put it all together. This shady lad that we just found hidden among the local users has his own home folder in the "C:\Users" directory.
Can you navigate the filesystem and find the hidden treasure inside this pirate's home?
THM{p34rlInAsh3ll}
Real-Time System Analysis
より高度なシステム情報、特に実行中のプロセスやサービス、アクティブなネットワーク接続といった動的な情報を取得するには、静的なマシン情報とは異なる一連のコマンドレットを活用することができます。
そのひとつ「Get-Process」は、現在実行中のすべてのプロセスを詳細に表示し、CPU使用率やメモリ使用量なども確認できます。システムの監視やトラブルシューティングに非常に便利なコマンドレットです。
Terminal
PS C:\Users\captain> Get-Process
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
67 5 872 500 0.06 2340 0 AggregatorHost
55 5 712 2672 0.02 3024 0 AM_Delta_Patch_1.417.483.0
309 13 18312 1256 0.52 1524 0 amazon-ssm-agent
78 6 4440 944 0.02 516 0 cmd
94 7 1224 1744 0.31 568 0 conhost
[...]
同様に「Get-Service」コマンドレットを使うと、システム上のサービスの状態に関する情報を取得できます。たとえば、どのサービスが実行中か、停止中か、一時停止中かといった情報が確認できます。
このコマンドは、システム管理者によるトラブルシューティングに広く使われているだけでなく、フォレンジックの現場でも、異常なサービスがインストールされていないかを調べる目的で活用されています。
Terminal
PS C:\Users\captain> Get-Service
Status Name DisplayName
------ ---- -----------
Stopped Amazon EC2Launch Amazon EC2Launch
Running AmazonSSMAgent Amazon SSM Agent
Stopped AppIDSvc Application Identity
Running BFE Base Filtering Engine
Running CertPropSvc Certificate Propagation
Stopped ClipSVC Client License Service (ClipSVC)
[...]
アクティブなネットワーク接続を監視するには、「Get-NetTCPConnection」コマンドレットを使います。
このコマンドレットは、現在のTCP接続を一覧表示し、ローカルおよびリモートの接続先情報を確認することができます。
インシデント対応やマルウェア解析の場面でも非常に役立つコマンドで、外部の攻撃者が管理するサーバーとの隠れた接続やバックドアの存在を発見する手がかりになります。
Terminal
PS C:\Users\captain> Get-NetTCPConnection
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting OwningProcess
------------ --------- ------------- ---------- ----- -------------- -------------
[...]
:: 22 :: 0 Listen 1444
10.10.178.209 49695 199.232.26.172 80 TimeWait 0
0.0.0.0 49668 0.0.0.0 0 Listen 424
0.0.0.0 49667 0.0.0.0 0 Listen 652
0.0.0.0 49666 0.0.0.0 0 Listen 388
0.0.0.0 49665 0.0.0.0 0 Listen 560
0.0.0.0 49664 0.0.0.0 0 Listen 672
0.0.0.0 3389 0.0.0.0 0 Listen 980
10.10.178.209 139 0.0.0.0 0 Listen 4
0.0.0.0 135 0.0.0.0 0 Listen 908
10.10.178.209 22 10.14.87.60 53523 Established Internet 1444
0.0.0.0 22 0.0.0.0 0 Listen 1444
さらに、ファイルのハッシュ値を生成するための便利なコマンドレットとして「Get-FileHash」も紹介しておきます。
このコマンドは、ファイルの整合性を確認したり、改ざんの有無を調べたりするのに役立つため、インシデント対応や脅威ハンティング、マルウェア解析などの場面で特に有用です。
Terminal
PS C:\Users\captain\Documents\captain-cabin> Get-FileHash -Path .\ship-flag.txt
Algorithm Hash Path
--------- ---- ----
SHA256 54D2EC3C12BF3D[...] C:\Users\captain\Documents\captain-cabin\ship-flag.txt
これらのコマンドレットを組み合わせて使うことで、リアルタイムなシステム監視や分析に必要なツール群が揃います。
特に、インシデント対応や脅威ハンティングを行う担当者にとって、非常に有用な手段となります。
Answer the questions below
In the previous task, you found a marvellous treasure carefully hidden in the target machine. What is the hash of the file that contains it?
71FC5EC11C2497A32F8F08E61399687D90ABE6E204D2964DF589543A613F3E08
【補足】
Get-FileHashの出力が途中で省略されてしまう場合、Format-List を使って出力を縦表示にするのが良い。
(例)Get-FileHash -Path .\big-treasure.txt | Format-List
What property retrieved by default by Get-NetTCPConnection contains information about the process that has started the connection?
OwningProcess
It's time for another small challenge. Some vital service has been installed on this pirate ship to guarantee that the captain can always navigate safely. But something isn't working as expected, and the captain wonders why. Investigating, they find out the truth, at last: the service has been tampered with! The shady lad from before has modified the service DisplayName to reflect his very own motto, the same that he put in his user description.
With this information and the PowerShell knowledge you have built so far, can you find the service name?
p1r4t3-s-compass
Scripting
スクリプティングとは、シェル(ここではPowerShell)の中で通常手動で行っていた操作を、自動化するためにテキストファイル(スクリプト)として一連のコマンドを書き、実行することを指します。
簡単に言えば、スクリプトはコンピューターに渡す「やることリスト」のようなもので、スクリプトの各行は実行するタスクを意味します。これにより、作業の手間が省けるだけでなく、ヒューマンエラーのリスクも減り、手作業では難しい処理も自動で実行できるようになります。
スクリプトやシェルの知識を深めるにつれて、スクリプトがシステム管理やデータ処理など、さまざまな場面で非常に強力なツールとなることがわかってきます。
このルームではPowerShellスクリプトの書き方までは扱いませんが、その強力さから、サイバーセキュリティ分野では非常に重要なスキルであることは理解しておくべきです。
【Blue Team(防御側)の活用例】
インシデントレスポンダー、マルウェア解析者、脅威ハンターなどのBlue Team担当者にとって、PowerShellスクリプトは以下のような作業を自動化する手段になります。
- ログの分析
- 異常検出
- 攻撃の痕跡(IOC)の抽出
- マルウェアのリバースエンジニアリング
- システム全体のスキャン処理など
【Red Team(攻撃側)の活用例】
ペネトレーションテスターや倫理的ハッカーなどのRed Teamにとっても、PowerShellは有効です。
- システム情報の列挙(エニュメレーション)
- リモートコマンドの実行
- 防御回避のための難読化スクリプトの作成
- システムの耐性テストや模擬攻撃
【システム管理者の活用例】
システム管理者にとっても、PowerShellスクリプトは以下のような場面で役立ちます。特にリモート環境や大規模ネットワークでその力を発揮します。
- システム整合性のチェック自動化
- 構成管理やネットワークの保護
- セキュリティポリシーの適用
- システムの状態監視やインシデント対応の自動化
このように、防御・攻撃どちらの立場でも、PowerShellスクリプティングはサイバーセキュリティにおける必須スキルの一つです。
【Invoke-Commandの紹介】
スクリプティングの話題を締めくくる前に、もうひとつ重要なコマンドレットを紹介しておきます。それが「Invoke-Command」です。
Invoke-Command は、リモートマシンでコマンドを実行するためのコマンドレットです。
システム管理者、セキュリティエンジニア、ペネトレーションテスターなどにとって不可欠な機能であり、複数のマシンに対して一括で処理を実行したり、スクリプトと組み合わせて自動化したりすることができます。
ペネトレーションテストや攻撃の現場では、ターゲットマシン上でのペイロードやコマンドの実行にも使われます。
それでは、次にこの強力な Invoke-Command の使用例を、Get-Help コマンドの "examples" ページで確認してみましょう。
Terminal
PS C:\Users\captain> Get-Help Invoke-Command -examples
NAME
Invoke-Command
SYNOPSIS
Runs commands on local and remote computers.
------------- Example 1: Run a script on a server -------------
Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01
The FilePath parameter specifies a script that is located on the local computer. The script runs on the remote computer and the results are returned to the local computer.
--------- Example 2: Run a command on a remote server ---------
Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture }
The ComputerName parameter specifies the name of the remote computer. The Credential parameter is used to run the command in the security context of Domain01\User01, a user who has permission to run commands. The ScriptBlock parameter specifies the command to be run on the remote computer.
In response, PowerShell requests the password and an authentication method for the User01 account. It then runs the command on the Server01 computer and returns the result.
[...]
Get-Help コマンドの "examples" ページにある最初の2つの例だけでも、Invoke-Command コマンドレットのシンプルさと強力さを理解するには十分です。
最初の例では、Invoke-Command を任意のスクリプトと組み合わせて使うことで、リモートコンピューター上での処理を簡単に自動化できることが示されています。
2つ目の例では、スクリプトを書く技術がなくても Invoke-Command を使えることが示されています。コマンドに -ScriptBlock { ... } を追加することで、リモートマシン上で任意のコマンドやコマンドの連続実行が可能になります。
その結果は、リモートマシンの PowerShell セッションで直接コマンドを入力した場合と同じように動作します。
Answer the questions below
What is the syntax to execute the command Get-Service on a remote computer named "RoyalFortune"? Assume you don't need to provide credentials to establish the connection. [for the sake of this question, avoid the use of quotes (" or ') in your answer]
Invoke-Command -ComputerName RoyalFortune -ScriptBlock { Get-Service }
Conclusion
お見事です、諸君!
PowerShellという荒波を無事に乗り越え、TheBlackPearl号に隠された財宝や謎のサービスを見つけ出すことに成功しました。
ここまで習得したツールがあれば、どんなWindowsシステムの奥深くも探検する準備は万端です。
覚えておいてください。真の探求者(海賊)は、決して学びを止めません。これからもスキルを磨き続けていけば、きっと次の冒険でも新たな「真珠」が見つかるはずです。
それでは、コマンドレットが鋭く、スクリプトが素早く動作することを祈っています。
よい航海を。そして、さらなる発見を!
このままコマンドラインスキルを高めたい方は、次の学習ステップである「Linuxコマンドライン」ルームへ進んでください。
出典:Windows PowerShell