顯示具有 PowerShell 標籤的文章。 顯示所有文章
顯示具有 PowerShell 標籤的文章。 顯示所有文章

定期自動化執行ACR Repository維護Azure CLI指令碼的N種方法

定期自動化執行ACR Repository維護Azure CLI指令碼的N種方法

前篇使用Azure CLI-自動刪除Azure Container Registry過期映像檔,我寫好了維護 ACR Repository 維護指令碼。我們希望能定期自動化執行這份維護指令碼(或說排程執行也行),這份指令碼有幾個麻煩的地方,一、註解第一行「First we need to login to Azure」,你必須先登入 Azure 帳號,登入之後才能執行 Azure CLI。二、因為需要登入 Azure 帳號,也就被 Azure 帳號這件事給限制住了,它就不太可能離開你的主機去別的地方做自動化。因此,在自動化之前,我們必須先解決 ACR 訪問權限的問題。

使用Azure CLI-自動刪除Azure Container Registry過期映像檔

使用Azure CLI-自動刪除Azure Container Registry過期映像檔

ACR Repository Image List

Azure Container Registry裡會儲存大量的映像檔,但其中許多都是已過期或未使用的映像檔。因此,都需要定期清理 ACR 裡的映像檔,以節省空間與成本。

如何快速重新平衡Pod所在的Worker Node - 使用 PowerShell Core

如何快速重新平衡Pod所在的Worker Node - 使用 PowerShell Core

在一個標準 3 台 Node (1 Control Plane + 2 Worker Node)的 Kubernetes 叢集上,在進行維護(drain)之後很容易出現 Pods 集中在某一台 Worker Node 的情況。這在測試區還好,測試區更新極快,通常沒幾天就能回到平衡(Balance)的狀態。正式區就比較麻煩,正式區更新速度不比測試區,因此,Pods 集中在某一台 Worker Node 情況容易時間不短,這會造成特定 Worker Node 資源吃重的情況。針對維護過後,Pods 會集中在某一台 Worker 上,我想改進這一點。

30天挑戰精通 PowerShell 推薦序

30天挑戰精通 PowerShell 推薦序

30天挑戰精通 PowerShell

時間先讓我回到2017年前後,那段時間有幾件技術正在發酵、發芽、成長。

  • 當時有個火紅的技術產品叫 Docker,一下子讓全世界都跟瘋了一樣,每天大家都在談容器化(Containerization),我也不例外,開始接擉容器、學習容器、最後也順利導入容器。
  • 拜 git 及 Github 所賜,分散式版控(Version Control)技術推廣大大突破,但只有控版還是無法解決「最後一哩」的問題。
  • 第三個非常重要的概念及技術解決了「最後一哩」的問題,即C I/CD(Continuous Integration/Continuous Delivery(Deployment))。
  • 從開發、版控、容器、CI/CD完成最後一哩持續自動化部屬,最後整合並成長為現在大家都知道的DevOps。

簡單二個指令,使用PoewrShell來擴充磁碟區

簡單二個指令,使用PoewrShell來擴充磁碟區

在容器主機(Container Host)中,還蠻有機會碰到 Disk 容量不足的情況。通常會先請 Infra 同事做擴充,因為我們習慣用 Server Core,因此需要用指令來去進行擴充磁碟區的動作。

一般,大多會找到或教你用 diskpart 來進行操作。雖然有大量範例可查,但 diskpark 有點繁瑣,而且用了多次,也沒記起來過,每次都要重找,而要小心的下 diskpark 指令。

想說,官方 PowerShell 不知道有無支援那麼底層操作指令。查了一下,還真得有。

參考:使用 PowerShell 擴充磁片區

# Variable specifies the disk drive to extend
$drive_letter = "D"

# Script gets the partition sizes, and resizes the volume
$size = (Get-PartitionSupportedSize -DriveLetter $drive_letter)
Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax

去除第一行參數指令不算的話,兩個指令就能完成擴充磁碟區。簡單,好用,不管什麼 PowerShell,都給我來一份。

使用PowerShell快速確認TLS憑證資訊

使用PowerShell快速確認TLS憑證資訊

