業務痛點
- 管理百台小型機、數十個 Oracle/ERP 系統,月度輪換近百用戶密碼。
- 手工編寫複雜密碼(字母+數字隨機組合)效率低、易出錯。
- 需同步生成:
- Oracle ALTER USER ... IDENTIFIED BY 腳本(.sql)
- Unix user:pass 明文列表(.txt,人工執行 passwd)
- 密碼需留存打印歸檔,滿足審計要求。
解決方案:Excel VBA 雙模式生成器
工作表佈局
| 欄 | 用途 | 說明 |
| A | Oracle 用戶名 | 第 2 行起,空行結束 |
B | 生成的 Oracle 密碼 | 自動填寫,供打印歸檔 |
| C | Unix 用戶名 | 第 2 行起,空行結束 |
D | 生成的 Unix 密碼 | 自動填寫,供打印歸檔 |
核心參數(代碼頂部可調)
pass_length = 8:密碼長度。
start_asc = 65 ('A'):字符集起始 ASCII(65=A-Z,48=0-9A-Z混合)。
rnd_base = 90 - start_asc:隨機範圍(Oracle 不區分大小寫,僅大寫字母 26 個)。
- Unix 模式
start_asc = 48、rnd_base = 122-48=74(含大小寫數字符號),並**過濾不可見/特殊字符**(ASCII 58-64, 91-96)。
關鍵邏輯
- 遍歷 A 欄(或 C 欄)非空行。
- 循環
pass_length 次:char = Chr(start_asc + Int(Rnd * rnd_base))。
- 過濾等號 (= ASCII 61):防 Excel 誤識為公式導致報錯。
- Unix 額外過濾
[:;@[\]^_`] 等特殊符號。
- 拼裝密碼串 → 寫入 B/D 欄 → 輸出文件:
- change_pass.sql:ALTER USER <user> IDENTIFIED BY <pwd>;
- change_pass.txt:user <user> : <pwd>
核心代碼片段(精簡版)
Sub GenOraclePass()
pass_length = 8: start_asc = 65: rnd_base = 25
Open "C:\change_pass.sql" For Output As #1
Print #1, "REM alter user apps identified by " & GenPwd() & ";"
row = 2
Do While Cells(row, 1) <> ""
pwd = GenPwd()
Print #1, "alter user " & Cells(row, 1) & " identified by " & pwd & ";"
Cells(row, 2) = pwd
row = row + 1
Loop
Close #1
End Sub
Function GenPwd() As String
Dim s As String, i As Long, c As Long
For i = 1 To pass_length
c = start_asc + Int(Rnd * rnd_base)
If c = 61 Then c = 62 ' 過濾 =
s = s & Chr(c)
Next
GenPwd = s
End Function
擴展與治理建議
- 密碼複雜度策略:參數化長度、字符集、必含類型(大小寫/數字/特殊符),生成後驗證合規。
- 審計留痕:生成文件自動加水印(生成時間/操作人/版本),歸檔加密存儲。
- 自動化執行:結合排程任務(Windows Task / Cron)定時推送
.sql 至目標庫執行,實現全流程無人值守。
- 通用性:同邏輯適用於 MySQL、PostgreSQL、SQL Server、Linux/Windows 本地賬號等任意系統。