如何使用 NSIS 请求管理员权限?

2023-12-28

我对 NSIS 还很陌生。 我试图请求管理员权限才能运行安装程序,因为它与注册表有点混乱。 我对“RequestExecutionLevel”和“MULTIUSER_EXECUTIONLEVEL”的问题是,它们都绝对阻止任何非管理员用户打开安装程序,即使在上下文菜单中选择“以管理员身份运行”也是如此。 我尝试过使用 RunAs DLL,但我还没有找到一个线程来说明将什么内容放入传递给“RunAsW”函数的 $command 变量中。

这是我的(相当混乱的)代码:

     StrCpy $0 0
     StrCpy $1 ""
     System::Call 'RunAs::GetAdministrators(w r1, *i .r0) i .r2 ? u'
     System::Alloc 64
     Pop $4
     StrCpy $4 $2
     StrCpy $5 ""
     loop:
          IntCmp $0 0 endloop
          System::Call '*$4(w .r3)'
          StrCpy $5 "$5|$3"
    endloop:
    System::Free $4   ; we free the memory used by the array
    StrCpy $5 "$5" "" 1
    !insertmacro MUI_INSTALLOPTIONS_WRITE "Settings.ini" "Field 1" "ListItems" $5
     !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings.ini"
     !insertmacro MUI_INSTALLOPTIONS_READ $1 "UserPass" "Field 1" "State"
     !insertmacro MUI_INSTALLOPTIONS_READ $2 "Settings.ini" "Field 2" "State"
     StrCpy $3 "%%LOGONSERVER%%"
     StrCpy $3 0
     StrCpy $4 0
     System::Call 'RunAs::RunAsW(w r1, w r2, w r3, *w .r4) i .r0 ? u'
     MessageBox MB_OK $0
     IntCmp $0 1 success
     Quit
     success:
     !insertmacro MUI_LANGDLL_DISPLAY

其中很多只是猜测和反复试验。 (顺便说一句 - 我还尝试通过循环运行来获取所有管理员,但 DLL 似乎仅适用于 32 位计算机,所以......)。

无论如何,我的问题是:

有谁知道一种方法(使用“RunAs”或其他方式)打开一个请求用户名和密码的对话框,检查凭据并仅在检查后继续安装?

另外,我知道有一种方法可以设置安装程序,以便它带有漂亮的盾牌图标,让用户知道将请求管理员权限。有人知道该怎么做吗?

任何帮助将非常感激,因为这是目前阻止我的应用程序部署的唯一原因。


Outfile RequireAdmin.exe
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)

!include LogicLib.nsh

Function .onInit
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
    MessageBox mb_iconstop "Administrator rights required!"
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
    Quit
${EndIf}
FunctionEnd

Page InstFiles

Section
SectionEnd

是我通常推荐的基本代码,以确保安装程序以管理员身份运行。

恕我直言,除非安装过程的一部分需要管理员访问权限,而另一部分需要访问用户配置文件,否则在自定义页面上提示输入凭据是没有意义的。如果这适用于您,那么您应该看看UAC插件 http://nsis.sourceforge.net/UAC_plug-in(使用起来有点复杂,导致你的exe文件无法获取屏蔽覆盖图标)

我不认为运行方式插件 http://nsis.sourceforge.net/NSIS-RunAs当 UAC 打开时,它可以在 Vista+ 上正常工作,因此尝试让它工作可能是一个死胡同......

The 推荐方式 http://msdn.microsoft.com/en-us/library/bb530410.aspx要获得防护罩,请在 exe 清单中请求提升,RequestExecutionLevel admin这样做。如果你不使用RequestExecutionLevel完全在您的安装程序脚本中might被检测为旧版安装程序,并且它还将获得屏蔽覆盖层。

