bb賴賴time (可以忽略這部分,完全是本人自作多情罷了):
好久不見各位安全道友們,消失了半年時間了,這半年裏其實大部分時間都在擺爛
去畢業旅行、躺平、打遊戲等等,彌補一下大學時光沒有好好玩好好對自己
但是在這期間我也沒有懈怠,雖説不如從前勤奮,但是也有在迭代和積累自己的技術
由於本人現在所在的部門工作需要更多技術,這些需求出現的同時也開拓了我的視野,也知道了自己目前的status就是一個井底之蛙,樣樣通樣樣鬆...
所以我打算寫幾個合集:"Windows 洞天藝術","SOC-安全運營中心","酒精靶場" 等等後續可能還會有更多。
當然我之前寫的Golang開發依舊會持續不定期更新,因為這個合集讓很多人認識了我,我想大家應該還是比較喜歡Golang工具開發這個合集的,半年過去了不知大家是否已經進階下一個層次了,不知道下次我出Golang工具開發還入得了各位道友的眼否。
説的太多反而不討喜,那就接下去我的第一個合集"Windows 洞天藝術"的第一篇文章,對Powershell的學習。
- Powershell 入門
- 在 PowerShell 中標識和修改執行策略
- PowerShell cmdlet 的結構
- Cmdlet verbs(謂詞)
- Cmdlet nouns(名詞)
- 使用 PowerShell cmdlet 的參數
- 參數格式
- 可選參數與必需參數
- Switches
- Tab補全功能
- PowerShell 中顯示“關於文件”內容
- PowerShell 中定義模塊
- 自動加載
- PowerShell 中查找 cmdlet
- 根據模塊來查找對應的cmdlet
- Get-Help/Get-Command 查找 cmdlet
- 在 Internet 上查找 cmdlet
- PowerShell 庫
- 在 PowerShell 中使用命令別名
- 別名和參數
- Get-Alias
- New-Alias
- PowerShell 中使用 Show-Command 和 Get-Help
- 使用 Get-Help
- Get-Help 參數
- 參數指定多個值
- 更新本地幫助內容
- 使用 Update-Help 更新幫助文件
- 使用 Save-Help 保存本地幫助文件
- 使用保存的文件離線更新幫助信息
Powershell 入門
在 PowerShell 中標識和修改執行策略
PowerShell 中的執行策略旨在最大程度地減少用户無意中運行 PowerShell 腳本的可能性。 你可以將其視為一項安全功能,用於控制 PowerShell 加載配置文件和運行腳本的條件。 此功能有助於防止惡意腳本的執行。
若要標識當前 PowerShell 會話的有效執行策略,請使用以下 cmdlet:
Get-ExecutionPolicy
可以配置以下策略設置:
AllSigned。 限制所有已簽名腳本的腳本執行。 此設置要求所有腳本都由受信任的發佈者簽名,包括在本地計算機上編寫的腳本。 它會在運行來自尚未分類為受信任或不受信任的發佈者的腳本之前提示你。 但是,驗證腳本的簽名並不能消除該腳本是惡意腳本的可能性。 它只是提供額外的檢查,以最大限度地減少這種可能性。Default。 設置默認執行策略,對於 Windows 客户端,為“Restricted”,對於 Windows Server 則為“RemoteSigned”。RemoteSigned。 這是 Windows Server 計算機的默認執行策略。 腳本可以運行,但該策略要求受信任的發佈者對從 Internet 下載的腳本和配置文件進行數字簽名。 此設置不需要對在本地計算機上編寫的腳本進行數字簽名。Restricted。 這是 Windows 客户端計算機的默認執行策略。 它允許運行單個命令,但不允許運行腳本。Unrestricted。 這是非 Windows 計算機的默認執行策略,你無法更改該策略。 它允許運行未簽名的腳本。 此策略在運行並非來自本地 Intranet 區域的腳本和配置文件之前向用户發出警告。Undefined。 指示當前範圍中未設置執行策略。 如果所有範圍中的執行策略都是“Undefined”,則對於 Windows 客户端,有效執行策略為“Restricted”,對於 Windows Server 為“RemoteSigned”。
若要更改 PowerShell 中的執行策略,請使用以下命令:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
PowerShell cmdlet 的結構
PowerShell cmdlet 使用的常見格式是“謂詞-名詞”表示法,即:Verb-Noun。
Cmdlet verbs(謂詞)
cmdlet 名稱的謂詞部分指示該 cmdlet 執行的操作。 cmdlet 創建者使用一組經過批准的謂詞,這為 cmdlet 名稱提供了一致性。 常見謂詞包括:
- Get: 檢索資源,例如文件或用户。
- Set:更改與資源相關的數據,例如文件或用户屬性。
- New: 創建資源,例如文件或用户。
- Add:將資源添加到多個資源的容器。
- Remove:將資源從多個資源的容器中刪除。
可以運行 Get-Verb 該命令,獲取已批准謂詞的完整列表。
Cmdlet nouns(名詞)
cmdlet 名稱的名詞部分指示該 cmdlet 影響的資源或對象的類型。 對同一資源運行的所有 cmdlet 應使用相同的名詞。 例如,名詞 Service 用於處理 Windows 服務的 cmdlet,而名詞 Process 用於管理計算機上的進程。
名詞中還可以包含前綴,可幫助將相關名詞按系列分組。 例如,Active Directory 名詞以字母 AD 開頭(例如 ADUser、ADGroup 和 ADComputer)。
Microsoft SharePoint Server cmdlet 以前綴 SP 開頭,Microsoft Azure cmdlet 以前綴 Az 開頭。
Windows PowerShell 使用通用術語命令來指代 cmdlet、函數、工作流、應用程序和其他項。 這些項的創建方法各不相同。 但就目前而言,應將其工作方式視作相同。 本模塊交替使用“命令”和“cmdlet”這兩個術語。
使用 PowerShell cmdlet 的參數
參數格式
參數名稱以短劃線 (-) 開頭。 空格用於分隔要從參數名稱傳遞的值。 如果傳遞的值包含空格,需要用引號將文本引起來。 某些參數接受多個值,這些值必須用逗號分隔(不含空格)。
可選參數與必需參數
參數可以為可選參數或必需參數。 如果是必需參數,而運行 cmdlet 時沒有提供該參數的值,Windows PowerShell 會提示你為其提供值。 例如,如果運行 Get-Item 命令,會收到來自 Windows PowerShell 的以下消息,其中包括為 -Path 參數提供值的提示:
PS C:\> Get-Item cmdlet Get-Item at command pipeline position 1 Supply values for the following parameters: Path[0]:
如果在提示符處輸入文本 C:\,然後按 Enter 鍵兩次,該命令將成功運行。 由於此參數可以接受多個值,因此必須按 Enter 鍵兩次。 Windows PowerShell 會繼續提示輸入新值,直到按 Enter 鍵為止(實際上不用提供值)。
在某些情況下,可選擇不輸入參數名稱,只需輸入參數的值即可。 運行命令 Get-ChildItem C:\ 與運行命令 Get-ChildItem -Path C:\ 相同,因為參數 -Path 在 cmdlet 定義中定義為第一個參數。 這稱為位置參數。 在本課程中,你會注意到這些內容。 省略參數名稱僅在定義了參數位置時才適用。 並非所有命令都包含位置參數。
遞歸匹配當前目錄的後綴名,是否 match .js .html .css
$((Get-ChildItem -Recurse $Path).Extension | Sort-Object -Unique) -match '\.js|\.html|\.css'
Switches
Switches是一種特殊情況。 從根本上來説,它們是接受布爾值(true 或 false)的參數。 它們與實際布爾參數的不同之處在於,僅當運行命令時包含了開關,該值才能設置為 true。 一個示例是 Get-ChildItem cmdlet 的 -Recurse 參數或開關。 Get-ChildItem c:\ -Recurse 命令不僅會返回 C:\ 目錄中的項,還會返回其所有子目錄中的項。 如果沒有 -Recurse 開關,將僅返回 C:\ 目錄中的項。
這種的意思就是叫開關Switches,有就開,沒有這個參數就關
Get-ChildItem c:\tmp -Recurse
# 這個命令會遞歸讀取你所有文件,然後返回,使用的時候慎重,不然會一下子展示很多文件
Tab補全功能
輸入幾個字符的 cmdlet 或參數,然後按 Tab 鍵,PowerShell 將根據輸入字符的匹配情況自動提供缺失的名稱部分。 如果有多個匹配項,只需多次按 Tab 鍵,直到出現要使用的匹配項。 這適用於 cmdlet 和參數、變量名、對象屬性和文件路徑。
Tab 自動補全還幫助發現 cmdlet 和參數名稱。 例如,如果你知道需要適用於 Active Directory 資源的 Get cmdlet,則可以在控制枱中輸入文本 Get-AD,然後按 Tab 鍵查看可用選項。 對於參數,只需輸入短劃線 (-),然後可以多次按 Tab 鍵查看 cmdlet 的所有參數。
- 支持通配符的補全
Tab 自動補全甚至可以使用通配符。 如果知道需要一個對服務進行操作的 cmdlet,但不確定需要哪個,則在控制枱中輸入文本*-service,然後按 Tab 鍵查看名稱中包含文本 -service 的所有 cmdlet。
PowerShell 中顯示“關於文件”內容
雖然 Windows PowerShell 中的很多幫助內容與命令有關,但也有很多幫助文件描述了 PowerShell 概念。 這些文件包括有關 PowerShell 腳本語言、運算符和其他詳細信息的信息。 此信息並不具體涉及單個命令,而是涉及全局 shell 技術和功能。
拿到某個cmdlet的詳細信息:
Get-Help Get-Process
通配符獲取cmdlet列表(當你使用通配符進行匹配的時候不是顯示詳細信息):
Get-Help Get-*
PowerShell 中定義模塊
可以通過運行以下命令來檢查可用模塊的列表:
Get-Module -ListAvailable
自動加載
有固定存放模塊的目錄,所以我們只要將自己寫好的模塊存進去即可
在 Windows PowerShell 版本 3.0 及更新版本中,如果運行屬於該模塊的 cmdlet,模塊會自動加載。 如果包含 cmdlet 的模塊位於模塊加載路徑下的文件夾中,則這一點有效。 默認情況下,這些文件夾包括 %systemdir%\WindowsPowerShell\v1.0\Modules 和 %userprofiles%\Documents\WindowsPowerShell\Modules。 文件夾列表存儲在環境變量中 $env:PSModulePath 。 按名稱顯式導入模塊時,PowerShell 會檢查該環境變量引用的位置。
對於 PowerShell 7,PSModulePath 包含以下位置:
C:\Users\<user>\Documents\PowerShell\ModulesC:\Program Files\PowerShell\ModulesC:\Program Files\PowerShell\7\ModulesC:\Program Files\WindowsPowerShell\ModulesC:\WINDOWS\System32\WindowsPowerShell\v1.0\Modules
使用 Windows PowerShell 時,通常使用 環境變量(指向 %systemdir%\WindowsPowerShell\v1.0)和模塊路徑(即使用 `$PSHome` 表示法)的組合來引用 %systemdir%\WindowsPowerShell\v1.0\Modules 路徑`$PSHome\Modules`。 對於 PowerShell 7.0, `$PSHome` 環境變量引用 **C:\Program Files\PowerShell\7**。
PowerShell 中查找 cmdlet
根據模塊來查找對應的cmdlet
使用 Get-Module 命令時,會顯示所引用模塊包含的部分 cmdlet 列表。 但是,可以通過其他方式使用該模塊來查找其 cmdlet。
例如,如果已發現模塊 NetAdapter,會預計它應包含可用於管理網絡適配器的 cmdlet。 可以通過運行 Get-Command –Module NetAdapter 命令在該模塊中找到所有適用的命令。 –Module 參數將結果限制為僅指定模塊中的那些命令。
# 比如你之前學的 Get-Module -ListAvailable 檢查完可用模塊後發現NetAdapter
# 然後你想知道NetAdapter有啥函數命令可以用就如下命令可以看
Get-Command -Module NetAdapter
Get-Help/Get-Command 查找 cmdlet
可以使用 Get-Help 執行類似的搜索,包括使用通配符。
使用 Get-Help 而不是 Get-Command 的一個優點是當 Get-Help 找不到匹配的命令名稱時候它會使用查詢字符串執行全文搜索。
如果運行 Get-Command beep 命令,則沒有可用結果。 如果運行 Get-Help beep 命令,將返回多個結果。
Get-Help Get-event*
↓↓相當於↓↓ # 不同點就是Get-Help 找不到匹配的命令名稱,它會使用查詢字符串執行全文搜索
Get-Command –Verb Get –Noun event*
你還可以多加一個參數-Full來針對該cmdlet查看更加詳細的幫助信息(這參數後面會講到)
還可以直接彈出窗口的方式去查看一個命令
Get-Help Stop-Process -ShowWindow
在 Internet 上查找 cmdlet
不限於搜索計算機已安裝的 cmdlet。 可以搜索 Internet 來查找各種 Microsoft 和非 Microsoft 模塊和 cmdlet。 如果你只是使用術語 PowerShell 和正在使用的技術進行搜索,你會發現許多指向 Microsoft 和非 Microsoft 網站上的文章的鏈接。 幾乎所有 Microsoft 團隊都創建了用於管理其產品的 cmdlet,你可以將其作為管理工具的一部分進行安裝。
PowerShell 庫
PowerShell 庫是 Windows PowerShell 相關內容(包括腳本和模塊)的中央存儲庫。
PowerShellGet 包含用於從聯機庫中查找和安裝模塊、腳本和命令的 cmdlet。
例如,Find-Command cmdlet 搜索命令、函數和別名。 其工作原理類似於 Get-Command cmdlet,包括對通配符的支持。
有關 PowerShell 庫的詳細信息,請參閲 https://www.powershellgallery.com/
在 PowerShell 中使用命令別名
PowerShell 包含舊批處理和 Linux 命令的別名
windows powershell還是可以繼續使用cmd那一套命令,比如dir之類的
dir 命令運行 Get-ChildItem,cd 命令運行 Set-Location,mkdir 命令運行 New-Item。 這些命令在 PowerShell 中運行,因為它們是執行等效操作的 cmdlet 的別名。
別名和參數
請務必注意,別名通常不支持原始命令使用的參數。 例如,如果在控制枱中運行命令 dir /o:d,則將收到錯誤,因為 Get‑ChildItem 無法識別 /o:d 參數。 相反,可以使用 dir | sort LastAccessTime 按上次訪問的日期和時間以升序列出當前文件夾的內容。
也就是説你要在powershell中執行以前的比如dir,那你執行dir其實就相當於執行Get-ChildItem,所以cmd中你的dir的參數在powershell中無效,因為你這個參數其實是給了Get-ChildItem
Get-Alias
- 通過cmdlet查找別名都有哪些
(可能你會發現很多個別名,當然這些都是可以用的)
Get‑Alias -Definition Get-Process
- 通過別名查找cmdlet
Get-Alias gps
參數也可以具有別名。 例如,-s 參數是 Get-ChildItem cmdlet 中 -Recurse 的別名。 實際上,對於參數,如果命令中包含的名稱部分足以唯一標識該參數,則可以像使用別名一樣使用部分參數名稱。
New-Alias
使用 New-Alias cmdlet 創建自定義別名,並將其映射到任何現有 cmdlet。
- 自定義別名不會在 Windows PowerShell 會話之間保存。
每次打開 Windows PowerShell 時,都可以使用 Windows PowerShell 配置文件重新創建別名。
比如:
為 Get-Help創建 gh 別名
New-Alias -Name gh -Value Get-Help
使用的時候就可以:
gh Get-CimInstance -Detailed
PowerShell 中使用 Show-Command 和 Get-Help
Show-Command cmdlet 將打開一個窗口,其中顯示命令列表或特定命令的參數。 此窗口與在 ISE 中選擇“顯示命令窗口”選項時顯示的窗口相同。
在“顯示命令窗口”中,為指定的命令設置的每個參數都會顯示在單獨的選項卡上。這清楚地表明,不能在集之間混合和匹配參數。
為所有必需參數提供值後,可以通過在“顯示”命令窗口中選擇“運行”來立即運行該命令。 也可以通過選擇“複製”將其複製到剪貼板。可通過剪貼板將命令粘貼到控制枱中,以便可在不運行命令的情況下查看正確的命令行語法。
使用 Get-Help
- Get-help (cmdlet)
通過制定某個cmdlet來顯示詳細信息 - help (cmdlet)
一頁 一頁的顯示 - man (cmdlet)
和help一樣
Get-Help 參數
- –Examples
展示某個cmdlet的使用示例
Get-Help Get-Process -Examples
- -Full
提供有關 cmdlet 的詳細信息,包括:- 每個參數的説明。
- 每個參數是否具有默認值(不過此信息並非一致地記錄在所有命令中)。
- 參數是否是必需的。
- 參數是否可接受特定位置的值(在這種情況下會給出從 1 開始的位置編號),或者是否必須輸入參數名稱(在這種情況下會顯示命名參數)。
- 參數是否接受管道輸入;若接受,則還顯示接受方式。
Get-Help Get-Process -Full
- Get-Help 參數包括:
- ‑ShowWindow。 在單獨的窗口中顯示幫助主題,以便在輸入命令時更容易訪問幫助。
- ‑Online。 在瀏覽器窗口中顯示幫助主題的聯機版本(通常是最新的信息)。
‑Parameter ParameterName。 顯示命名參數的説明。- ‑Category。 僅顯示特定類別命令的幫助,如 cmdlet 和函數。
參數指定多個值
某些參數接受多個值。 在語法部分,參數值類型中的雙方括號表示法指定這些參數。 例如:
-ComputerName <string[]>
上述語法指示 –ComputerName 參數可以接受一個或多個字符串值。
指定多個值的一種方法是使用逗號分隔的列表。
無需用引號將值括起來,除非值本身包含逗號或空格,例如空格字符或製表符。
例如,使用以下命令指定多個計算機名:
Get-EventLog –LogName Application –ComputerName LON-CL1,LON-DC1
更新本地幫助內容
運行 Update-Help 掃描計算機以查找所有已安裝的模塊,檢索每個模塊的聯機幫助位置,並嘗試下載其各自的幫助文件。
必須以本地管理員組成員的身份運行此命令,因為 Windows PowerShell 核心命令幫助存儲在 %systemdir% 文件夾中。
如果無法下載幫助,將顯示錯誤消息。 在這種情況下,Windows PowerShell 仍會為命令創建默認幫助顯示。
默認情況下,即使連續多次運行命令,Update-Help 也會每 24 小時檢查一次幫助文件。 若要重寫此行為,請包括 –Force 參數。
與 Update-Help 配套的是 Save-Help。 它會下載幫助內容並將其保存到指定的位置。 利用此功能可將該內容複製到未連接到 Internet 的計算機。 Update-Help 提供了一個參數來指定替代源位置。 通過此功能,可在未連接到 Internet 的計算機上更新幫助。
使用 Update-Help 和 Save-Help 前,需注意以下幾點:
- 管理員權限:通常需要以管理員身份運行 PowerShell 才能執行幫助更新操作。
- 執行策略:確保 PowerShell 的執行策略允許運行腳本。你可以通過
Get-ExecutionPolicy查看當前策略,若需更改,可使用Set-ExecutionPolicy RemoteSigned(需要管理員權限)。 - 網絡連接:
Update-Help需要互聯網連接來從微軟服務器下載幫助文件。若網絡受限,需使用Save-Help離線方式。 - 語言支持:默認情況下,
Update-Help會嘗試下載與操作系統 UI 語言文化相匹配的幫助文件。若需特定語言的幫助,可使用-UICulture參數指定。
使用 Update-Help 更新幫助文件
Update-Help 命令的主要作用是下載並安裝最新的幫助文件到你的本地計算機。
常用參數
-Module <ModuleName[]>:指定要更新幫助的模塊名稱(如NetAdapter,Hyper-V)。支持通配符*。-UICulture <CultureInfo[]>:指定要下載的幫助文件的語言文化(如en-US,zh-CN)。若不指定,則使用 PowerShell 的當前 UI 文化。-Force:強制更新幫助文件,即使未到預設的更新間隔或幫助文件已存在。-ErrorAction <Action>:指定發生錯誤時執行的操作。對於Update-Help,常見的錯誤如模塊幫助文件不存在(404 錯誤)或模塊名稱大小寫問題,可使用-ErrorAction SilentlyContinue忽略特定錯誤。
案例1:更新所有模塊的幫助信息
執行後,PowerShell 會連接微軟服務器並下載所有已安裝模塊的最新幫助文檔。
# 以管理員身份運行PowerShell
Update-Help -Force
案例2:更新指定模塊的幫助信息(如 NetSecurity 模塊)
Update-Help -Module NetSecurity -Force
案例3:忽略更新過程中的某些錯誤(例如某些模塊沒有相應語言的幫助文件時):
Update-Help -Force -ErrorAction SilentlyContinue
使用 Save-Help 保存本地幫助文件
Save-Help 命令的主要作用是將幫助文件下載到一個指定的本地目錄或網絡共享路徑,但不立即安裝。這對於需要在無法訪問互聯網的計算機(如內網服務器) 上更新幫助文件非常有用。
常用參數
-DestinationPath <String[]>:指定保存幫助文件的目標目錄路徑。-Module <ModuleName[]>:指定要下載幫助的模塊名稱。-UICulture <CultureInfo[]>:指定要下載的幫助文件的語言文化。-Force:強制下載幫助文件,即使未到預設的下載間隔。
案例1:將幫助文件下載到本地目錄(如 D:\PSHelp)
此命令會將所有模塊的幫助文件下載到 D:\PSHelp 目錄
# 以管理員身份運行PowerShell
Save-Help -DestinationPath D:\PSHelp -Force
案例2:為指定模塊下載幫助文件(如 BitLocker 模塊)
Save-Help -DestinationPath D:\PSHelp -Module BitLocker -Force
使用保存的文件離線更新幫助信息
- 將包含幫助文件的目錄(如上述的
D:\PSHelp)複製到離線計算機上,或確保離線計算機能訪問到存放幫助文件的網絡共享位置。 - 在離線計算機上,使用
Update-Help並指定-SourcePath參數:
此命令會從D:\PSHelp目錄中獲取幫助文件並安裝到離線計算機上
# 以管理員身份在離線計算機上運行PowerShell
Update-Help -SourcePath D:\PSHelp -Force