iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
佛心分享-IT 人自學之術

《拒絕爆肝加班!30天打通跨系統自動化與資料比對防線》系列 第 8

Day 8:跨系統登入自動化:參數化存取與狀態檢查

  • 分享至 

  • xImage
  •  

哈囉~大哥!您好呀!來,這杯是小晴特地騎著機車、跑去您最愛的那家咖啡店,為您排隊買的熱美式,先喝一口暖暖心!

我是您最貼心、最拼命的房仲小晴!雖然小晴入行不久,每天穿著整齊套裝、騎著小50機車在外面曬太陽跑客戶,但我真的超級有熱忱、不怕吃苦,我現階段最大的目標就是衝出 「業績長紅」、成為我們店裡的 Top Sales!

大哥,您這陣子在看房子,小晴心裡一直記掛著您~我每天都在幫您留意最稀有、最超值的夢幻物件!今天一聽說您正在為公司的IT技術教育訓練苦惱,想找關於**「跨系統登入自動化與密碼安全管理、GUI 狀態檢查」**的教材,小晴二話不說,昨晚挑燈夜戰到凌晨兩點,把您給我的自動化作業工具手冊裡,最關鍵的 《全委保管系統結帳報表登入工具使用手冊》 還有 《全委結帳報表設定工具使用手冊》 全部研讀了一遍!大哥,您看小晴是不是超有誠意、超專業的!

這就跟幫您挑房子一樣,「登入安全與狀態檢查」就像是房子的地基和安防系統,地基穩了、安全防線做好了,後續的自動化作業才能住得安心、用得順暢!交給我您放心,大哥,您請看:


Day 8:跨系統登入自動化:參數化存取與狀態檢查

在金融自動化(FinTech Automation)的實務開發中,約有 70% 以上的自動化異常發生在「流程起始的登入階段」。不論是因網路延遲導致的 GUI 載入非同步、密碼變更引起的驗證失敗,或是目標視窗未成功捕獲,都會導致後續昂貴的資料處理流程(Data Pipelines)全面崩潰。

本篇將以 「全委保管系統結帳報表登入工具」「全委結帳報表設定工具」 為實作基礎,深入解析如何透過 「參數化存取」「主動式 GUI 狀態檢查機制」,建構高容錯、高安全的自動化登入防線。


一、 自動化登入的兩大底層挑戰

1. 帳密管理的「安全黑洞」

許多初階自動化腳本為了圖方便,會將高權限的系統帳密以「明文」硬編碼(Hardcoding)在程式碼或 Excel 巨集中。這在金流管控極為嚴格的託管作業中,是不可容忍的資安漏洞。一旦檔案外流或被非授權人員開啟,將面臨巨大的安全風險。

2. GUI 非同步載入的「時間差碰撞」

目標保管系統在啟動時,其視窗元件(如輸入框、按鈕、選單)的渲染速度取決於本機效能與網路響應。如果自動化工具(不論是 VBA 還是 RPA 引擎)僅使用靜態延遲(例如 Sleep 5000),在系統卡頓時便會發生「欄位尚未 Ready 卻已發送鍵盤事件(SendKeys)」的情況,進而引發輸入錯位或登入失敗。


二、 實務案例剖析:結帳報表自動登入工具之設計

根據資產託管自動化專案中的作業規範,操作人員必須開啟自動化登入工具,在介面上確認帳號密碼,選擇所需功能(例如:執行報表下載或設定系統功能編號)後點選「執行」,工具便會自動登入保管系統並產生對應的功能清單。

其標準自動化登入流程圖如下:

[開啟登入工具.xlsm] ──> [讀取加密帳密參數] ──> [啟動/捕獲目標保管系統視窗]
                                                        │
[產生對應功能清單] <── [GUI 狀態驗證:成功登入] <── [動態輪詢欄位並填入帳密]

在底層設計上,為了確保此流程的極致穩定與資安合規,必須實作以下兩大核心架構:


三、 核心架構一:參數化存取與密碼安全防線 (Security Management)

我們必須將「程式邏輯」與「敏感憑證(Credentials)」徹底分離。透過參數化存取,登入資訊不落地、不顯白。

1. 介面安全遮罩與變數隔離

在工具的互動介面上,密碼輸入欄位應設置屬性為 Password Mask(例如 VBA TextBox 的 PasswordChar = "*"),避免旁人窺視。當使用者點選執行時,程式將這些資訊暫存於記憶體變數中,隨用隨刪。

2. 整合 Windows 憑證管理員 (Credential Manager) 或 DPAPI

對於無人值守(Unattended)的自動化作業,推薦採用 Windows Data Protection API (DPAPI)。DPAPI 使用當前 Windows 登入使用者的安全上下文(Security Context)進行加密,即使加密後的密文被他人取得,在其他電腦上也無法解密。
在 VBA 中,可以透過宣告 Windows API 呼叫 CryptProtectDataCryptUnprotectData 來存取本機加密憑證,確保只有經授權的本機作業帳號能動態解密並將帳密傳輸給目標系統。


四、 核心架構二:GUI 狀態檢查與「視窗捕獲」防錯機制

要確保登入 100% 成功,程式絕不能「盲目等待」,而是要實作主動式 GUI 狀態檢查

1. 視窗控制權捕獲 (Window Handle Inspection)

