Windows PowerShell 기본
소개
https://learn.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.4
PowerShell은 명령줄 쉘, 스크립팅 언어 및 구성 관리 프레임워크로 구성된 크로스 플랫폼 자동화 솔루션이다.
PowerShell은 command line 인터페이스와 .NET 프레임워크에 기반한 스크립팅 언어를 결합하였다. 텍스트 기반 Command Line 도구와 달리 객체지향적이므로 복잡한 데이터 유형을 처리하고 시스템 구성 요소와 보다 효과적으로 상호작용 할 수 있다.
역사
2000년대 초, cmd.exe 배치 파일과 같은 기존 도구는 복잡한 엔터프라이즈 환경 시스템을 자동화하고 관리하는데에 한계가 있었다. MS에서는 Windows 최신 API와 상호작용 할 수 있는 도구가 필요했다.
MS 엔지니어인 Jeffry Snover는 Windows가 Unix와 달리, 구조화된 데이터와 API를 사용한다는 것을 깨달았다. Unix는 모든 것을 텍스트파일로 처리했다.
이러한 차이로, Unix 도구를 Windows로 이식하는 것이 비실용적이었다. Snover는 이에 스크립팅의 단순성과 .NET 프레임워크의 힘을 결합한 객체지향 방식을 개발하고자 했다.
2006년데 PowerShell이 출시되며 관리자는 객체를 조작하여 작업을 보다 효과적으로 자동화할 수 있고 Windows 시스템과 더욱 밀접하게 통합되었다.
2016년 MS에서는 Windows, macOS, Linux에서 실행되는 오픈 소스 및 크로스 플랫폼 버전인 PowerShell Core을 출시하기도 하였다.
The Power of PowerShell
객체는 속성과 메서드가 있는 항목을 의미한다. 예를 들어, 객체 car
는 속성 Color
, Model
, FuelLevel
을 가질 수 있고 메서드로는 Drive()
, HonkHorn()
, Refuel()
을 가질 수 있다.
PowerShell에서 객체도 마찬가지로 데이터와 기능을 캡슐화하는 기본 단위로 정보를 관리하고 조작하기 쉽게 해준다. 객체는 파일명, 유저명, 크기 등을 속성을 포함할 수 있고 파일 복사나 프로세스 중지 같은 메서드를 수행할 수 있다.
기존 Command Shell에서 기본 명령은 텍스트 기반으로, 데이터를 일반 텍스트로 처리하고 출력하지만 PowerShell에서 cmdlet
을 실행하면 속성과 메서드를 유지하는 객체를 반환한다.
PowerShell 사용
powershell
해당 명령어를 사용하면 현재 작업디렉토리에 PS 가 표시된다.
cmdlets
cmdlets는 동사-명사 명명 규칙을 따른다. 이 구조는 cmdlet이 무엇을 하는지 이해하기 쉽도록 한다. 동사는 작업을 설명하고 명사는 작업이 수행되는 개체를 지정한다.
예를 들어 Get-Content
는 파일의 내용을 검색하여 콘솔에 표시, Set-Location
은 현재 작업 디렉토리를 변경(설정)한다.
기본 cmdlet
Get-Command
Get-Command
는 현재 PowerShell 세션에서 사용할 수 있는 모든 cmdlet, 함수, alias 및 스크립트를 나열한다.
-CommandType "Function"
이나 -Name "Remove*"
처럼 옵션을 추가할 수 있다.
Get-Help
Get-Help
는 명령어 사용법을 배우는데 필요한 cmdlet이다.
Get-Help <cmdlet>
와 같이 사용한다.
linux의 man과 비슷하다. -examples
옵션은 몇가지 예시를 보여준다.
Get-Alias
Get-Alias
는 별칭을 나열한다.

이래서 리눅스 명령어와 powershell이 유사한 명령어를 가지던 것이었구나 싶다. 주요 리눅스 명령어들이 cmdlet alias로 지정되어있다.
Find-Module
Find-Module
은 온라인 저장소에서 cmdlet을 검색하는데에 사용할 수 있는 명령어이다. Find-Module -Name "PowerShell*”
이렇게 사용할 수 있다.
설치는 Install-Module
명령어를 통해 설치할 수 있다. Install-Module -Name "PowerShellGet"
파일 시스템 탐색 및 파일 작업
Get-ChildItem
Get-Childitem
은 dir, ls와 유사하게 지정된 위치에 있는 파일과 디렉토리를 나열한다.
Set-Location
-Path
옵션을 통해 특정 디렉토리로 이동할 수 있다. cd와 유사함

