【问题标题】:How to set "Run this program as an administrator" programmatically如何以编程方式设置“以管理员身份运行此程序”
【发布时间】:2011-01-19 18:15:37
【问题描述】:

我在 Vista 中遇到了一个很好的 bdeadmin.exe 问题。首先,让我们排除可预测的响应:

“您不应要求提升您的应用程序。”
这个可以。生活吧。

“您需要嵌入清单文件。”
它已经编译好了,已经有很多年了,创建它的公司无意再做一次,它是从 Merge Module(MSM 文件)安装的。

“BDE 已过时,您应该使用 dbExpress”
150 万行代码。 '纳夫说。

“在 EXE 旁边放置一个清单文件。”
试过了,什么都没做。作为一项测试,同一个清单文件能够使其他几个 EXE 文件需要提升,但不是我想要的。里面的东西阻止了外部清单被读取。

“创建快捷方式并设置 SLDF_RUNAS_USER。”
不能这样,它是一个控制面板小程序。

唯一有效的方法是在其“属性”窗口的“兼容性”选项卡下设置“以管理员身份运行此程序”。我不应该告诉用户这样做。对生意不利。我需要让安装程序执行此操作。 MSM 文件使用静态路径。

【问题讨论】:

  • 接受的答案具有要读取的注册表位置以获取所需的值。
  • 关于 Win 8 的 ~:我注意到在我的 Win 7 上它有一个 #(井号),后跟空格,然后是 RUNASADMIN,所以实际上很可能是 Win 8 上的 ~(tilda) . 并且(谁知道是哪个新符号)在 Windows 10 上...
  • 无需重新编译(或重新链接)即可嵌入清单。它是一种常规资源,您可以像添加任何其他资源一样添加它。除非二进制文件经过数字签名并且无法更改,否则这将是直接的解决方案。将其重新打包到一个新的合并模块中也应该是可行的。

标签: windows properties compatibility admin runas


【解决方案1】:

您可以通过设置一个简单的注册表项以编程方式设置“以管理员身份运行此程序”标志(您可以在 EXE 属性的“兼容性”选项卡中找到该选项)。您需要在这些键之一下创建一个字符串值 (REG_SZ)(如果您希望设置分别针对每个用户或每台机器):

HKEY_CURRENT_USER\软件\微软\Windows NT\CurrentVersion\AppCompatFlags\Layers

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

值的名称需要是您的可执行文件的完整路径(如果路径包含空格,请不要用引号将路径括起来)并且值的数据必须包含字符串RUNASADMIN

示例:

reg.exe Add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Program Files\MyApp\Test.exe" /d "PUT__VALUE__HERE"

兼容模式

WIN95 视窗 95
WIN98 视窗 98
WIN4SP5 Windows NT 4.0 SP5
WIN2000 Windows 2000
WINXPSP2 Windows XP SP2
WINXPSP3 Windows XP SP3
VISTARTM Vista
VISTASP1 Vista SP1
VISTASP2 Vista SP2
WIN7RTM Windows 7
WINSRV03SP1 Windows Server 2003 SP1
WINSRV08SP1 Windows Server 2008 SP1

权限级别

RUNASADMIN 以管理员身份运行程序

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\temp\compatmodel\iconsext.exe" /t REG_SZ /d "WINXPSP3 RUNASADMIN" /f

参考资料: http://www.verboon.info/2011/03/running-an-application-as-administrator-or-in-compatibility-mode/

【讨论】:

  • 这看起来很有希望。现在将其放入 msi 中的 [COMMONFILESFOLDER]
  • 唯一的粘性位是在注册表值名称中使用 MSI 变量。那是显示空白。但是你回答了我的问题,谢谢。在解决该部分之前,我将在两个不同的值中使用 %commonprogramfiles% 和 %commonprogramfiles(x86)%。
  • 您可能想为您的 MSI 难题打开一个单独的问题。从与 MSI 的往来中,我知道我对此一无所知,尤其是因为我发现它的文档相当乏味。当我碰壁时,我通常只是将我需要做的任何事情投入到自定义操作中(这非常容易做到,至少在 .NET 中是这样)。
  • 我必须为 Windows 8.1 使用数据值“~ RUNASADMIN”
  • @harveyt:谢谢。是<Tilde><Space>RUNASADMIN 吗?你知道这是否也适用于 Windows 8.0?由于此“功能”未记录在案,因此实施可能随时更改,恕不另行通知。希望它只会随着 Windows 的新版本而改变,但我可以想象它只需要一个简单的 Windows 更新就可以改变(尽管不太可能)。
【解决方案2】:

这是一个长镜头,但如果您的 EXE 名称中有“setup”或“install”字样,Windows 将在运行它时提示提升。不过,我不知道这是否适用于控制面板小程序。

【讨论】:

【解决方案3】:

你试过微软的Application Compatibility Toolkit吗?它会分析您的应用并提供可能有助于解决您的问题的兼容性填充程序。

【讨论】:

  • 有趣。我也许可以将他们生成的 MSI 的内容与我自己的安装程序合并。
【解决方案4】:

使用使用“runas”作为“动词”的 ShellExcute 的包装程序来运行您想要的程序。

【讨论】:

    【解决方案5】:

    我发现如果.exeC:\Program files\... 下并且.exe 之前在没有.manifest 文件的情况下运行,则.manifest 文件方法不起作用。 Windows 会从第一次运行 .exe 时记住 .manifest。这意味着当用户抱怨他们的安装没有运行时,您不能只发送清单。清单文件必须在放置.exe 的同一安装之前或期间放置。

    如果.exe 发生变化(例如新版本或不同的字节数),Windows 会重新检查.manifest

    【讨论】:

    【解决方案6】:

    使用静默模式 + 管理员请求模式将您的应用打包到 WinRar SFX 中。

    比弄乱 .MSI 变量要简单得多。

    【讨论】:

      【解决方案7】:

      如果这是可能的,我会感到惊讶。这将是恶意代码滥用系统的理想方式。您可能会告诉用户管理员必须安装或者他们必须具有管理员权限(就像 Windows 上的所有其他程序一样)。

      【讨论】:

      • 您似乎没有花时间理解这个问题。他正试图让他的应用程序以管理员身份运行,该用户在启用了 UAC 的机器上拥有管理员权限。在当前状态下,他的应用程序不会提示提升并在没有管理员权限的情况下运行,并且会失败。他试图让它提示提升,而不是绕过 Windows 的安全性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2011-05-01
      • 2021-11-10
      • 2017-08-23
      • 2011-03-27
      相关资源
      最近更新 更多