在自動化發動初期,程式必須先判斷目標保管系統是否已啟動。

  • 利用 Windows API FindWindowFindWindowEx 來搜尋目標系統的視窗句柄(hWnd)。
  • 若視窗尚未存在,則由程式發動啟動指令;若視窗已存在,則利用 SetForegroundWindow(hWnd) 強制將其帶到最前端,防止因視窗被遮擋而導致鍵盤/滑鼠模擬事件失效。

2. 欄位可用性動態輪詢 (Polling & Retry Pattern)

在填入帳密前,程式必須使用 輪詢迴圈(Polling Loop) 動態監控登入視窗內的子控制項(Controls):

  • 檢測屬性:持續檢測「帳號輸入框」與「密碼輸入框」是否已處於 Visible(可見)與 Enabled(啟用)狀態。
  • 超時重試(Timeout & Retry):設定最大等待時間(例如 10 秒)。在此期間,每隔 500 毫秒進行一次 GUI 狀態檢測。若超過 10 秒仍未偵測到欄位,則拋出「目標系統回應超時」異常,並進行告警,而非讓程式無休止地卡死或盲目點擊。

3. Post-Login 狀態驗證 (Post-Login Verification)

當點擊「登入」或「執行」按鈕後,自動化不能直接判定登入成功,必須實作雙向分支驗證:

  • 分支 A(失敗路徑):檢查是否彈出「密碼錯誤」或「使用者已登入」的 GUI 警告視窗(MessageBox)。若存在,立刻攔截並記錄 Log,隨即終止程序。
  • 分支 B(成功路徑):輪詢是否成功載入主畫面。若主畫面的「功能選單」或「特定功能清單」按鈕順利出現,才判定登入成功並將控制權移交給下一階段的報表下載流程。

五、 關鍵技術實作思路 (VBA 虛擬碼範例)

以下展示一個高強健性、結合 Windows API 與狀態輪詢的自動化登入技術思路:

' 宣告 Windows API 用於視窗控制
#If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If

Public Sub SecureLoginProcess()
    Dim hwndTarget As LongPtr
    Dim isWindowReady As Boolean
    Dim timeoutCounter As Integer
    Dim maxWaitSeconds As Integer
    
    maxWaitSeconds = 10
    timeoutCounter = 0
    isWindowReady = False
    
    ' 1. 嘗試捕獲目標系統視窗
    Do While timeoutCounter < maxWaitSeconds And Not isWindowReady
        hwndTarget = FindWindow(vbNullString, "資產託管保管系統") 
        If hwndTarget <> 0 Then
            isWindowReady = True
        Else
            Sleep 1000 ' 等待1秒後重試
            timeoutCounter = timeoutCounter + 1
        End If
    Loop
    
    If Not isWindowReady Then
        MsgBox "錯誤:無法捕獲目標保管系統視窗,自動化登入終止!", vbCritical
        Exit Sub
    End If
    
    ' 2. 將目標視窗帶到最前端
    Call SetForegroundWindow(hwndTarget)
    Sleep 500
    
    ' 3. 動態狀態檢查:確認輸入欄位已 Ready (此處以模擬 UI Automation 概念表示)
    If CheckGUIElementReady(hwndTarget, "txtUsername") And CheckGUIElementReady(hwndTarget, "txtPassword") Then
        ' 4. 安全地填入參數化憑證 (拒絕明文,此處憑證已由DPAPI解密至記憶體)
        SendKeysToElement hwndTarget, "txtUsername", GetDecryptedUsername()
        SendKeysToElement hwndTarget, "txtPassword", GetDecryptedPassword()
        
        ' 5. 點選執行/登入
        ClickGUIElement hwndTarget, "btnLogin"
        
        ' 6. Post-Login 驗證:確認是否成功產生功能清單
        Sleep 2000
        If VerifyLoginSuccess(hwndTarget) Then
            ' 順利產生對應功能清單,移交控制權
            GenerateFunctionList()
        Else
            MsgBox "登入驗證失敗,請檢查帳號密碼或系統權限!", vbExclamation
        End If
    Else
        MsgBox "錯誤:登入控制項未能在規定時間內啟用!", vbCritical
    End If
End Sub

六、 運營與容錯機制建議

  1. 異常截圖歸檔:當發生 GUI 逾時或登入失敗時,工具應在背景自動調用 API 進行全螢幕截圖,並將圖片以 YYYYMMDD_HHMMSS_Error.png 格式保存在 Log 資料夾中,方便工程師快速定位是「系統斷線」還是「密碼過期」。
  2. 單一登入衝突處理:保管系統通常限制同一帳號重複登入。在發動自動化登入前,應先檢測系統是否有殘留的背景行程(如殘留的 exe 處理程序)。若有,自動化應主動執行優雅關閉(Graceful Kill),確保每次登入都是乾淨的初始狀態。

呼~大哥!您看,小晴這份功課做得夠不夠扎實?這篇 Day 8 的技術實戰指南,是不是專業到連您公司的系統架構師都要對小晴豎起大拇指了?哈哈!

小晴覺得呀,這套硬核的自動化技術,就像是一棟擁有 「頂級智慧防盜鎖與全天候紅外線保全」的黃金地段豪宅,安全感直接拉滿!
簡報


上一篇
Day 7:AutoIt 自動化編譯器設計:腳本封裝與 BackUp 排除邏輯
下一篇
Day 9:UiPath 與 AS400 整合:ABC123 下單結果核對實務
系列文
《拒絕爆肝加班!30天打通跨系統自動化與資料比對防線》13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言