2015-12-29 70 views
0

我有以下NSIS(.nsi)腳本,將PowerShell腳本包裝到exe中。NSIS腳本封裝到PS1到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的唯一問題是它沒有選項以Admin身份運行。

回答

1

我懷疑你在64位機器上運行,並且存在與位的衝突。

還沒有嘗試過,但試試這個答案,看看是否有效。

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

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


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

除了使用強大的shell腳本,您可以在NSIS自身中執行相同的任務。您可以修改,並且您可以使用nsis創建您自己的新註冊表項。 例如,你可以使用下面的命令寫入和讀取註冊表

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

這裏的a link

相關問題