分享程式代碼相關筆記
目前文章總數:229 篇
最後更新:2026年 04月 25日
前言:當一個家庭網路環境,需要多個家人一起共用的情況,通常不能隨意將路由器設定為固定 IP,這時會有這個狀況:
登入 Azure -> SQL Database
選擇設定防火牆規則
自己的個人電腦因為網路環境為浮動IP,因此每次都要手動到 Azure 開啟訪問 IP 權限,如圖當前為 111.249.234.86 ,非常的麻煩
因此本篇範例說明: Azure PowerShell + PowerShell 自動化腳本 + Windows 工作排程器
解決上述問題
開啟 PowerShell ,輸入以下指令檢查版本,需要 PowerShell 5.1 版本以上
$PSVersionTable.PSVersion
Major : 5
Minor : 1
輸入以下指令檢查 AzureRM 版本,需要 PowerShell 12.x 版本以上
Get-Module -Name AzureRM -ListAvailable
如下圖顯示 5.7 版本(2019),一般個人電腦用戶是不會使用,版本都會較舊,所以需要手動升級
※若此階段版本為 12.x 以上,可跳到第三部分
可以從微軟官網參考安裝指南,內容詳細且豐富,或者參考下面的流程,快速安裝完成
開啟Azure PowerShell MSI Release下載頁面,選擇 Az 15.4.0 Latest 版本
進入後,可以看到 Install Module 有提供 PowerShell 指令
Install-Module -Name Az -RequiredVersion 15.4.0
直接執行會報錯誤訊息
Install-Module -Name Az -RequiredVersion 15.4.0
實際上正確的指令應加上 -AllowClobber
Install-Module -Name Az -RequiredVersion 15.4.0 -AllowClobber
並且選擇 [A] 全部皆是(A) ** 就可授予安裝權限並正常執行:
補充說明:為何需要 **-AllowClobber ,此參數的意思是:允許新模組覆蓋這些同名的舊指令
錯誤訊息有提及 此系統上已有下列命令: ‘Login-AzAccount, Logout-AzAccount, Send-Feedback’
因此部分個人電腦有可能遇到此問題
安全性的部分 - 是可以直接執行覆蓋,說明如下:
| 疑問 | 解答 |
| 實際情況會不會刪除檔案? | 不會,只是覆蓋指令的綁定,不會刪除任何東西 |
| 會不會影響其他程式? | 不會,只影響 PowerShell 模組的指令對應 |
| 微軟有沒有預期這種用法? | 有,這是官方提供的標準參數 |
| 為什麼官方 MSI 沒寫? | 官方假設你是全新安裝,沒有舊版衝突 |
如果安裝成功,可以輸入以下確認,應確認出現 Az.Sql 模組
Get-Module -ListAvailable Az.Sql
安裝完成 Azure PowerShell 後,接著就可以輸入指令訪問 Azure 雲端服務
Connect-AzAccount
輸入後會出現提示 **Unable to acquire token for tenant 您獲得的 tenant ID
照著指示將 您獲得的 tenant ID 帶入參數中再次執行:
※取代 xxx 的部分
Connect-AzAccount -SubscriptionId xxxxxxxx-xxx-xxxx-xxxx-xxxxxxxxxxxxxx
會跳出登入 Azure 的操作,請登入自己的 Azure 帳號
如果成功登入,並且輸入正確的指示 ID 可以出現以下結果:
※要完成自動化,不會每次都手動輸入
接著輸入以下指令,可以看到 Step 2. 您獲得的 tenant ID 綁定的 Azure Portal 用戶訂閱識別碼 應一致
Get-AzSubscription
登入自己的 Azure 帳號 -> Azure SQL Database -> 用戶訂閱識別碼
輸入以下指令,取得 ServerName 與 ResourceGroupName
Get-AzSqlServer
將以下的 PS 語法貼上,將 您的ResourceGroupName 與 您的ServerName 替換,並執行
$currentIp = (Invoke-RestMethod -Uri "https://api.ipify.org")
New-AzSqlServerFirewallRule `
-ResourceGroupName "您的ResourceGroupName" `
-ServerName "您的ServerName" `
-FirewallRuleName "Louis_Home_IP" `
-StartIpAddress $currentIp `
-EndIpAddress $currentIp
可看到對應的資訊結果,我們加進的 IP 在 StartIpAddress:111.249.234.86
進入 Azure Portal 檢查,可以確認已透過指令加入 111.249.234.86 此 IP 訪問
執行以下指令,會產生專屬的 AppId 與 Secret
※Secret 只會顯示這一次,請立刻複製並保存紀錄
$sp = New-AzADServicePrincipal -DisplayName "您的顯示名稱"
Write-Host "AppId: $($sp.AppId)"
Write-Host "Secret: $($sp.PasswordCredentials.SecretText)"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# ===== 設定區(只需要填這裡)=====
$tenantId = "您獲得的 tenant ID"
$subscriptionId = "您 Azure Portal 用戶訂閱識別碼"
$clientId = "你的AppId"
$clientSecret = "你的Secret"
$resourceGroup = "您的ResourceGroupName"
$serverName = "您的ServerName"
$ruleName = "Louis_Home_IP" # ← 填寫自己好辨識的,會顯示在 Azure Portal 上
# ==================================
# 自動登入(不跳出互動式登入)
$secureSecret = $clientSecret | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($clientId, $secureSecret)
Connect-AzAccount -ServicePrincipal -TenantId $tenantId -Credential $credential -SubscriptionId $subscriptionId | Out-Null
# 取得目前 Real IP
$currentIp = (Invoke-RestMethod -Uri "https://api.ipify.org")
# 更新防火牆規則(自動判斷新增或更新)
try {
Set-AzSqlServerFirewallRule `
-ResourceGroupName $resourceGroup `
-ServerName $serverName `
-FirewallRuleName $ruleName `
-StartIpAddress $currentIp `
-EndIpAddress $currentIp | Out-Null
} catch {
New-AzSqlServerFirewallRule `
-ResourceGroupName $resourceGroup `
-ServerName $serverName `
-FirewallRuleName $ruleName `
-StartIpAddress $currentIp `
-EndIpAddress $currentIp | Out-Null
}
Write-Host "✅ 防火牆已更新為:$currentIp"
如圖,將檔案放在自己喜歡的目錄下,並定義名稱,這邊示意命名為 update-firewall.ps1 存在 Windows 的 :
D:\\Windows_Auto_Execute\\update-firewall.ps1
開始 -> 工作排程器
工作排程器 -> 建立工作 -> 開啟後,點開建立工作按鈕,皆為名稱定義,可參考如圖:
工作排程器 -> 觸發程序 -> 新增觸發程序,設定參數如下:
開始工作:登入時
設定:任何使用者
進階設定:已啟用打勾
工作排程器 -> 動作 -> 新增動作,設定參數如下:
我們使用的是 PowerShell 腳本,因此 程式或指令碼 要使用 powershell.exe
動作:啟動程式
程式或指令碼:powershell.exe
新增引數:-NonInteractive -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "D:\\Windows_Auto_Execute\\update-firewall.ps1"
補充說明:新增參數內容
| 參數 | 參數用途 |
| -NonInteractive | 禁止任何互動式提示 |
| -NoProfile | 不載入使用者設定檔,加快啟動速度 |
| -ExecutionPolicy Bypass | 略過腳本執行限制 |
| -WindowStyle Hidden | 背景執行,不彈出視窗 |
| -File | 執行檔案,要放檔案位置 |
我們觸發的時機是電腦登入時,若要即時測試,可以直接點擊 執行 :
工作排程器執行完畢後,立刻刷新 Azure Portal 上的防火牆規則
實現自動化更新: Azure PowerShell + PowerShell 自動化腳本 + Windows 工作排程器