客户环境是 11.2.0.1 for Windows 环境,以前配置过 OEM ,有一段时间没有使用,最近打算启用 OEM ,发现无法正常启动,尝试了多次后,只能将 OEM 清除掉。在卸载 OEM 并重新安装时,出现了这个错误。

详细的错误为:

Connecting to database using connect string (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=NODE)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DAISY))) in home E:\app\Administrator\product\11.2.0\dbhome_1 with user "SYS" role "SYSDBA".
connected to database.
sql to execute declare repos_pwd varchar2(30); view_user varchar2(30); view_user_pwd varchar2(30); view_user_acc_status varchar2(30); begin repos_pwd := ?; sysman.mgmt_view_priv.get_view_user(view_user); select account_status into view_user_acc_status from sys.dba_users where upper(username) = upper ( view_user ); IF view_user_acc_status like '%LOCKED%' THEN execute immediate 'alter user ' || view_user || ' account unlock'; END IF; IF view_user_acc_status like '%EXPIRED%' THEN sysman.mgmt_view_priv.set_view_user_creds ( repos_pwd ); sysman.mgmt_view_priv.GET_VIEW_USER_CREDS ( view_user, view_user_pwd ); execute immediate 'alter user ' || view_user || ' identified by ' || view_user_pwd || ''; END IF; end;
noOfParams to bind: 1.
sql execute successfully.

2012-9-24 18:59:05 oracle.sysman.emcp.util.PlatformInterface executeCommand
'??S-1-5-21-343818398-2147128839-1417001333-500'
不是内部或外部命令,也不是可运行的程序
或批处理文件。

2012-9-24 18:59:05 oracle.sysman.emcp.util.PlatformInterface executeCommand
配置 : 执行 CMD /C E:\app\Administrator\product\11.2.0\dbhome_1\sysman\admin\scripts\emca\emcaDbUtil.bat "E:\app\Administrator\product\11.2.0\dbhome_1\sysman\admin\scripts;E:\app\Administrator\product\11.2.0\dbhome_1\bin;" E:/app/Administrator/product/11.2.0/dbhome_1/perl/bin\perl.exe E:\app\Administrator\product\11.2.0\dbhome_1\sysman\admin\scripts\emca\emcaDbUtil.pl E:\app\Administrator\product\11.2.0\dbhome_1 "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=NODE)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DAISY)))" SYS SYSDBA declare repos_pwd varchar2(30); view_user varchar2(30); view_user_pwd varchar2(30); view_user_acc_status varchar2(30); begin repos_pwd := ?; sysman.mgmt_view_priv.get_view_user(view_user); select account_status into view_user_acc_status from sys.dba_users where upper(username) = upper ( view_user ); IF view_user_acc_status like '%LOCKED%' THEN execute immediate 'alter user ' || view_user || ' account unlock'; END IF; IF view_user_acc_status like '%EXPIRED%' THEN sysman.mgmt_view_priv.set_view_user_creds ( repos_pwd ); sysman.mgmt_view_priv.GET_VIEW_USER_CREDS ( view_user, view_user_pwd ); execute immediate 'alter user ' || view_user || ' identified by ' || view_user_pwd || ''; END IF; end; DAISY 1 SYSMAN_PWD 时出错
2012-9-24 18:59:05 oracle.sysman.emcp.EMReposConfig unlockMGMTAccount
配置 : Failed to unlock mgmt_view account
2012-9-24 18:59:05 oracle.sysman.emcp.EMReposConfig invoke
严重 : 无法对所有 EM 相关帐户解锁

2012-9-24 18:59:05 oracle.sysman.emcp.EMConfig perform
严重 : 无法对所有 EM 相关帐户解锁
有关详细资料 , 请参阅 E:\app\Administrator\cfgtoollogs\dbca\DAISY\emConfig.log 中的日志文件。
2012-9-24 18:59:05 oracle.sysman.emcp.EMConfig perform
配置 : Stack Trace:
oracle.sysman.emcp.exception.EMConfigException:
无法对所有 EM 相关帐户解锁

at oracle.sysman.emcp.EMReposConfig.invoke(EMReposConfig.java:349)
at oracle.sysman.emcp.EMReposConfig.invoke(EMReposConfig.java:158)
at oracle.sysman.emcp.EMConfig.perform(EMConfig.java:253)
oracle.sysman.assistants.util.em.EMConfiguration.run(EMConfiguration.java:583)
oracle.sysman.assistants.dbca.backend.PostDBCreationStep.executeImpl(PostDBCreationStep.java:968)
at oracle.sysman.assistants.util.step.BasicStep.execute(BasicStep.java:210)
at oracle.sysman.assistants.util.step.Step.execute(Step.java:140)
oracle.sysman.assistants.util.step.StepContext$ModeRunner.run(StepContext.java:2667)
at java.lang.Thread.run(Thread.java:595)
2012-9-24 18:59:05 oracle.sysman.emcp.EMConfig restoreOuiLoc
配置 : Restoring oracle.installer.oui_loc to E:\app\Administrator\product\11.2.0\dbhome_1\oui

本来最先定位的是 Oracle 的异常“无法对所有 EM 相关帐户解锁”,前台出现的也是这个错误信息。但是在 MOS 找了大量的案例,发现都和当前的问题不符。仔细检查数据库中用户的配置,也未发现任何的异常。

随后把疑点逐渐转移到上面“不是内部或外部命令,也不是可运行的程序或批处理文件。”信息上。并且发现这个问题并非只有在执行 OEM 的脚本时报错,而是起动 CMD 命令窗口时都会出现这个错误。

那么其实问题就很明显了,导致问题的原因并不是发生在数据库层,而是操作系统层面,显然 CMD 命令被进行了恶意的篡改。

详细询问了一下情况,客户以前确实中过病毒,后来通过杀毒已经将病毒清除。怀疑虽然病毒被清除,但是 CMD 程序并没有完全恢复原始状态,导致目前启动 CMD 时会寻找一个不存在的文件。

检查 CMD 命令的注册表信息,并未发现有异常的修改。怀疑是 CMD 代码层的 autorun 被修改:

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /v "AutoRun" /d "" /f

通过执行上面的命令, CMD 启动不会在出现前面的错误,再次安装 OEM 组件,安装顺利完成。

这个案例也再次反映了 Windows 环境下数据库健壮性的问题。

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员