NSIS 脚本包装到 PS1 到 EXE 和 运行 作为管理员

NSIS Script Wrap to PS1 into EXE and Run as Admin

我有以下 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 的唯一问题是它没有 运行 作为管理员的选项。

您可以在 NSIS 本身中执行相同的任务,而不是使用强大的 shell 脚本。您可以修改,也可以使用 nsis 创建您自己的新注册表项。 例如,您可以使用以下命令写入和读取注册表

WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Version" "1.0"
ReadRegStr $mm HKLM "SOFTWARE\NSIS_Example2" "Version"

这里是a link

我怀疑你 运行 在 64 位机器上并且与位数有冲突。

没试过这个,但试试这个 ans 看看是否有效。

${If} ${RunningX64}
    ${DisableX64FSRedirection}
${EndIf}

ExecWait "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File .\file.ps1"


${If} ${RunningX64}
   ${EnableX64FSRedirection}
${EndIf}

我们构建过程的最终结果调用 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"' [=10=]

ExecWait  'powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File C:\HardCodedLocation_Instance.ps1' [=10=]

${PowerShellExec} "C:\HardCodedLocation_Instance.ps1"

NSIS 在部署时 "C:\HardCodedLocation_Instance.ps1" 运行,但脚本中需要管理权限的任务未完成。

"C:\HardCodedLocation_Instance.ps1"中的前两行:

Set-ExecutionPolicy -ExecutionPolicy Bypass
Import-Module webadministration

我正在 运行 将可执行文件以管理员身份登录到服务器。然后我可以转身,右键单击 "C:\HardCodedLocation_Instance.ps1" 和 "Run with PowerShell",它就可以正常工作了。