【问题标题】:NSIS Script Wrap to PS1 into EXE and Run as AdminNSIS 脚本将 PS1 包装成 EXE 并以管理员身份运行
【发布时间】:2015-12-29 23:23:09
【问题描述】:

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

【问题讨论】:

    标签: powershell nsis registrykey runas


    【解决方案1】:

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

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

    ${If} ${RunningX64}
        ${DisableX64FSRedirection}
    ${EndIf}
    
    ExecWait "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File .\file.ps1"
    
    
    ${If} ${RunningX64}
       ${EnableX64FSRedirection}
    ${EndIf}
    

    【讨论】:

      【解决方案2】:

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

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

      这里是a link

      【讨论】:

        【解决方案3】:

        我们构建过程的最终结果调用 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 运行”,它可以正常工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-08
          • 1970-01-01
          • 2021-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多