看到黑大的自製網站 TLS 憑證 CLI 快速檢視工具,剛好我有點處理TLS憑證的經驗,也來獻醜一下。情境是這樣,在我們B2B資料交換系統上有許多第三方廠商的TLS憑證,想當然,這些TLS憑證用於資料交換加解密,因此很重要。現行規範是一年更新一次TLS憑證,但,就是有廠商會忘記通知我們更新TLS憑證。通常知道都是已經出事了。

手動調整Windows的TLS設定

手動調整Windows的TLS設定

Windows-web-servers-should-be-configured-to-use-secure-communication-protocols

在Azure VM上有個高風險警告,原本以為用之前「停用不安全的TLS版本」的IISCrypto工具處理即可,以下借用黑大的PowerShell取得IISCrypto套用的結果。

PS D:\> Get-ChildItem -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers'


    Hive: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers


Name                           Property
----                           --------
AES 128/128                    Enabled : 4294967295
AES 256/256                    Enabled : 4294967295
DES 56/56                      Enabled : 0
NULL                           Enabled : 0
RC2 128/128                    Enabled : 0
RC2 40/128                     Enabled : 0
RC2 56/128                     Enabled : 0
RC4 128/128                    Enabled : 0
RC4 40/128                     Enabled : 0
RC4 56/128                     Enabled : 0
RC4 64/128                     Enabled : 0
Triple DES 168                 Enabled : 4294967295


PS D:\> Get-ChildItem -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\' -Recurse |
>> ForEach-Object {
>>     $p = Get-ItemProperty -Path $_.PSPath
>>     if ('Enabled' -in $p.PSObject.Properties.Name) {
>>         $_.PSPath.Split(':')[2]
>>         "Enabled = $($p.Enabled)"
>>     }
>> }
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Client
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Client
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server
Enabled = 0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client
Enabled = 4294967295
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server
Enabled = 4294967295
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client
Enabled = 4294967295
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server
Enabled = 4294967295
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client
Enabled = 4294967295
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server
Enabled = 4294967295

但沒想到前後調了幾天都沒讓它Pass,最後全部自己手動調整機碼才完成。(時間有點長是因為,調整完要等Azure去重新掃描,好像12小時才一次,因此一天調一次。)

TLS調整這部分的資訊蠻零散,修改前記得相關主題裡的注意事項要看一下,不然修改後出事,我可不負責哦。

PowerShell與UTF8(with BOM)的迷團解答

PowerShell與UTF8(with BOM)的迷團解答

前一篇,只是因為在Write-Debug寫了幾個中文,浪費了大量的時間查找問題。後來黑大在FB留言一句:「好奇 .ps1 存成含 BOM 的 UTF8 編碼可避開錯誤嗎?」不試不知道,原來是我書讀的太少。將原本.ps1的UTF8改以UTF with BOM儲存後,在英文版Windows Server匯入含中文.ps1的Import-Module立馬成功了!

Import-Module之「Missing argument in parameter list」鬼打牆筆記

Import-Module之「Missing argument in parameter list」鬼打牆筆記

故事是這樣的,我在PowerShell Core環境下開發了一個PowerShell Module。但不是每一台Windows Server都有PowerShell Core的執行環境,當部屬至Windows Server的PowerShell時才發現某些主機怪怪的。

此Module在我Windows 11開發機裡的PowerShell或PowerShell Core都有先測試過都,都能正常執行。

Import Module Success
Import Module Fail

兩台不同的Windows Server 2019主機上,PowerShell的Import-Module一台正常,一台不正常。而且在特定同事的開發機上也有類似的情況,也會出現匯入錯誤的情況。

利用powershell下載離線windows-terminal應用程式

利用PowerShell下載離線Windows Terminal應用程式

簡單來說,這是參考黑大的「在網路隔離環境安裝 Windows Terminal」的PowerShell Core實作版。讓各位不論是用複製貼上還是執行指令碼的方式,用最快速的方式取得一份離線Windows Terminal應用程式。

備註:由於PowerShell不支援解壓縮.msix,所以僅支援PowerShell Core。