New-Item
New-Item
은 item을 생성하는데에 사용할 수 있다. 아이템의 경로와 유형(파일 or 디렉토리)를 지정해주어야 한다.
New-Item -Path ".\captain-wardrobe" -ItemType "Directory"

Remove-Item
이는 cmd의 rmdir이나 del과 유사하며, -Path
를 지정해주어야 한다.
Copy-Item
이는 copy와 동일하며 -Path
와 -Destination
을 지정해야 한다.
Get-Content
이는 cmd의 type 또는 리눅스의 cat과 유사하게 동작한다 지정한 -Path
의 내용을 화면에 표시한다.
데이터 파이핑, 필터링 및 정렬
pipe 명령어는 PowerShell에서도 사용 가능하다. PowerShell에서는 텍스트만이 아니라 객체를 전달하기 때문에 더욱 강력한 기능을 가진다.
예를 들어, 디렉토리에 있는 파일 목록을 가져온 다음 크기별로 정렬하려면
Get-ChildItem | Sort-Object Length
을 사용할 수 있다.
Where-Object
Where-Object는 지정된 조건에 따라 객체를 필터링 하기 위해 사용할 수 있다.
Get-ChildItem | Where-Object -Property "Extension" -eq ".txt"

-eq
는 같다는 의미, -ne
는 같지 않음, -gt
는 ~보다 큼 -ge
는 크거나 같음, -lt
는 작음 -le
는 작거나 같음
Get-ChildItem | Where-Object -Property "Name" -like "ship*"
-like
를 이용하여 지정된 패턴과 일치하는 속성으로 객체를 필터링할 수 있다.
Select-Object

Get-ChildItem | Select-Object Name, Length
Name과 Length만 표시하도록 출력을 필터링한다.
그리고
Get-ChildItem | Sort-Object Length -Descending | Select-Object -First 1
현재 폴더에서 가장 크기가 큰 파일을 선택하는 파이프라이닝
Select-String
이는 리눅스의 grep, 윈도우의 findstr과 유사하게 문서 내 특정 콘텐츠를 찾는데 사용된다.
Select-String -Path ".\captain-hat.txt" -Pattern "hat"

이렇게 하면 captain-hat.txt
에서 hat이라는 문자열이 있는 행을 찾을 수 있다. 해당 명령어는 regex를 지원한다.
시스템 및 네트워크 정보
Get-ComputerInfo
Get-ComputerInfo
명령어는systeminfo와 유사하게 운영체제 정보, 하드웨어 사양, BIOS 세부 정보 등을 제공한다. systeminfo 보다 많은 정보를 제공한다고 한다.
Get-LocalUser
이는 사용자 계정을 관리하고 머신의 보안 구성을 이해하는데 필수적이다. Get-LocalUser
는 시스템의 모든 로컬 사용자 계정을 나열한다. 사용자 이름, 계정 상태, 설명을 표시한다.

Get-NetIPConfiguration
IP주소, DNS서버, 게이트웨이 구성을 포함하여 시스템의 네트워크 인터페이스에 대한 자세한 정보를 제공한다.

Get-NetIPAddress
네트워크 인터페이스에 할당된 IP주소의 세부정보가 필요할때는 Get-NetIPAddress
명령어를 사용한다.
이는 현재 활성화되지 않은 IP 주소를 포함하여, 시스템의 모든 IP주소에 대한 세부 정보를 표시한다.
실시간 시스템 분석
Get-Process
Get-Process
는 CPU와 메모리 사용량을 포함하여 현재 실행중은 모든 프로세스에 대한 자세한 정보를 제공한다.

Get-Service
실행중인 서비스, 중지되거나 일시중지된 서비스 정보를 나타낸다.
Get-NetTCPConnection
현재 TCP 연결을 표시한다. 침해대응 및 멀웨어 분석 작업 중에 유용하다. 공격자가 제어하는 서버에 대한 백도어, 연결을 발견할 수 있기 때문임
Get-FileHash
파일 해시를 생성한다. -Path
를 통해 파일을 지정한다.
스크립팅
Invoke-Command
Invoke-Command
는 원격 시스템에서 명령을 실행하는데 필수적이다. Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01
와 같이 스크립트와 결합하여 원격 컴퓨터의 작업을 자동화 할 수 있고,
Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture }
처럼 원격 컴퓨터로 -ScriptBlock
을 이용하여 명령어를 입력할 수 있다.
Ref.
- [1] TryHackMe, "Windows PowerShell," [Online]. Available: https://tryhackme.com/r/room/windowspowershell. [Accessed: Jan. 23, 2025].