Скрипт NSIS переносится на PS1 в EXE и запускается от имени администратора

У меня есть следующий сценарий NSIS (.nsi), который заключает сценарий PowerShell в исполняемый файл.

Кроме того, я хотел бы, чтобы 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 заключается в том, что у него нет возможности работать от имени администратора.


person Imsa    schedule 29.12.2015    source источник


Ответы (3)


Я подозреваю, что вы работаете на 64-битной машине и есть конфликт с разрядностью.

Не пробовал это, но попробуйте это и посмотрите, сработает ли это.

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

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


${If} ${RunningX64}
   ${EnableX64FSRedirection}
${EndIf}
person Omar    schedule 02.10.2017

Вместо использования сценария Power Shell вы можете выполнить ту же задачу в самой NSIS. Вы можете изменить и создать свою собственную новую запись реестра с помощью nsis. например, вы можете использовать следующие команды для записи и чтения реестра

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

Вот ссылка!

person Vishal Patil    schedule 08.02.2016

Конечный результат нашего процесса сборки вызывает 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», и все работает как надо.

person Randy    schedule 12.03.2018