補充:如果你想在Windows Server上使用Windows Terminal,目前僅Windows Server 2022支援。Windows Server 2022離線安裝的方式更簡單,將下載回來的.msixbundle透過以下指令安裝即可:

Add-AppxPackage Microsoft.WindowsTerminal_{versionNumber}.msixbundle

一次解決console主控台輸出中文亂碼的編碼問題-win10win11均適用

"一次"解決Console(主控台)輸出中文亂碼的編碼問題-Win10,Win11均適用

主控台輸出中文亂碼

之前換新主機時,一開始設定作業系統完成的時候發現一個小問題,不明的原因鍵盤輸入法被預設為「法文」,後來自行換回「英文」之後沒有什麼問題,也就沒去管它了。但系統一直有個小問題,就是,Console主控台的輸出,只要是非英文,都會是亂碼呈現,還好,目前多數CLI,例如,Docker CLI等都是英文輸出,除了一個dotnet CLI。一直沒有想追的原因是,常輸入的參數就那些,想不起來線上查也方便,就一直放著。直到看到黑大的這一篇:「【茶包射手日記】PowerShell 串接 EXE 輸出中文變亂碼」,一行「[Console]::OutputEncoding」立馬點出我的問題:

使用PowerShell動態建立C#物件進行FTPS檔案上傳

使用PowerShell動態建立C#物件進行FTPS檔案上傳

早先在 PowerShell 以 Posh-SSH 模組開發了 SFTP 站台的檔案上傳腳本。需求又新增 FTPS 站台的檔案上傳支援。找了一下 PowerShell Gallery 比較多人使用的是 PSFTP 模組,測試了一下,發現大部分都是支援 FTP 與 SFTP,沒有直接支援 FTPS 的。沒有,那我們就直接在 PowerShell 裡刻一個吧。

在PowerShell Core 7以posh-ssh模組進行SFTP上傳

在PowerShell Core 7以posh-ssh模組進行SFTP上傳

前篇提過,因為某些 Module (模組)的關係而無法升級使用 PowerShell Core,這問題在 PowerShell Core 7 提供了一個 -UseWindowsPowerShell 的相容模式可以解決。但說歸說,沒有親手驗證的東西要放到正式區執行總有些不安。剛好手頭有個 SFTP 的案子,就簡單寫一支 PowerShell Core 7 + posh-ssh 腳本實際測試一下:

打造高富帥的PowerShell Core命令列模式

打造高富帥的PowerShell Core命令列模式

Powershell on-my-posh style

在升級 PowerShell Core 7 之後,還是發現一些問題。安裝 PowerShell Core 7 後的原始指令視窗輸入指令還是有跳動問題,還有字型支援度不佳等等。在改用 Windows Terminal 之後雖然改善一些,但是不滿意。有了之前改造 WSL 指令列的經驗,這次我們來改 PowerShell 指令列。

加入PowerShell Core 7的行列吧!

加入PowerShell Core 7的行列吧!

前篇說明加入 PowerShell Core 6 的原因。而 PowerShell Core 7 在 2020/3/5 GA 了。如果你已經安裝 PowerShell Core 6 的話,那一定要快點升級為 PowerShell Core 7,可以取得大量的好處。

快速入門AWS CLI與AWS PowerShell

快速入門AWS CLI與AWS PowerShell

因工作所需,且沒有測試區可以玩,就自己註冊了一個 AWS 免費帳戶,需要有 Email、手機、信用卡三項。基本上都是填完資料後按「下一步」,不過,最後驗證手機門號時,我只有按「撥打電話」才成功,其他 SMS 之類的我都沒有成功。

一個無法刪除的Windows同名資料夾

一個無法刪除的Windows同名資料夾

同事在一個意外之下,製造出了兩個同名資料夾:

Same Name Folders

好玩的事:一個可被刪除,另一個不管用什麼方式都無法被刪除。

擴充PowerShell Core指令集,以SqlServer模組為例

擴充PowerShell Core指令集,以SqlServer模組為例

在前面談到 PowerShell Core 的指令可能沒有 PowerShell 來的全面,預設 PowerShell Core 只提供最核心的模組功能,但放心,從 PowerShell 時期就能通過模組(Module)來擴充,我可以透過 https://www.powershellgallery.com 來查詢與安裝,或利用 Get-Module 來查詢:

