首頁

目前文章總數:229 篇

  

最後更新:2026年 04月 25日

0004. 家用浮動 IP 也能穩定連線 Azure SQL Server:PowerShell 自動化防火牆更新教學

日期:2026年 05月 02日

標籤: Microsoft Azure Microsoft Azure Repos Microsoft Azure SqlServer PowerShell

摘要:Microsoft Azure 筆記


目的:1. 當個人電腦網路為動態IP,無法設定為固定IP的網路環境時,如何自動化解決每次都要手動設定 Azure SQL Server 防火牆訪問規則
應用所需:1. Windows 作業系統個人電腦
     2. Visual Studio 2022 以上版本
     3. Azure 帳號,並且擁有 Azure SQL Server 服務
基本介紹:本篇分為 5 大部分。
第一部分:解決目標
第二部分:安裝 Azure 模組
第三部分:設定 Azure Service Principal
第四部分:Windows 排程 & 自動化腳本
第五部分:驗證成果






第一部分:解決目標

Step 1:問題描述

前言:當一個家庭網路環境,需要多個家人一起共用的情況,通常不能隨意將路由器設定為固定 IP,這時會有這個狀況:
登入 Azure -> SQL Database


選擇設定防火牆規則


自己的個人電腦因為網路環境為浮動IP,因此每次都要手動到 Azure 開啟訪問 IP 權限,如圖當前為 111.249.234.86 ,非常的麻煩
因此本篇範例說明: Azure PowerShell + PowerShell 自動化腳本 + Windows 工作排程器
解決上述問題


第二部分:安裝 Azure 模組

Step 1:確認 PowerShell 版本

開啟 PowerShell ,輸入以下指令檢查版本,需要 PowerShell 5.1 版本以上

$PSVersionTable.PSVersion


Major : 5
Minor : 1


Step 2:確認 Azure 模組

輸入以下指令檢查 AzureRM 版本,需要 PowerShell 12.x 版本以上

Get-Module -Name AzureRM -ListAvailable


如下圖顯示 5.7 版本(2019),一般個人電腦用戶是不會使用,版本都會較舊,所以需要手動升級
※若此階段版本為 12.x 以上,可跳到第三部分


Step 3:安裝 Azure PowerShell

可以從微軟官網參考安裝指南,內容詳細且豐富,或者參考下面的流程,快速安裝完成


Step 4:安裝 Azure PowerShell - Release 版本

開啟Azure PowerShell MSI Release下載頁面,選擇 Az 15.4.0 Latest 版本



Step 5:安裝 Azure PowerShell - 取得 MSI 安裝指令

進入後,可以看到 Install Module 有提供 PowerShell 指令

Install-Module -Name Az -RequiredVersion 15.4.0




Step 6:安裝 Azure PowerShell - 可能異常

直接執行會報錯誤訊息

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 沒寫? 官方假設你是全新安裝,沒有舊版衝突



Step 7:安裝 Azure PowerShell - 確認成功

如果安裝成功,可以輸入以下確認,應確認出現 Az.Sql 模組

Get-Module -ListAvailable Az.Sql




第三部分:設定 Azure Service Principal

Step 1:透過 Azure PowerShell 登入 Azure

安裝完成 Azure PowerShell 後,接著就可以輸入指令訪問 Azure 雲端服務

Connect-AzAccount


輸入後會出現提示 **Unable to acquire token for tenant 您獲得的 tenant ID


Step 2:透過 Azure PowerShell 登入 Azure - 依照指示替換

照著指示將 您獲得的 tenant ID 帶入參數中再次執行:
※取代 xxx 的部分

Connect-AzAccount -SubscriptionId xxxxxxxx-xxx-xxxx-xxxx-xxxxxxxxxxxxxx


會跳出登入 Azure 的操作,請登入自己的 Azure 帳號


Step 3:透過 Azure PowerShell 登入 Azure - 成功繫結

如果成功登入,並且輸入正確的指示 ID 可以出現以下結果:
※要完成自動化,不會每次都手動輸入


Step 4:確認當前繫結 ID - 對應 Azure Portal

接著輸入以下指令,可以看到 Step 2. 您獲得的 tenant ID 綁定的 Azure Portal 用戶訂閱識別碼 應一致

Get-AzSubscription




登入自己的 Azure 帳號 -> Azure SQL Database -> 用戶訂閱識別碼


Step 5:取得 Azure Sql Database ServerName 與 ResourceGroupName

輸入以下指令,取得 ServerName 與 ResourceGroupName

Get-AzSqlServer




Step 6:測試更新 Azure 防火牆規則

將以下的 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


Step 7:Azure Portal 驗證防火牆規則

進入 Azure Portal 檢查,可以確認已透過指令加入 111.249.234.86 此 IP 訪問


Step 8:建立 Service Principal

執行以下指令,會產生專屬的 AppId 與 Secret
※Secret 只會顯示這一次,請立刻複製並保存紀錄

$sp = New-AzADServicePrincipal -DisplayName "您的顯示名稱"
Write-Host "AppId: $($sp.AppId)"
Write-Host "Secret: $($sp.PasswordCredentials.SecretText)"




第四部分:Windows 排程 & 自動化腳本

Step 1:準備自動化腳本 - 存成檔案

[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




Step 2:Windows - 工作排程器

開始 -> 工作排程器


Step 3:Windows - 工作排程器 - 建立工作

工作排程器 -> 建立工作 -> 開啟後,點開建立工作按鈕,皆為名稱定義,可參考如圖:


Step 4:Windows - 工作排程器 - 新增觸發程序

工作排程器 -> 觸發程序 -> 新增觸發程序,設定參數如下:

開始工作:登入時
設定:任何使用者
進階設定:已啟用打勾




Step 5:Windows - 工作排程器 - 新增動作

工作排程器 -> 動作 -> 新增動作,設定參數如下:
我們使用的是 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 執行檔案,要放檔案位置



第五部分:驗證成果

Step 1:工作排程器 - 執行測試

我們觸發的時機是電腦登入時,若要即時測試,可以直接點擊 執行


Step 2:工作排程器 - DEMO成功

工作排程器執行完畢後,立刻刷新 Azure Portal 上的防火牆規則
實現自動化更新: Azure PowerShell + PowerShell 自動化腳本 + Windows 工作排程器