首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSIS执行系统命令

NSIS执行系统命令
EN

Stack Overflow用户
提问于 2021-06-23 21:58:49
回答 1查看 72关注 0票数 0

我正在尝试在我的NSIS脚本中创建一个具有权限的计划任务。

使用以下命令:

代码语言:javascript
复制
schtasks /create /ru "NT AUTHORITY\SYSTEM" /SC ONSTART /RL "HIGHEST" /TR "C:\Program Files (x86)\MyProgram\MyProgram.exe" /tn MyProgram.Kickstart

在具有权限的cmd.exe上,我设法做到了这一点,但现在我需要让NSIS脚本来完成这项工作。在阅读文档和互联网时,我发现了这个命令:

代码语言:javascript
复制
;   ........
Section
    ExecShell "runas" "myprogram.bat"
SectionEnd
;   ........

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

代码语言:javascript
复制
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启动的非常基本的脚本:

代码语言:javascript
复制
# 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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-23 22:49:14

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

ExecShell对我来说很好用:

代码语言:javascript
复制
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)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68101327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档