【发布时间】:2017-02-06 20:56:57
【问题描述】:
我有一个我编写的 VBScript,效果很好!当我从 Windows 10 中的命令行运行它时,它可以完美地完成我需要它的一切。
cscript.exe "C:\SetupTempPath\MyScript.vbs" "First Param" 1234 "Third Param"
由于某种原因,当我在我的 Inno 设置脚本中使用它时...
Filename: "{sys}\cscript.exe"; \
Parameters: """{tmp}\MyScript.vbs"" ""{code:GetStringValue}"" {#PORT} ""{#NAME}"""; \
Description: "Set port to {#PORT}."; \
StatusMsg: "Setting the port to {#PORT}."; \
Tasks: setPortNumber; \
Check: SetTcpPort({#PORT});
当我在调试模式下运行安装程序时,它会显示以下内容...
[12:37:45.377] -- Run entry --
[12:37:45.378] Run as: Current user
[12:37:45.380] Type: Exec
[12:37:45.381] Filename: C:\WINDOWS\system32\cscript.exe
[12:37:45.425] Parameters: "C:\SetupTempPath\MyScript.vbs" "First Param" 1234 "Third Param"
[12:38:04.987] Process exit code: 0
[12:38:04.995] Need to restart Windows? No
[12:38:06.944] Deinitializing Setup.
[12:38:06.997] *** Setup exit code: 0
如您所见,一切都从代码函数以及定义的 Inno Setup 常量(定义)中成功解决。
我最终在 VBScript 中放置了一堆 MsgBox 行来检查状态并查看何时出错。我最终发现了它有问题的 VBScript 部分(仅在从 Inno Setup 运行时)所以我调整了脚本以解决一些错误控制,这是结果...
Set wmiComputer = GetObject(wmiObjectQuery)
Set tcpProperties = wmiComputer.ExecQuery(wmiQuery)
MsgBox "Break! Count: " & tcpProperties.Count
If Err.Number <> 0 Then
MsgBox "Query returned no results.", 0, "Port not changed!"
WScript.Quit
End If
一步一步来,一切都是一样的。 wmiObjectQuery 字符串是一样的,我创建的 wmiQuery 是一样的。除了ONE,我没有发现任何差异。当ExecQuery() 被调用并且我从命令提示符运行它时(安装程序正在等待我关闭它),它返回TWO 记录。另一方面,当我让 setup 尝试运行它时,最终会触发错误控制,因为 tcpProperties.Count 失败(由于未设置 tcpProperties)。
所以我的问题是,为什么它可以从命令提示符而不是 Inno Setup 脚本完美运行?
【问题讨论】:
-
会不会是在 Inno Setup 中运行脚本的安全上下文有区别?
-
我不确定你的意思。对我而言,如果我从 UserA 的登录名中同时运行设置应用程序和命令提示符,那么就安全性而言,应该使用相同的权限。
-
不一定,通过 elevated 命令提示自行运行它可能与 Inno Setup 执行当前用户上下文的方式完全不同。因此,通常可以工作的 WMI 命令可能会失败,因为 似乎 正在这里发生。
-
我没有提升任何东西。另外,我关闭了UAC。我只需双击 Setup 应用程序,就像双击 cmd.exe 应用程序一样。
-
好的,但是从您问题的日志中它指向权限/上下文问题。我不建议直接取消它,因为您认为这不是问题。 UAC 在更高版本的 Windows 中从未完全关闭,仍然认为问题出在程序运行的上下文中。
标签: vbscript inno-setup