微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NSIS 执行系统命令

如何解决NSIS 执行系统命令

我正在尝试使用 NSIS 脚本中的权限创建计划任务。

使用这个命令:

schtasks /create /ru "NT AUTHORITY\SYstem" /SC ONSTART /RL "HIGHEST" /TR "C:\Program Files (x86)\MyProgram\MyProgram.exe" /tn MyProgram.Kickstart

从具有特权的 cmd.exe 我设法做到了,但现在我需要让 NSIS 脚本做到这一点。 阅读文档和互联网我找到了这个命令:

;   ........
Section
    ExecShell "runas" "myprogram.bat"
SectionEnd
;   ........

其中“myprogram.bat”是包含命令的 bat,但我也尝试将 schtasks 放入其中。 目前似乎没有批处理运行,即使我有这个日志:

Processing script file: "C:\Foo\prova.nsis"
OutFile: "C:\Foo\testnsis.exe"
Section: "TestFST"
ExecShell: runas: "C:\Foo\kickstart.bat" "" 
SectionEnd 

如果我在 bat 中添加 2> kickstart.log 并在 NSIS 外执行它,我会按预期填充日志,但脚本中没有任何内容

还要考虑一下,为了简单和测试目的,我编写了一个从 powershell 启动的非常基本的脚本:

# Powershell
makensis.exe /O"C:\Foo\prova.log" "C:\Foo\prova.nsis"

; NSIS
OutFile "C:\Foo\testnsis.exe"

Section TestFST
    ExecShell "runas" "C:\Foo\kickstart.bat"
SectionEnd

我可能会遗漏一些东西,因为我对此完全陌生。 我错过了什么?

解决方法

你应该在任何地方使用完整路径。提升当前目录时通常设置为 system32 目录,2> kickstart.log 会在那里写入。

ExecShell 对我来说很好用:

Section
InitPluginsDir
FileOpen $0 "$PluginsDir\Test.cmd" w
FileWrite $0 "@echo off$\r$\n"
FileWrite $0 "echo Hello World$\r$\n"
FileWrite $0 'call whoami /groups | find "1-5-32-544"$\r$\n'
FileWrite $0 'echo Log test string > "%temp%\test.log"$\r$\n'
FileWrite $0 "ping -n 42 localhost > nul$\r$\n"
FileClose $0
ExecShell "runas" "$PluginsDir\Test.cmd"
SectionEnd

话虽如此,runas 动词有一些问题,如果您知道自己总是要执行高级任务,那么 your installer should also request elevation (RequestExecutionLevel Admin)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。