我有以下NSIS(.nsi)脚本将PowerShell脚本包装到exe。
此外,我希望exe以管理员身份运行,因为脚本需要更新注册表项。
NSIS脚本是:
!include x64.nsh
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)
OutFile "file.exe"
SilentInstall silent
Section
SetOutPath $EXEDIR
File "file.ps1"
# Run the script to update
ExecWait "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File .\file.ps1"
SectionEnd
Function .onInstSuccess
Delete "file.ps1"
FunctionEnd
PowerShell脚本是:
$registryPath = "HKLM:\SOFTWARE\Test"
$Name = "keyName"
$value = "keyValue"
$preRegVer = (Get-ItemProperty $registryPath).Version
#log "Pre registry value: $preRegVer"
If(!(Test-Path $registryPath))
{
# log "Path does not exist"
New-Item -Path $registryPath -Force | Out-Null
# log "Path created"
New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force | Out-Null
# log "Value created"
}
Else {
# log "Path exist"
$val = Get-ItemProperty -Path $registryPath
if($val.Version -eq $null)
{
# log "Value does not exist"
New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force | Out-Null
# log "Value created"
}
Else {
# log "Value exist"
Remove-ItemProperty -path $registryPath -Name Version -Force
# log "Value removed"
New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force | Out-Null
# log "Value created"
}
}
当我运行.exe文件时,它会要求提升权限,但不会更新密钥。
我知道powershell脚本有效,因为我使用PowerGUI将其编译为exe,并更新了密钥。
只有PowerGUI的问题在于它没有以管理员身份运行的选项。
答案 0 :(得分:1)
我怀疑你是在64位计算机上运行而且与位数有冲突。
没有试过这个,但试试这个,看看是否有用。
${If} ${RunningX64}
${DisableX64FSRedirection}
${EndIf}
ExecWait "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File .\file.ps1"
${If} ${RunningX64}
${EnableX64FSRedirection}
${EndIf}
答案 1 :(得分:0)
您可以在NSIS中执行相同的任务,而不是使用power shell脚本。您可以修改并使用nsis创建自己的新注册表项。 例如,您可以使用以下命令来编写和读取注册表
/sdcard/
此处a link!
答案 2 :(得分:0)
我们构建过程的最终结果是调用NSIS为我们正在构建的产品创建可执行文件。我们也试图调用类似于上面列出的示例的Powershell来在部署时运行,调用powershell脚本来管理与IIS相关的服务器上的特殊职责。
在NSIS文件中,我们尝试了以下变体但没有成功:
nsExec::ExecToStack 'powershell -inputformat none -ExecutionPolicy bypass -File "C:\HardCodedLocation_Instance.ps1" '
nsExec::ExecToStack 'powershell.exe "& "C:\HardCodedLocation_Instance.ps1"' $0
ExecWait 'powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File C:\HardCodedLocation_Instance.ps1' $0
${PowerShellExec} "C:\HardCodedLocation_Instance.ps1"
“C:\ HardCodedLocation_Instance.ps1”在部署时由NSIS运行,但脚本中需要管理权限的任务尚未完成。
“C:\ HardCodedLocation_Instance.ps1”中的前两行:
Set-ExecutionPolicy -ExecutionPolicy Bypass
Import-Module webadministration
我正在以管理员身份运行以服务器身份登录的可执行文件。然后我可以转身,右键单击“C:\ HardCodedLocation_Instance.ps1”和“使用PowerShell运行”,它可以正常工作。