如何通过程序方式解密EBS系统用户密码

此方法已经通过测试,且是借鉴行内前辈的方式,表示感谢,同时需要注意,此程序在公司正式环境中严禁使用,会带来安全问题:
—将以下代码编译至目标系统—-
CREATE OR REPLACE PACKAGE cux_fnd_web_sec AUTHID CURRENT_USER AS
FUNCTION encrypt(key IN VARCHAR2, VALUE IN VARCHAR2) RETURN VARCHAR2;
FUNCTION decrypt(key IN VARCHAR2, VALUE IN VARCHAR2) RETURN VARCHAR2;
END;
/
CREATE OR REPLACE PACKAGE BODY cux_fnd_web_sec AS
FUNCTION encrypt(key IN VARCHAR2, VALUE IN VARCHAR2) RETURN VARCHAR2 AS
LANGUAGE JAVA NAME ‘oracle.apps.fnd.security.WEBSessionManagerProc.encrypt(java.lang.String,java.lang.String) return java.lang.String’;
FUNCTION decrypt(key IN VARCHAR2, VALUE IN VARCHAR2) RETURN VARCHAR2 AS
LANGUAGE JAVA NAME ‘oracle.apps.fnd.security.WebSessionManagerProc.decrypt(java.lang.String,java.lang.String) return java.lang.String’;
END;
/

—查询出密匙—

SELECT user_name,
cux_fnd_web_sec.decrypt(upper(‘apps_uat_xx’), ENCRYPTED_USER_PASSWORD) pwd,
END_DATE
FROM APPS.fnd_user
where user_name = upper(‘xxxx’);

SELECT usr.encrypted_user_password
FROM fnd_user usr
WHERE usr.user_name = ‘TEST’
—返回明文,将查询出的结果作为条件带入下面SQL命令—
SELECT cux_fnd_web_sec.decrypt(‘APPS’, ‘ZH226036FE93A20FAED89C4B92838B7C2A7F7133E613B028C482354D32F3C471AAB024794EAC70570FD2443717865F7BA824’)
FROM dual;
结果为: TEST

—批量获取,ORACLE为apps用户密码
declare
l_info varchar2(10000);
cursor user_info is
SELECT usr.user_name, usr.encrypted_user_password
FROM fnd_user usr
where 1 = 1
and to_char(usr.start_date, ‘yyyy’) >= ‘2012’
order by usr.creation_date asc;
begin
for c1 in user_info loop
l_info := cux_fnd_web_sec.decrypt(‘ORACLE’, c1.encrypted_user_password);
dbms_output.put_line(‘用户名:’ || c1.user_name || ‘ 密码:’ || l_info);
end loop;
end;

 

–后台重置密码
DECLARE
v_user_name    VARCHAR2(30) := UPPER(‘test01’);
v_new_password VARCHAR2(30) := ‘test01’;
v_status       BOOLEAN;
BEGIN
v_status := fnd_user_pkg.ChangePassword(username    => v_user_name,
newpassword => v_new_password);
IF v_status = TRUE THEN
dbms_output.put_line(‘The password reset successfully for the User:’ ||
v_user_name);
COMMIT;
ELSE
DBMS_OUTPUT.put_line(‘Unable to reset password due to’ || SQLCODE || ‘ ‘ ||
SUBSTR(SQLERRM, 1, 100));
ROLLBACK;
END IF;
END;

–直接初始化

DECLARE
P_USER_NAME FND_USER.USER_NAME%TYPE;
P_INIT_PASSWORD VARCHAR2(30);—初始化密码,非加密的。

l_change_flag VARCHAR2(10);
l_reason varchar2(2000);
BEGIN
—输入参数(用户名和初始化的密码)
P_USER_NAME := ‘SYSADMIN’;
P_INIT_PASSWORD := ‘sinosoft123’;

———
—处理–
L_change_FLAG := fnd_web_sec.change_password(P_USER_NAME,P_INIT_PASSWORD);

IF L_change_FLAG = ‘Y’ THEN
— Bug 7016473 – During an administrative reset, set the last_logon_date to NULL
— instead of SYSDATE. last_logon_date should reflect the date the user last
— logged in successfully, not the date the user’s password was reset.
— This does not regress the fix for bug 4690441 because in fnd_web_sec.disable_user
— if last_logon_date is NULL, the last_update_date will be used which is the same
— date of the sysadmin reset, so the effect is the same.

— Reset password_date field to null to force password
— expiration the next time user logs on.

UPDATE FND_USER
SET last_logon_date= NULL
,password_date = NULL
–,LAST_UPDATE_DATE = SYSDATE
–,LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID
WHERE USER_NAME = P_USER_NAME;

COMMIT;
—-
DBMS_OUTPUT.PUT_LINE(‘成功初始化用户(‘||P_USER_NAME||’)的密码为:’||P_INIT_PASSWORD);
ELSE
—显示为什么不可以修改
l_reason := fnd_message.get;
fnd_message.set_name(‘FND’, ‘FND_CHANGE_PASSWORD_FAILED’);
fnd_message.set_token(‘USER_NAME’, P_USER_NAME);
fnd_message.set_token(‘REASON’, l_reason);
app_exception.raise_exception;
END IF;
END;

Report开发取责任ID问题

   在oracle EBS的report客户化开发中,fnd_profile.value('RESP_ID')无效,百思不解。后研究发现,在report中使用fnd_profile.value的oracle标准方法:
   1. 添加用户参数p_conc_request_id;
   2. 在BeforeReport和AfterReport两个report trigger中,添加srw.user_exit('FND SRWEXIT')即可在report中正常使用fnd_profile.value;

