OEM安裝報錯不是內部或外部程式的解決過程

yangtingkun發表於2012-10-08

標題比較拗口,客戶在安裝OEM的時候碰到了“不是內部或外部命令,也不是可執行的程式或批處理檔案”的錯誤。

 

 

客戶環境是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)
at oracle.sysman.assistants.util.em.EMConfiguration.run(EMConfiguration.java:583)
at 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)
at 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環境下資料庫健壯性的問題。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-752041/,如需轉載,請註明出處,否則將追究法律責任。

相關文章