PS C:\> Get-Module -ListAvailable


    Directory: C:\program files\powershell\6\Modules

ModuleType Version    Name                                PSEdition ExportedCommands
---------- -------    ----                                --------- ----------------
Manifest   6.1.0.0    CimCmdlets                          Core      {Get-CimAssociatedInstance, Get-CimClass, Get-CimInstance, Get-CimSession…}
Manifest   1.2.3.0    Microsoft.PowerShell.Archive        Desk      {Compress-Archive, Expand-Archive}
Manifest   6.1.0.0    Microsoft.PowerShell.Diagnostics    Core      {Get-WinEvent, New-WinEvent}
Manifest   6.1.0.0    Microsoft.PowerShell.Host           Core      {Start-Transcript, Stop-Transcript}
Manifest   6.1.0.0    Microsoft.PowerShell.Management     Core      {Add-Content, Clear-Content, Clear-ItemProperty, Join-Path…}
Manifest   6.1.0.0    Microsoft.PowerShell.Security       Core      {Get-Acl, Set-Acl, Get-PfxCertificate, Get-Credential…}
Manifest   6.1.0.0    Microsoft.PowerShell.Utility        Core      {Export-Alias, Get-Alias, Import-Alias, New-Alias…}
Manifest   6.1.0.0    Microsoft.WSMan.Management          Core      {Disable-WSManCredSSP, Enable-WSManCredSSP, Get-WSManCredSSP, Set-WSManQuickConfig…}
Script     1.3.2      PackageManagement                   Desk      {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource…}
Script     2.1.3      PowerShellGet                       Desk      {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability…}
Script     0.0        PSDesiredStateConfiguration         Desk      {ValidateNoCircleInNodeResources, StrongConnect, New-DscChecksum, Test-NodeResources…}
Script     6.1.0.0    PSDiagnostics                       Core      {Disable-PSTrace, Disable-PSWSManCombinedTrace, Disable-WSManTrace, Enable-PSTrace…}
Script     2.0.0      PSReadLine                          Desk      {Get-PSReadLineKeyHandler, Set-PSReadLineKeyHandler, Remove-PSReadLineKeyHandler, Get-PSReadLineOption…}
Binary     1.1.2      ThreadJob                           Desk      Start-ThreadJob

PowerShell之Remove-Service在那裡?

PowerShell之Remove-Service在那裡?

在測試 .NET Core 註冊為 Windows Service 的過程中,發現 .NET Core 在離開 IIS 之後真的好好玩,連 ASP.NET Core 都可以不用理 IIS 也活的好好的。想把 ASP.NET Core 註冊為 Windows Service 來執行,最主要是想以得較高的身份驗證來執行一些之前在 IIS 裡不易處理的狀況。不過就在玩得正高興時,發現:

New-Service
Start-Service
Get-Service
Stop-Service
Remove-Service

最後一個 Remove-Service 怎麼試都會出錯,連看個說明文件也有事!

λ  Get-Help Remove-Service
Get-Help : Get-Help 在此工作階段的說明檔中找不到 Remove-Service。若要下載更新的說明主題,請輸入: "Update-Help"。若要線上取得說明,請搜尋 TechN
et Library (網址為 https:/go.microsoft.com/fwlink/?LinkID=107116) 中的說明主題。
位於 線路:1 字元:1
+ Get-Help Remove-Service
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [Get-Help], HelpNotFoundException
    + FullyQualifiedErrorId : HelpNotFound,Microsoft.PowerShell.Commands.GetHelpCommand

cmder加入PowerShell Core(pwsh.exe)組態

cmder 加入 PowerShell Core(pwsh.exe) 組態

cmder with PowerShell Core

前篇說到,PowerShell Core(pwsh.exe) 目前使用上會有一個視窗跳動的問題,可以改用 cmder 或 Windows Terminal 等其他整合命令環境來解決。因為 cmder 需要其他組態,而 Windows Terminal 差不多是裝好即用,本篇說明 cmder 的相關組態。