分享
 
 
 

一个生成Oracle用户密码的通用小程序

王朝oracle·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

做为Unix 系统管理员,Oracle 数据库管理员,Oracle ERP 应用系统管理员,需要不定期地更改各系统中重要用户的密码,以保证系统及数据的安全。

但是,由于所管理的小型机及数据库、应用系统较多,每月更改近百个用户的密码,不论是密码的生成,还是密码的更改,工作量均很大,尤其是密码的生成,为了加强安全性,密码不能太简单,最好为字母与数字的随机组合。但大量的密码,若不借助自动生成,则其编排是Oracle ERP 系统中应用系统用户(指各子系统的用户,非指具体应用用户)同时也是Oracle 数据库用户(如应收模块,用户为 AR,AR既是数据库用户,又是应用用户),而且,只有 applsyspub(登录系统的公用用户),applsys(应用基础用户),apps(具体应用操作用户)为必须为应用系统中密码与数据库密码一致外,其它应用的数据库用户密码可以与应用系统中密码中不一致,只需在对应用系统进行打 patch 工作时才需将其改为一致。因而,可在打 patch 前,在应用系统中将应用系统用户密码修改为与数据库一致即可,平时不用修改其密码,这样一则减少了工作量,二则加强了系统的安全性。

更改数据库用户密码可通过在 sqlplus 执行 alter user identified by 密码 的命令而实现,因而,可以通过自动生成密码脚本的方式,高效地完成密码的更改工作。而 Unix 用户密码则由于需由管理员负责更改密码的并不多,故可在自动生成后,手工进行修改。

为了生成较为复杂的密码,同时提高工作效率,我用 Excel 自带的 VBA 编写了一个小脚本,运行该程序,则自动生成一个更改用户密码的脚本,同时,将用户密码记录在工作表上,以便于打印出来,保存在密码本中,做为记录。

首先,需在工作表中第一列输入各个要修改密码的数据库用户的用户名,在第三列输入各

然后,运行脚本 gen_pass_oracle ,则自动生成Oracle 用户的相应的密码;运行脚本gen_pass_unix ,则自动生成unix 操作系统用户的相应的密码。 生成的Oracle 数据库用户密码保存在 change_pass.sql 中,可在 sqlplus 中调用该脚本。生成的Unix 用户密码保存在change_pass.txt 中,需手工逐个地更改密码。 可通过在程序首部修改 pass_length 的值的方法,确定生成的密码的长度;可通过在程序首部修改 start_asc 的方法,确定密码的组成 0-9,A-Z还是仅 A-Z其主要实现为:通过检查工作表中每一行第1列(或第3列)是否为空,判断是否结束密码生成工作。若非空,即有用户名,则进行循环,生成在程序头部定义的指定长度的密码串。密码串中的字符为通过起始字符的 ascii 值加上随机数产生的随机值得到的新的 ascii 值,再将其转换为字符型,并加入密码串中。当密码串的长度达到指定长度时,将其组合为一个sql 语句写入文件中,同时,在该行的第2列(或第4列)中写入该密码串。

同时,考虑到在 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(50) As String "用户名

dim pass_length as integer "定义生成的密码的长度

dim start_asc as integer " 定义从哪个字符开始生成

pass_length = 8 " 设定密码长度为 8 位

Rem start_asc = 48 " 设定密码从 0 开始

start_asc = 65 " 设定密码从 A 开始

rem 由于 Oracle 数据库用户密码不区分大小写,故,视所选择的起始字母,决定随机数

rnd_base = 90 - start_asc

?

rem 打开文件,用于输出生成的改密码的脚本

Open "c:change_pass.sql" For Output As #1

rem 同时,在工作表上记录相应的密码,以便打印出来备作为记录,此处为先写标题

Cells(1, 1) = "Username": Cells(1, 2) = "Password"

Cells(1, 3) = "Username": Cells(1, 4) = "Password"

rem 先生成 apps 的密码,但脚本中加上注释,因 apps密码必须与应用程序一起改

rem 先初始化密码串为空白

temp_str = ""

For bit_count = 1 To pass_length

char_value = start_asc + Int(Rnd(1) * rnd_base)

rem 此处为为防=号引起 excel 误认为是公式,从而程序出错。

If char_value = 61 Then

char_value = 62

End If

rem 组合成密码

temp_str = temp_str + Chr$(char_value)

Next bit_count

rem 将生成的 apps 密码输出到脚本文件

Print #1, "REM alter user apps" + " identified by " + temp_str + ";"

rem 同时,记录在工作表上

Cells(2, 3) = "APPS": Cells(2, 4) = temp_str

rem 需生成密码的用户名从 row_num 行开始

row_num = 2

rem 若第一列非空,则创建密码,否则退出

Do While Cells(row_num, 1) <> ""

temp_str = ""

For bit_count = 1 To pass_length

char_value = start_asc + Int(Rnd(1) * rnd_base)

If char_value = 61 Then

char_value = 62

End If

temp_str = temp_str + Chr$(char_value)

Next bit_count

Print #1, "alter user " + Cells(row_num, 1) + " identified by " + temp_str +

Cells(row_num, 2) = temp_str

rem 获取下一行

row_num = row_num + 1

Loop

rem 所有用户的密码已生成,关闭文件

Close #1

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(50) As String "用户名

dim pass_length as integer "定义生成的密码的长度

dim start_asc as integer " 定义从哪个字符开始生成

pass_length = 8

start_asc = 48 " 0

Rem start_asc = 65 " A

rem 由于 unix 密码支持大小写,故,视所选择的起始字母,决定随机数的范围,以确保

rnd_base = 122 - start_asc

?

rem 打开文件,用于输出生成的改密码的脚本

Open "c:change_pass.txt" For Output As #1

rem 同时,在工作表上记录相应的密码,以便打印出来备作为记录,此处为先写标题

Cells(1, 3) = "Username": Cells(1, 4) = "Password"

row_num = 2

rem 若第三列非空,则创建密码,否则退出

Do While Cells(row_num, 3) <> ""

temp_str = ""

For bit_count = 1 To pass_length

char_value = start_asc + Int(Rnd(1) * rnd_base)

rem 91-94 为 [ ] ^ _ `

rem 因不愿在unix 密码串中包含该类字符,故,通过减少已增大的计数器以保证密码的

长度,同时,不将其计入密码串中,以排除它们

If (char_value >= 58 And char_value <= 64) Or (char_value >= 91 And char_value <= 96) Then

bit_count = bit_count - 1

Else

temp_str = temp_str + Chr$(char_value)

End If

Next bit_count

Print #1, "user " + Cells(row_num, 1) + " : " + temp_str

Cells(row_num, 4) = temp_str

rem 获取下一行

row_num = row_num + 1

Loop

rem 所有用户的密码已生成,关闭文件

Close #1

End Sub

(T114)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有