最近參與的課程講師都習慣除 GUI 操作外補充使用 Powershell 做同樣結果的方法,慢慢的也對 Powershell 有一點 sense,同時 Linkedin Learning 上豐富的入門教學也讓學習 Powershell 更平易近人。身為微軟生態系的開發者,學習 Powershell 讓作業自動化、規模化也是必然的成長路徑。於是從本篇筆記開始展開自己的 Powershell 實務之旅 👨💻
Server Manage
General
基本的控制筆記,部分的 condition / loop / variables 功能可以取代 python scripts ,使用原生的服務解決問題。
Run Scripts Without Execution Policy Limits
powershell.exe -ExecutionPolicy Bypass -File "c:\temp\script.ps1"
將現在的日期時間存入 clipboard
[system.datetime]::now | scb
Where / Where-Object / ?
Get-Service | where-object {$_.status -eq 'running'}
Get-Service | where {$_.status -eq 'running'}
Get-Service | ? {$_.name -like 'xbox*'}
ForEach / If / Range
foreach ( $node in 1..10 )
{
if ($node -gt 5)
{
"$node"
}
}
Import-Csv / Foreach / Foreach-Object
$arr = @()
Import-Csv 1.csv | Foreach-Object {
$arr += $_.name
}
$arr.ForEach({"This is Mr/Ms/Mrs $_."})
產生 Guid
[guid]::newguid()
new-guid
列出資料夾內所有的檔案路徑、大小、最後存取時間 (ls)
Get-ChildItem -Recursve | % {$_.FullName + "," + $_.Length + "," + $_.LastAccessTime}
Network
向 DNS 查詢特定 IP 的主機名稱或者從 FQDN 查詢 IP,相較於 ping -a 只能查詢單筆主機名稱,DNS查詢的資訊更完整。
resolve-dnsname ip
resolve-dnsname FQDN
Request Http Source
Invoket-RestMethod -Uri
irm -uri
使用 Powershell 寄送電子郵件 (send-mailmessage)
send-mailmessage `
-to address@mail.com `
-from address@mail.com `
-subject "Mail Sent From Powershell" `
-smtpserver mail.server `
-bodyashtml "<div style='color:red'>Hello</div><br/>World" `
-encoding utf8
Wmi Series
這個部分是 Powershell 的強項,原生且完美地和作業系統互動,同時易於管理遠端伺服器。
取得伺服器磁碟空間
get-wmiobject win32_logicaldisk -computername . | out-gridview
取得伺服器 login user profile
gwmi win32_networkloginprofile -computername . | ogv
取得伺服器作業系統
gwmi win32_operatingsystem | select-object pscomputername, OSArchitecture, caption
取得伺服器 CPU 核心資訊
gwmi win32_processor -computername . | select-object pscomputername, name, numberof*
取得記憶體資訊
可以使用 win32_computersystem
取得記憶體資訊。
$name = '.'
gwmi win32_physicalmemory -computername $name | measure capacity -sum `
| select @{name="Memory (GB)"; expression={$_.Sum / [Math]::Pow(1024, 3)}}
另也可以用 win32_computersystem
來取得:
gwmi win32_computersystem -computername . `
| select @{name="Memory (GB)"; expression={$_.TotalPhysicalMemory / [Math]::Pow(1024, 3)}}
如果想要知道記憶體的製造商:
gwmi win32_physicalmemory -computername $name `
| select manufacturer, @{name = "Capacity"; expression={$_.Capacity / [Math]::Pow(1024, 3)}}
其中 Microsoft Corporation 為 Hyper-V 虛擬機所顯示的記憶體製造商名稱。
取得伺服器 IP 與網卡資訊
Get-WmiObject win32_networkadapterconfiguration `
-filter "ipenabled = 'True'" `
-ComputerName . | select caption, ipaddress | convertto-json
取得伺服器的 Model 可以分辨伺服器機型與是否為虛擬機器。若是虛擬機器 Model 會顯示 Virtual Machine。
gwmi win32_computersystem -cn $serverGroup
取得伺服器磁碟及使用空間
gwmi win32_logicaldisk -computername $serverGroup `
| select systemname, DeviceId, `
@{n="FreeGB";e={$_.freespace / 1gb}}, `
@{n="MaxGB";e={$_.size / 1gb}}, @{n="%";e={[math]::round($_.freespace/$_.size * 100, 2)}} `
| where {$_.freegb -ne 0} `
| sort-object -property "freegb" -descending `
| ft -auto
如果要取得磁碟的製造商資訊:
gwmi win32_diskdrive `
| select Model, @{name="Size (GB)";expression={$_.size / [Math]::Pow(1000, 3)}}
取得伺服器已經 File Sahres
gwmi win32_share -cn $serverGroup | select pscomputername, name, caption | ft -auto
取得伺服器安裝的應用程式
gwmi win32_product -cn $serverGroup | select pscomputername, name, version, vendor | ft -auto
取得伺服器已經安裝的 KB HotfixId
gwmi Win32_QuickFixEngineering -cn $serverGroup | Sort-Object description
取得伺服器安裝的 .NET Framework Version
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(?!S)\p{L}'} | Select PSChildName, version
查詢 Windows 作業系統 .NET Framework Version
How to quickly check the .NET Framework version on Windows 10
How to: Determine which .NET Framework versions are installed
Automation
Hash Value
取得檔案 Hash Value With SHA-256 (Get-FileHash)
Get-FileHah file.txt
Get File Hash Value 一鍵完成版本 (Get-FileHash)
Get-FileHash filePath | select -exp hash | clip
批次將資料夾內的檔案轉換為 hashed value (batchly Get-FileHash)
Get-FileHash (Get-ChildItem ".\*.*" -Recurse -Force) | export-csv .\hashedFile.csv
好讀格式再升級版本
Get-ChildItem -Recurse | %{$_.FullName.Replace("C:\Users\", ""), (Get-FileHash $_.FullName).Hash} | clip
System Administration
移除本機群組中的使用者 (移除 Administrators 中的成員)
Remove-LocalGroupMember -Group "Administrators" -Member "Domain\AccountName"