熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

一個生成Oracle用戶密碼的通用小程序

2013-11-13 16:14:52  來源: Oracle 

  做為Unix 系統管理員Oracle 數據庫管理員Oracle ERP 應用系統管理員需要不定期地更改各系統中重要用戶的密碼以保證系統及數據的安全
  但是由於所管理的小型機及數據庫應用系統較多每月更改近百個用戶的密碼不論是密碼的生成還是密碼的更改工作量均很大尤其是密碼的生成為了加強安全性密碼不能太簡單最好為字母與數字的隨機組合但大量的密碼若不借助自動生成則其編排是十分困難的
  Oracle ERP 系統中應用系統用戶(指各子系統的用戶非指具體應用用戶)同時也是Oracle 數據庫用戶(如應收模塊用戶為 ARAR既是數據庫用戶又是應用用戶)而且只有 applsyspub(登錄系統的公用用戶)applsys(應用基礎用戶)apps(具體應用操作用戶)為必須為應用系統中密碼與數據庫密碼一致外其它應用的數據庫用戶密碼可以與應用系統中密碼中不一致只需在對應用系統進行打 patch 工作時才需將其改為一致因而可在打 patch 前在應用系統中將應用系統用戶密碼修改為與數據庫一致即可平時不用修改其密碼這樣一則減少了工作量二則加強了系統的安全性
  更改數據庫用戶密碼可通過在 sqlplus 執行 alter user identified by 密碼 的命令而實現因而可以通過自動生成密碼腳本的方式高效地完成密碼的更改工作而 Unix 用戶密碼則由於需由管理員負責更改密碼的並不多故可在自動生成後手工進行修改
  為了生成較為復雜的密碼同時提高工作效率我用 Excel 自帶的 VBA 編寫了一個小腳本運行該程序則自動生成一個更改用戶密碼的腳本同時將用戶密碼記錄在工作表上以便於打印出來保存在密碼本中做為記錄
  首先需在工作表中第一列輸入各個要修改密碼的數據庫用戶的用戶名在第三列輸入各個要更改密碼的操作系統用戶的用戶名
  然後運行腳本 gen_pass_oracle 則自動生成Oracle 用戶的相應的密碼運行腳本 gen_pass_unix 則自動生成unix 操作系統用戶的相應的密碼
  生成的Oracle 數據庫用戶密碼保存在 change_passsql 中可在 sqlplus 中調用該腳本迅速完成密碼的修改工作
  生成的Unix 用戶密碼保存在 change_passtxt 中需手工逐個地更改密碼
  可通過在程序首部修改 pass_length 的值的方法確定生成的密碼的長度可通過在程序首部修改 start_asc 的方法確定密碼的組成 AZ還是僅 AZ
  其主要實現為通過檢查工作表中每一行第列(或第列)是否為空判斷是否結束密碼生成工作若非空即有用戶名則進行循環生成在程序頭部定義的指定長度的密碼串密碼串中的字符為通過起始字符的 ascii 值加上隨機數產生的隨機值得到的新的 ascii 值再將其轉換為字符型並加入密碼串中當密碼串的長度達到指定長度時將其組合為一個 sql 語句寫入文件中同時在該行的第列(或第列)中寫入該密碼串
  同時考慮到在 Excel 中會將=開頭的字符串當作公式對待在生成密碼串時將等於=的ascii 值過濾用類似方法可使生成的密碼串中不包含其它不想包含的字符
  通過使用這種方式生成並修改密碼的工作量得到大大減少安全性得到提高
  實際上這種方法產生的密碼不限於 unix 與 Oracle 可用於各種操作系統中重要用戶的密碼的生成及各種數據庫應用系統的用戶密碼生成
  Sub gen_pass_app()
  Dim bit_count as integer 循環變量 密碼中位數計數器
  dim row_num as integer 需生成密碼的用戶名信息開始的行號
  dim rnd_base As Integer 隨機數種子
  Dim char_value As Integer 密碼中每個字符的 ascii 值
  Dim temp_str As String 密碼串
  Dim username() As String 用戶名
  dim pass_length as integer 定義生成的密碼的長度
  dim start_asc as integer 定義從哪個字符開始生成
  pass_length = 設定密碼長度為
  Rem start_asc = 設定密碼從 開始
  start_asc = 設定密碼從 A 開始
  rem 由於 Oracle 數據庫用戶密碼不區分大小寫視所選擇的起始字母決定隨機數的范圍以確保至 Z 結束
  rnd_base = start_asc
  
  rem 打開文件用於輸出生成的改密碼的腳本
  Open c:\change_passsql For Output As #
  rem 同時在工作表上記錄相應的密碼以便打印出來備作為記錄此處為先寫標題
  Cells( ) = Username: Cells( ) = Password
  Cells( ) = Username: Cells( ) = Password
  rem 先生成 apps 的密碼但腳本中加上注釋因 apps密碼必須與應用程序一起改
  rem 先初始化密碼串為空白
  temp_str =
  For bit_count = To pass_length
  char_value = start_asc + Int(Rnd() * rnd_base)
  rem 此處為為防=號引起 excel 誤認為是公式從而程序出錯
  If char_value = Then
  char_value =
  End If
  rem 組合成密碼
  temp_str = temp_str + Chr$(char_value)
  Next bit_count
  rem 將生成的 apps 密碼輸出到腳本文件
  Print # REM alter user apps + identified by + temp_str + ;
  rem 同時記錄在工作表上
  Cells( ) = APPS: Cells( ) = temp_str
  rem 需生成密碼的用戶名從 row_num 行開始
  row_num =
  rem 若第一列非空則創建密碼否則退出
  Do While Cells(row_num ) <>
  temp_str =
  For bit_count = To pass_length
  char_value = start_asc + Int(Rnd() * rnd_base)
  If char_value = Then
  char_value =
  End If
  temp_str = temp_str + Chr$(char_value)
  Next bit_count
  Print # alter user + Cells(row_num ) + identified by + temp_str + ;
  Cells(row_num ) = temp_str
  rem 獲取下一行
  row_num = row_num +
  Loop
  rem 所有用戶的密碼已生成關閉文件
  Close #
  End Sub
  
  Sub gen_pass_unix()
  Dim bit_count as integer 循環變量 密碼中位數計數器
  dim row_num as integer 需生成密碼的用戶名信息開始的行號
  dim rnd_base As Integer 隨機數種子
  Dim char_value As Integer 密碼中每個字符的 ascii 值
  Dim temp_str As String 密碼串
  Dim username() As String 用戶名
  dim pass_length as integer 定義生成的密碼的長度
  dim start_asc as integer 定義從哪個字符開始生成
  pass_length =
  start_asc =
  Rem start_asc = A
  rem 由於 unix 密碼支持大小寫視所選擇的起始字母決定隨機數的范圍以確保至 z 結束
  rnd_base = start_asc
  
  rem 打開文件用於輸出生成的改密碼的腳本
  Open c:\change_passtxt For Output As #
  rem 同時在工作表上記錄相應的密碼以便打印出來備作為記錄此處為先寫標題
  Cells( ) = Username: Cells( ) = Password
  row_num =
  rem 若第三列非空則創建密碼否則退出
  Do While Cells(row_num ) <>
  temp_str =
  For bit_count = To pass_length
  char_value = start_asc + Int(Rnd() * rnd_base)
  rem 為 : ; < = > ? @
  rem 為 [ \ ] ^ _ `
  rem 因不願在unix 密碼串中包含該類字符通過減少已增大的計數器以保證密碼的長度同時不將其計入密碼串中以排除它們
  If (char_value >= And char_value <= ) Or (char_value >= And char_value <= ) Then
  bit_count = bit_count
  Else
  temp_str = temp_str + Chr$(char_value)
  End If
  Next bit_count
  Print # user + Cells(row_num ) + : + temp_str
  Cells(row_num ) = temp_str
  rem 獲取下一行
  row_num = row_num +
  Loop
  rem 所有用戶的密碼已生成關閉文件
  Close #
  End Sub

From:http://tw.wingwit.com/Article/program/Oracle/201311/18021.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.