在 Windows Vista 中,如果可执行文件需要提升才能启动, 那么可执行文件的图标应该用盾牌图标“标记” 表明这一事实。可执行文件的应用程序清单必须标记 “requireAdministrator”指定可执行文件需要完整的 管理访问令牌。盾牌图标覆盖也将是 自动放置在被认为需要的可执行文件上 根据安装程序检测启发式的标高。例如,一个 名为 setup.exe 的文件将自动接收盾牌图标覆盖层 即使可执行文件没有嵌入式应用程序清单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 NSIS 请求管理员权限? 的相关文章

  • Qt之NSIS打包

    一 Qt发布方式 Qt发布的时候 通常使用两种方式 1 静态编译 把相关联的库一并引入可执行程序 虽然发布简单 但可执行程序较大 2 动态编译 把相关联的库 以dll的形式引用 不包含到可执行程序 发布不方便 但可执行程序较小 二 NSIS
  • 每个 Windows 操作系统的注册表中的 CurrentVersion 值

    我想知道CurrentVersion每个操作系统的值 HKLM SOFTWARE Microsoft Windows NT CurrentVersion 例如 我的机器上安装了 Windows 7 Professional 并且Curren
  • 从非管理应用程序以管理员身份运行进程

    从不以管理员身份运行的应用程序中 我有以下代码 ProcessStartInfo proc new ProcessStartInfo proc WindowStyle ProcessWindowStyle Normal proc FileN
  • 从 shell 禁用 DeviceAdmin?

    我正在尝试从 shell 卸载应用程序 但是该应用程序正在以设备管理员身份运行 因此shell gt adb uninstall com example test不工作 如何从 shell 禁用设备管理员 通常 通过设备管理员屏幕撤销管理访
  • 在 vista 中以管理员身份以编程方式运行 cmd.exe,C#

    我有一个视觉工作室设置和部署项目 我在其中添加了一个 cmd 脚本 该脚本需要管理员权限才能运行 当用户单击 setup exe 时 UAC 会提示用户授予管理员权限 因此 我假设在 setup exe 中创建和调用的所有进程都将以管理员身
  • 以管理员身份运行 Powershell 命令 - 命令本身不会加载

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • 从 Python 将密码传递给 runas [重复]

    这个问题在这里已经有答案了 我需要从我的脚本以另一个用户身份运行一个文件 而不提示输入密码 这是怎么做到的 有一个可执行程序叫做沙努尔程序这就是针对这种情况而设计的 您可以使用它在命令行上输入密码 如下所示 runas user domai
  • 自提升脚本+执行策略

    我正在尝试使用问题中的以下代码 PowerShell 以管理员身份运行命令 https stackoverflow com questions 7690994 powershell running a command as administ
  • 设置在 nsis 安装程序的自定义对话框页面上添加的自定义标签的字体

    如何设置 nsis 安装程序中自定义添加页面上添加的标签的字体 为了创建标签 我使用了这个 nsDialogs Create 1018 var Label NSD CreateLabel 0 0 100 32u PLEASE CHOOSE
  • 在许可证页面上添加复选框和单选按钮

    我正在 Nsis 中编写脚本 我需要在许可证页面上有选项单选按钮以及用于再次确认的复选框 是否可以这样做 因为如果我尝试插入较高优先级的是复选框 而我缺少单选按钮 最好我想只修改许可证页面而不创建自定义页面 感谢您的帮助 选项A 使用修改后
  • 为 NSIS 安装程序设置 UAC“发布者”字段

    当我打开安装程序 使用 NSIS 创建的 时 会出现 UAC 对话框 其中包含有关我的安装程序的信息 场出版商是 未知 我听说过对应用程序进行数字签名 您知道如何在 NSIS 中执行此操作吗 如何设置字段 属性出版商到 我的安装程序 或其他
  • 如何在NSIS中调用PowerShell

    我正在尝试在 NSIS 中运行 PowerShell 当我运行 NSIS 脚本时 include x64 nsh Name nsExec Test OutFile nsExecTest exe ShowInstDetails show Se
  • 在 NSIS 脚本中安装驱动程序

    我正在尝试创建一个安装 inf 文件的 NSIS 安装程序 inf 文件从安装程序中提取到正确的位置 然后我使用 nsExec ExecToLog SYSDIR PnPutil exe a INSTDIR driver xser inf 然
  • NSIS 安装程序 - 显示不同的许可证

    我正在尝试修改现有的 NSIS 安装脚本 以允许根据用户是新用户还是现有用户向用户提供不同的许可证文件 我有预先存在的代码 可以检测 onInit 部分中的现有安装 然而 我在尝试使用 NSIS 提供的许可证屏幕时遇到了障碍 例如 Inse
  • 检查C#中的管理员权限

    我想知道程序是否以管理员身份运行 用户不必是管理员 我只想知道我的应用程序是否有权编辑某些以管理员身份运行时可编辑的受保护文件 这将返回一个 bool valid using System Security Principal bool i
  • 卸载程序不删除注册表

    Function Check32or64BitWindows If RunningX64 strcpy INSTDIR PROGRAMFILES64 APP FULL PATH SetRegView 64 Else SetRegView 3
  • NSIS 插件“nsScreenshot”在 Windows NT 6.x 中不起作用

    我添加了一个比原始插件晚3年发布的代码 但它仍然返回错误 代码很简单 恕我直言 但我仍然很可能错过某些方面 看这段代码 nsScreenshot NSIS Plugin c 2003 Leon Zandman email protected
  • 如何在 NSIS 中使用 try catch

    您好 我在安装时在 nsis 安装程序中的几台机器上遇到了奇怪的错误 使用 fontreg nsh 安装字体时给出 无效的 win32 文件句柄 我试过谷歌但没有得到这个问题的答案 现在我正在考虑抑制此消息 那么有什么方法可以抑制此消息 或
  • 当 VS2013 以管理员身份运行时,MSTest 正在删除测试结果

    我知道这听起来很奇怪 但事实就是如此 我正在使用 MSTest 来运行我的单元测试 使用VS2013 ReSharper 8 1 C 中的一些dll项目 我正在调用一些 API 函数 这就是为什么我需要 VS 以管理员身份运行 否则这些调用
  • 使用管理员帐户运行asp.net程序

    我需要使用管理员帐户并启用桌面交互从 ASP NET 应用程序运行一个控制台应用程序 我尝试过下面的代码 控制台应用程序运行正常 但在网络服务帐户内 有什么想法如何在管理员帐户下运行控制台吗 string enginePath Server

