2013-06-26 195 views
0

我們的安裝程序使用jdk keytool生成密鑰庫。我們最近升級到了jdk 7,從那時起,它就出現了32/64位集成的問題,特別是試圖在64位服務器上安裝32位版本(不要問我們爲什麼要這樣做;我已經失去了這場戰鬥)。問題是,試圖從安裝程序運行keytool時,它無法生成一個密鑰存儲,並引發了錯誤堆棧跟蹤使用NSIS在64位服務器上運行32位java keytool

java.lang.InternalError: Should not get here.

前幾行:

 at sun.nio.fs.WindowsNativeDispatcher.GetFinalPathNameByHandle(Native Method) 
    at sun.nio.fs.WindowsLinkSupport.getFinalPath(WindowsLinkSupport.java:77) 
    at sun.nio.fs.WindowsLinkSupport.getRealPath(WindowsLinkSupport.java:242) 
    at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:836) 
    at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:44) 

跑這條線:

nsExec::ExecToLog '"$InstallationRoot\$ConfigName\jdk\bin\keytool.exe" -genkey -keystore "$InstallationRoot\$ConfigName\tomcat\tomcat.jks" -alias tomcat -keyalg RSA -validity 109500 -storepass password -keypass password -dname CN=$server,OU=Syseng,O=Company,L=City,ST=State,C=US' 

這些變量都是有效的,並在整個安裝程序中使用。我嘗試了一個DetailPrint來輸出它正在運行的確切的行,然後將輸出複製並粘貼到命令行,它工作。

"C:\TempInstallDir\Inst1\jdk\bin\keytool.exe" -genkey -keystore "C:\TempInstallDir\Inst1\tomcat\tomcat.jks" -alias tomcat -keyalg RSA -validity 109500 -storepass password -keypass password -dname CN=SANDBOX,OU=Syseng,O=Company,L=City,ST=State,C=US 
  • 我也嘗試過使用ExecExecWait,萬一有一些古怪與nsExec
  • 我嘗試將keytool命令寫入批處理文件,然後從安裝程序調用該文件。再說一遍,無論安裝程序是如何調用的,它都會給出相同的異常,但如果我只是轉到命令行並運行相同的批處理文件,它就會起作用。
  • 我試着用%WINDIR%\SysWOW64\cmd.exe /C強制它在32位命令提示符下運行。

我基本上的想法在這裏 - 我可以可靠地使其在安裝程序運行它失敗,並可靠地使其通過直接在命令行中運行相同的指令工作。它也可以在32位服務器上正常運行,或者在64位服務器上運行64位安裝程序。

另外,我以管理員身份運行安裝程序;否則還有其他步驟將失敗。這在Windows Server 2008 R2和Windows 7上都會發生。

有沒有人看到這個?如果是這樣,解決方法是什麼(除了使用64位安裝)?另一方面,如果真的沒有解決辦法,我們必須使用64位,那麼這會給我多一點彈藥來重新提高它。

回答

1

嗯可能有各種原因。很難說沒有調試。一些提示:

  • 嘗試運行在管理安裝程序(升高)/用戶(未升高)模式

  • 嘗試運行在管理的CMD(命令行)(升高)/用戶(非高架)模式

  • 嘗試調用之前設置工作目錄nsExec :: ExecToLog

  • 嘗試設置SetShellVarContext當前|所有

  • 嘗試改變SetRegView 32 | 64 | LASTUSED

我的第一個賭注是cmd.exe的(命令行)從NSIS發起從CMD直接從Windows推出不同。

當您手動運行cmd(成功)時,它將從哪個目錄啓動?它是一個32位的過程(可以在任務管理器 - http://www.heckler.com.br/blog/2010/03/16/how-to-open-a-64bit-command-prompt-from-a-32bit-application/)或64位?

+0

最後一個提示:嘗試使用ExecShell來執行批處理文件,它應該調用Windows資源管理器,該文件夾完全按照(手動)加載文件。 – Slappy

+0

你的第一個賭注是對的。儘管我以管理員身份運行安裝程序(右鍵單擊,以管理員身份運行),但NSIS卻沒有管理員權限啓動子進程。添加RequestExecutionLevel最高解決了這個問題。有趣的是,這個_僅僅發生在Windows 7/2008 R2上。我們的大多數服務器仍然是2008 R1,並且它在那裏工作,這就是爲什麼該問題從未出現過。謝謝。 – ChicagoRedSox

相關問題