InstallShield LaunchAppAndWait nltest

时间:2018-10-22 14:32:47

标签: command-line installshield

我需要在安装过程中找出域用户输入的域控制器名称。 在命令行中,我可以使用命令“ nltest / dcname:”

当试图在installshield脚本中使用它时,我遇到了各种各样的问题。

我尝试过这个拳头:

strCmdLine = "/C \"nltest /dcname:" + strDomain + " \" > output.txt"; LaunchAppAndWait("cmd.exe", strCmdLine, LAAW_OPTION_WAIT | LAAW_OPTION_SHOW_HOURGLASS | LAAW_OPTION_HIDDEN);

output.txt文件已创建,但为空。

我也尝试使用LAAW_SHELLEXECUTEVERB = "runas";

接下来我尝试了这个:

strCmdLine = "/C \"c:\\Windows\\System32\\nltest.exe /dcname:" + strDomain + "\""; LaunchApplication("c:\\Windows\\System32\\cmd.exe", strCmdLine, "C:\\Windows\\System32\\", SW_NORMAL, INFINITE, LAAW_OPTION_WAIT | LAAW_OPTION_USE_SHELLEXECUTE)

我收到错误'c:\Windows\System32\nltest.exe' is not recognized as an internal or external command, operable program or batch file.,不知道为什么。

我尝试了所有不同LaunchApp命令,转义符号和引号的所有组合,但是都没有成功...任何想法如何成功存储nltest的输出?

2 个答案:

答案 0 :(得分:0)

这是否必须在安装过程中完成,还是可以在安装后在应用程序启动时进行?


Win32 :对该EXE进行快速依赖项扫描会发现许多Win32函数和托管API,这些函数和托管API可以在 {{1} } NTDSAPI.dll

一些文档可以在这里找到:

更多功能:


备用托管API LOGONCLI.DLL


从C ++ dll或Installscript调用这些Win32函数应该相对容易。

快速建议 :我不想花费大量时间使用C风格的API(这可能要花费数小时),而是喜欢为{{3} }。那只是我看到的第一件事,根本没有任何意义。如果您看的话应该会更好。

答案 1 :(得分:0)

虽然寻找API而不是EXE的建议是好的,但这并不能回答您的问题。我将从第2部分开始:为什么找不到nltest.exe?

因为至少在这里像我的64位系统一样,nltest.exe仅驻留在(64位)System32文件夹中。它不驻留在(32位)SysWOW64文件夹中。由于InstallScript引擎是32位进程,因此所有引用C:\ Windows \ System32的尝试都将重定向到C:\ Windows \ SysWOW64。您可以在命令行中通过启动C:\ Windows \ SysWOW64 \ cmd.exe(32位命令提示符)并在其中键入命令来测试该理论。

您可以解决以下两种方法之一:Disable / Enable(WOW64FSREDIRECTION)允许WINSYSDIR64表示正确的内容,或用Sysnative替代System32。硬编码路径。请注意,后者只能由32位进程在64位操作系统上使用,否则Sysnative只是缺少的文件夹。相比之下,在32位系统上,Disable / Enable(WOW64FSREDIRECTION)调用不应执行任何操作。

回到第1部分,为什么它创建一个空的output.txt文件?只是cmd的重定向处理调用如何工作的神奇之处。首先,它创建文件并将其挂钩到将要创建的过程的输出。然后(按上述)它无法启动该进程,因此未添加任何内容。最后,由于仅重定向了stdout并且隐藏了窗口,因此无法通知您该错误。