随机推荐

  • asm.js 如何处理被零除?

    在 javascript 中 使用 整数 参数除以零的行为就像浮点应该 1 0 Infinity 1 0 Infinity 0 0 NaN asm js 规范规定 带有整数参数的除法返回intish 必须立即强制签名或未签名 如果我们在 j
  • 如何使
    水平布局?

    我正在尝试为我的网站开发一个布局 其中定义列表的元素将水平布局 有点像这样 term 1 term 2 term 3 definition 1 definition 2 definition 3 有人知道如何使用有效的 CSS 使定义列表看
  • 将在 MinGW 7 中使用的 VC Runtime 2017 中 scanf 函数系列的位置

    我在用 VS 2017 MinGW 与 GCC G 7 4 0 基本上发生的事情如下 使用 VS 2017 构建可执行文件 so 是用 GCC 构建的 so 由步骤 1 中创建的可执行文件加载 问题源于MSVCRT MinGW默认情况下链接
  • 本地工作中的 nuget 包

    在我们的产品中 我们有一些项目 几乎每一个都依赖于一个称为 核心 的核心 我们将每个项目作为单独的 nuget 包进行分发 对于部署 我们为其他团队 产品所做的工作 nuget 效果很好 但在我们的本地工作中这确实是一个很大的痛苦 每次 核
  • 使用 WebDriver 和 Ruby 与 JavaScript 下拉菜单交互?

    我正在使用 Ruby 和 Selenium WebDriver 为网页编写自动化 但遇到了网站上某些使用 JavaScript 而不是标准 HTML 制作的下拉菜单的阻塞问题 在这些下拉菜单中 用户可以从下拉菜单中选择一个选项 或者单击它并
  • 在 html5 画布上旋转单个图像(而不是其他图像)?

    我有一个精灵 我正在使用普通精灵表位块传输在 html 画布上制作动画 在某些关键事件上 我想更改精灵的方向 即翻转它或旋转 180 度 而不更改画布上的任何内容 其他精灵 有谁知道如何做到这一点 所以我的游戏遇到了这个问题 我有用于向上
  • 为 MSVC 预构建的 Boost 1.37

    我找不到 Boost 1 37 0 的一组预构建的 MSVC 库 只有源代码 我不明白他们奇怪的构建系统是如何工作的 有什么地方可以找到视觉工作室项目或其他东西的下载吗 The BoostPro 计算 http www boostpro c
  • Django objects.create 产生的输出比应有的要多

    有两个列表 主值
  • Angular 2 中的bundle.js.gz 文件是什么?

    我正在为我的应用程序使用 ng cli 当我运行 ng build prod 时 我得到两个文件 main budle js 和 main bundle js gz 第二个是什么 它有什么好处 服务器和客户端之间的 HTTP 传输几乎总是使
  • 将类型数组转换为通用数组?

    问题的简短版本 为什么我不能这样做 我仅限于 NET 3 5 T genericArray Obviously T should be float genericArray new T 3 1 0f 2 0f 0 0f Can t do t
  • 检查 ipv6 是否在范围内

    我有maxmind的ipv6数据 这是我当前的表 带有示例数据 network geoname id 2001 208 32 123 2001 218 32 4312 Using 他们的转换器 https github com maxmin
  • 为什么 HTTP 流量的明文错误 ERR_CLEARTEXT_NOT_PERMITTED 持续存在?

    我正在使用 Ionic 框架开发一个新应用程序 并使用 HttpClient 模块来处理 API 请求 问题是我已经阅读并尝试将解决方案应用于 https medium com son rommer fix cleartext traffi
  • 如何使用 javascript 或 jQuery 获取 iframe 之外的元素?

    我正在尝试使用 js 或 jQuery 从 iframe 外部获取元素 我发现了一些东西 但它不是跨浏览器的 div div class u flL iti act num 123456789 div div div div 我需要将该数字
  • 如何使用 XHR 发送附件(图像)和嵌套参数以在钛中上传文件?

    我正在尝试将手机照片库中的图像上传到服务器 图片库打开得很好 这是我的代码 var win Ti UI createWindow navBarHidden true var ind Titanium UI createProgressBar
  • 循环雪花数组

    我正在寻找一种从该集合中获取数据的方法 数据如下 0000000 gt GuildMember guild Guild members Object id 000000 name Zombie rawVoiceStates Object u
  • mysql提交数据为0?

    所以 我刚刚创建了一个简单的用户注册表单 这是它的代码 h2 Signup h2
  • gtk绘图集背景图像

    我有一个绘图区域和一个 png 图像 我想将该图像加载到我的绘图区域作为背景 屏幕比我的图像大 问题是它没有 平铺 我的图像 我尝试将图像添加为 pixbuf 和 pixmap 但没有帮助 我用这条线 gc set tile pixmap
  • Cryo 对 Spark SQL 有帮助吗?

    Kryo 通过高效的序列化方法帮助提高 Spark 应用程序的性能 我想知道 Kryo 对 SparkSQL 是否有帮助 以及我应该如何使用它 在 SparkSQL 应用程序中 我们将执行许多基于列的操作 例如df select c1 c2
  • 必须在方法“Skip”异常之前调用方法“OrderBy”

    我试图实施jQgrid using MvcjQgrid我得到了这个例外 System NotSupportedException was unhandled by user code Message The method Skip is o
  • 如何使用 NSIS 请求管理员权限?

    我对 NSIS 还很陌生 我试图请求管理员权限才能运行安装程序 因为它与注册表有点混乱 我对 RequestExecutionLevel 和 MULTIUSER EXECUTIONLEVEL 的问题是 它们都绝对阻止任何非管理员用户打开安装