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",它就可以正常工作了。
我有以下 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",它就可以正常工作了。