2013-06-26 58 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

相关问题