我需要在安装过程中找出域用户输入的域控制器名称。 在命令行中,我可以使用命令“ 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的输出?
答案 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并且隐藏了窗口,因此无法通知您该错误。