不需要管理员权限的7zip自解压缩归档(SFX)

11

我使用7zip按照以下方式创建SFX:

7z.exe a -r archive.7z *

然后我使用7zS.sfx文件(用于创建自解压安装程序)、配置文件"build.config"和归档文件进行二进制复制。配置文件的内容如下:

;!@Install@!UTF-8!
RunProgram="setup.exe"
GUIMode="1"
Path="%tmp%\\mytemp"
;!@InstallEnd@!

二进制复制命令如下:

copy /b 7zS.sfx + build.config + archive.7z sfxInstaller.exe

问题在于结果SFX "sfxInstaller.exe"需要管理员权限才能执行。是否可能使用7-Zip生成不需要管理员权限的自解压归档文件?如果可以,应该使用什么参数/命令行参数? 提前致谢。

7个回答

8

我使用mpursuit的答案解决了这个问题。

要更新7zS.sfx的清单,您可以使用以下步骤:

manifest.xml

   <?xml version="1.0" encoding="utf-8"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">

      <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
          <!--application support for Windows Vista -->
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
          <!--application support for Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
        </application>
      </compatibility>

      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
          </requestedPrivileges>
        </security>
      </trustInfo>

    </assembly>

call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
mt.exe -manifest manifest.xml -outputresource:"7zS.sfx;#1"
copy /b 7zS.sfx + build.config + archive.7z sfx_archive.exe

优秀的回答。有效! - user2534096
1
成功了!我在这里找到了vcvarsall.batC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat。我使用的是7zSD.sfx,而不是7zS.sfx - browly
我在我的Microsoft Visual Studio目录中找不到mt.exe,但我在以下位置找到它:
  • Microsoft SDKs\Windows\v7.1\Bin和...\x64
  • Windows Kits\10\bin\10.0.17763.0{arm64,x64,x86}
  • Windows Kits\8.1\bin{x64,x86}
我使用了Windows Kits\8.1\x86中的一个,并且它起作用了。看起来我不需要vcvarsapp.bat。谢谢!
- Jordan Brown
所需的清单也可以使用 Resource Hacker 轻松添加,这是一款流行的 Windows 应用程序。 - A.J.

2
您可以在原始的7zs.sfx中嵌入一个清单文件,通知Windows使用与父进程相同的访问令牌运行提取程序。这将导致自解压程序以普通用户身份运行,如果用户登录为普通用户。
以下链接描述了如何使用Visual Studio 2005在可执行文件中嵌入清单文件,但是在后续版本中也适用。 https://support.microsoft.com/kb/944276 一旦您嵌入了将“requestedExecutionLevel”设置为“asInvoker”的清单文件,任何使用修改后的7sz.sfx以常规方式创建的自解压缩存档都不需要管理员权限。

您还可以使用简单的十六进制编辑器修改sfx文件的清单。只需搜索“requestedExecutionLevel”,您会发现它后面跟着level="highestAvailable"。只需将其更改为level="asInvoker" (使用尾随空格添加额外字符)。我已经成功地在7zSD.sfx中完成了这个操作。 - J Higs
3
在7zSD.sfx(版本9.20,2010年11月18日,md5sum fe5a4c1f2b3439653480c27a3958de15)中找不到requestedExecutionLevellevelhighestAvailable - arve0
@JHigs,你能否创建一个解释你是如何做到这一点的答案? - Kyle B
2
我今天下载了7zSD.sfx的9.2版本,它与我拥有的版本不同。正如你所说,它没有level="highestAvailable"。我找到了一个链接,其中包含一个已经具有level="asInvoker"的文件版本:https://github.com/github/ghfw-build-extra/blob/master/7-Zip/7zSD.sfx - J Higs

1
在你的配置文件中加入MiscFlags="4"。这样应该可以解决你的问题。
它应该是这个样子:
;!@Install@!UTF-8!
RunProgram="setup.exe"
GUIMode="1"
Path="%tmp%\\mytemp"
MiscFlags="4"
;!@InstallEnd@!

3
这在Windows 10上无法运行,指的是7zS.sfx/7zSD.sfx, 版本9.20,发布于2010年11月18日。 - arve0
2
我认为 MiscFlags="4" 应该会提升到管理员权限。 - Kyle B

1

很遗憾,我没有找到一种不需要管理员权限就能生成SFX的7zip方法。尝试了其他一些SFX生成器后,我停留在IExpress上,它完全满足我的需求。


1

我不明白MiscFlags="4"如何解决问题。

问题的原因是什么?您使用copy /b 7zS.sfx(或7zS2或7zSD,无所谓)与您的文件,并且它将为您生成一个只能作为管理员运行的文件。可以运行应用程序的角色(管理员、普通用户)的信息存储在应用程序内部的清单中。7zS(或7zS2、或7zSD)没有清单。因此,如果您使用Windows Vista或更高版本,则结果文件将提示您输入管理员凭据。

本文将帮助您。从“摆脱UAC提示”开始阅读。

https://www.excelsiorjet.com/kb/35/howto-create-a-single-exe-from-your-java-application

你可以使用资源编辑软件(如ResEdit)来解决问题。您应该向7zS.sfx文件添加一个包含安全信息的清单。
<security>
  <requestedPrivileges>
    <requestedExecutionLevel
      level="asInvoker"
      uiAccess="false"/>
  </requestedPrivileges>
</security>

0

您可以使用7zsd.sfx代替7zs.sfx。 这不需要管理员权限。


5
当使用带有7-Zip 9.20的Windows 7时,我发现使用7zSD.sfx创建的解压程序仍需要管理员权限。 - mpursuit

0

非常感谢您的帮助,它运行得很好。 但是我使用了以下命令: call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 mt.exe -manifest manifest.xml -outputresource:"7zSD.sfx;#1" copy /b 7zSD.sfx + config.txt + techselfsupport.7z techselfsupport.exe


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接