编译EBS R12 Form是出现ksh: frmcmp_batch: not found错误解决方法

    编译EBS R12 Form是出现以下错误:ksh: frmcmp_batch: not found.
    通过env|grep ORACLE_HOME查看,里面的环境变量是否有ORACLE_HOME,如果没有,则可以确定是导致此问题出现的原因。编辑".profile"文件,具体如下:
    vi  .profile 加入以下内容:". /u01/TEST/apps/apps_st/appl/APPSTMPPROD_test.env”,
再次通过命令"env|grep ORACLE_HOME"可以看到ORACLE_HOME=/u01/TEST/apps/tech_st/10.1.2
最后再次通过Form编译命令编译相关Form,成功!

Oracle EBS Form编译命令

    Oracle Form在Oracle EBS系统中占有非常重要的作用,作为技术顾问,首先得了解如何编译form文件。这里贴出对R12和11i版form编译命令,具体如下:

    Oracle EBS R12 编译命令:

      frmcmp_batch  $AU_TOP/forms/ZHS/test.fmb apps/apps output_file=$CUX_TOP/forms/ZHS/test.fmx

    Oracle EBS 11i 编译命令:
      f60gen module=test.fmb userid=apps/apps output_file=/ora1159/prod/prodappl/pa/11.5.0/forms/US/test.fmx

命令解释:
  1. 要能应用frmcmp_batch命令,首先得保证系统环境变量设置正确,特别是ORACLE_HOME环境变量的正确性;

  2. Form编译命令一定要在Form文件所在的目录下执行,否则虽然编译命令会执行,但是并不能正确生产fmx文件,也就无法正确 使用该表单;

  3. 一般客户化的Form编译后的fmx文件都存放在$CUX_TOP相应的目录下,因此建议相关项目人员在系统搭建好的第一时间设置好客户化环境,这对客户化工作非常有必要;

  4. 目前EBS 11i逐渐升级或者替代为R12,但是掌握11iform的编译还是很有必要。

查看form最新版本时间:
cd $AU_TOP/forms/ZHS
ls -l –time-style=full test.fmb

Oracle EBS更改标准财务三大报表

    (以前的日志摘录)最近遇到一个很头疼的事情,客户马上要接受保监会的验收,但是他们对Oracle EBS系统中的财务三大报表的格式不满意。我们项目组考虑在很短的时间内要写出三个报表,是要花费大量精力的,同时现在考虑到人力有限,所以,我们商量在标准报表的基础上修改,看客户能否接受。
        修改标准的FSG模板真不好弄,里面的代码我们是看不到的,要控制格式只能通过不断的对FSG定义上和利用FSG标准模板上的窗体域写入代码来尝试。千回百转,当我们第一次将雏形打印出来拿给客户看的时候,客户说可以接受。由于工作原因,项目经理去另一个项目上去,剩下我一个人在客户公司,客户最近不断地要求我更改格式,主要遇到以下几个问题:
    1.  标准的“发布 FSG 报表”本身是不带边框的,客户要求对报表的每一项都要用边框;
    2.  标准的三大财务报表(损益表、资产负债表、现金流量表)的项目条目中有不带数值的行,客户需要不带数值的行也要有边框;
    3.  标准的FSG报表的输出数值只能超过千位的数字有标示位".00",客户需要所有数值都要有".00"标示,比如,1034,332,32.00   230.00  1.00的格式;
    4.  列名需要加粗黑体并且居中
    大体上就上面四个要求,刚听到客户提这些需求的时候,我还觉得很简单的,我们项目经理说这个可能不好弄。在确定用更改标准FSG模板的前提下,从服务器上下载模板名为“FSGXML 基本模板”的模板,开始着手更改。
    对要求1,我们在标准模板的相应地方加上边框,更新模板(这时发现此模板不能更新,于是终止此模板,重新定义新的模板),将加上边框后的模板上传至新定义的模板上,跑请求看结果。效果是这样的,整个正文内容部分是加上了边框,但是对没有数值的地方,边框不会自动添加,就显示出“缺省”的地方,十分不美观,客户也不能接受。之前我是这样解决的,对原来不需要显示的地方用"0"填充或者用多项的和填充,的确这样做了以后,不再用空缺的行,相对之前是好看了许多,于是我打印出来给客户看这部分的效果,客户说:“这个样子改比之前那种“缺省”的外观来说是好美观了,但是却犯了一个原则的性才错误,比如资产负债表中,第一行是项目,按照你的做法是将项目这行的数值设为所有的条目的和(我自己以为是正确的),但是保监会要求的不会有这样的显示,项目这行在任何情况下都是不能有数值的。”于是重新思考方式来满足要求1。因为不是客户化的功能,很难从细节上控制格式,万般无奈的时候,我试着将整个表格外面再加一层表格,上传测试,奇迹般的在“缺省的”地方竟然加上了外边框。这间单元格的边框线目前未能解决,客户已经接受此部分的修改。
    对要求2的解决方法在第一步已经顺带解决,在解决这个要求的时候,对FSG的定义一定要很熟悉,这对格式的修改非常重要,一个空格,对少缩进,都需通过设置设定,同时目前报表列头采用的是左对齐,且用trim()函数去掉空格。
    对要求3,我咨询过老的功能顾问,他说这个系统默认对千位以上的数字会自动加上,如果客户实在要将千位以下的数字也显示成那样的效果,可以在定义FSG报表的时候,在定义列集的时候,有个数字格式,在里面加上任意一个字符即可,但是这个字符会在报表中显示出来,于是经过测试,的确是这样,但是沟通后客户不同意这样做,于是继续找方法,对定义FSG报表任何一个选项都反复测试,发现在定义行集的时候,在显示选项中,有个系数设置,感觉像是控制此问题的,但是结果不是,目前还在寻找方法。
    对要求4,正寻找方法中……    
    未完待续……
最后还是完美解决。

技术笔记(小潘的技术记录博客)