【问题标题】:How to set "Run as administrator" flag on shortcut created by MSI installer如何在 MSI 安装程序创建的快捷方式上设置“以管理员身份运行”标志
【发布时间】:2011-07-11 15:23:32
【问题描述】:

我在 Visual Studio 2010 中有一个安装和部署项目。

我希望安装程序在我的解决方案中为另一个项目的可执行文件创建两个快捷方式。一个普通快捷方式使用当前凭据简单地运行应用程序,另一个设置了 以管理员身份运行 标志,从而确保在单击快捷方式时要求用户提供具有管理权限的凭据。

以管理权限运行应用程序会启用某些原本不可用的功能。

乍一看似乎无法设置此标志。这可以直接在 Visual Studio 中完成吗?如果没有,还有其他选择吗?

编辑:如果没有,是否可以使用自定义安装程序类以编程方式修改快捷方式?

【问题讨论】:

    标签: visual-studio-2010 windows-installer setup-project shortcut setup-deployment


    【解决方案1】:

    我知道这是一个很老的问题,但我需要找到答案,我想我可以帮助其他搜索者。我写了一个小函数来在 VBScript 中执行这个任务(粘贴在下面)。它很容易适应VB.net / VB6。

    函数返回代码:
    0 - 成功,更改了快捷方式。
    99 - 快捷方式标志已设置为以管理员身份运行。
    114017 - 找不到文件
    114038 - 数据文件格式无效(特别是文件太小)
    所有其他非零 = 意外错误。


    正如 Chada 在稍后的帖子中提到的,此脚本不适用于 msi Advertised 快捷方式。如果您使用此方法来操作快捷方式中的位,则它必须是标准的、非广告的快捷方式。

    参考资料: MS 快捷方式 LNK 格式:http://msdn.microsoft.com/en-us/library/dd871305
    一些灵感:Read and write binary file in VBscript

    请注意,该函数不会检查有效的 LNK 快捷方式。事实上,你可以输入任何文件,它会改变文件中的十六进制字节 15h 以将第 32 位设置为打开。

    如果在修改之前将原始快捷方式复制到 %TEMP%。

    达兹。

    '# D.Collins - 12:58 03/09/2012
    '# Sets a shortcut to have the RunAs flag set.  Drag an LNK file onto this script to test
    
    Option Explicit
    
    Dim oArgs, ret
    
    Set oArgs = WScript.Arguments
    
    If oArgs.Count > 0 Then
        ret = fSetRunAsOnLNK(oArgs(0))
        MsgBox "Done, return = " & ret
    Else
        MsgBox "No Args"
    End If
    
    Function fSetRunAsOnLNK(sInputLNK)
        Dim fso, wshShell, oFile, iSize, aInput(), ts, i
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set wshShell = CreateObject("WScript.Shell")
        If Not fso.FileExists(sInputLNK) Then fSetRunAsOnLNK = 114017 : Exit Function
        Set oFile = fso.GetFile(sInputLNK)
        iSize = oFile.Size
        ReDim aInput(iSize)
        Set ts = oFile.OpenAsTextStream()
        i = 0
        Do While Not ts.AtEndOfStream
            aInput(i) = ts.Read(1)
            i = i + 1
        Loop
        ts.Close
        If UBound(aInput) < 50 Then fSetRunAsOnLNK = 114038 : Exit Function
        If (Asc(aInput(21)) And 32) = 0 Then 
            aInput(21) = Chr(Asc(aInput(21)) + 32)
        Else
            fSetRunAsOnLNK = 99 : Exit Function
        End If
        fso.CopyFile sInputLNK, wshShell.ExpandEnvironmentStrings("%temp%\" & oFile.Name & "." & Hour(Now()) & "-" & Minute(Now()) & "-" & Second(Now()))
        On Error Resume Next
        Set ts = fso.CreateTextFile(sInputLNK, True)
        If Err.Number <> 0 Then fSetRunAsOnLNK = Err.number : Exit Function
        ts.Write(Join(aInput, ""))
        If Err.Number <> 0 Then fSetRunAsOnLNK = Err.number : Exit Function
        ts.Close
        fSetRunAsOnLNK = 0
    End Function
    

    【讨论】:

    • 我的回答似乎不适用于 Windows 10。其他人看到了吗?
    • 我刚刚回到这个并在 Win 10 1909 上进行了测试,它确实似乎又可以工作了。
    【解决方案2】:

    这主要是因为 Windows Installer 对 Windows Installer 程序包使用了“广告快捷方式”。

    在 Visual Studio 中无法固有地禁用此功能,但可以修改生成的 MSI 以确保它不使用广告的快捷方式(或仅使用一个)。有两种方法可以解决这个问题:

    • 如果您的应用程序使用一个或两个 exe - 使用 ORCA 编辑 MSI。在快捷方式表下,将目标条目更改为“[TARGETDIR]\MyExeName.exe” - 其中 MyExeName 是您的 exe 的名称 - 这样可以确保不会宣传该特定快捷方式。
    • 使用 ORCA 或构建后事件(使用 WiRunSQL.vbs 脚本)将 DISABLEADVTSHORTCUTS=1 添加到 MSI 的属性表中。如果您需要这方面的更多信息,请告诉我。这会禁用所有公布的快捷方式。

    使用第一种方法可能会更好,创建2个快捷方式并在ORCA中只修改一个,以便您可以右键单击并以管理员身份运行。

    希望对你有帮助

    【讨论】:

    • 感谢您的信息。但是,我要问的是如何在快捷方式上设置“以管理员身份运行”标志,这样用户就不必右键单击并选择“以管理员身份运行”。我已经用屏幕截图更新了问题以澄清。
    【解决方案3】:

    Windows 安装程序不支持此功能。提升通常由应用程序通过其manifest 处理。

    一种解决方案是创建一个包装器(VBScript 或 EXE),它使用带有 runas 动词的ShellExecute 以管理员身份启动您的应用程序。然后,您的快捷方式可以指向此包装器,而不是实际的应用程序。

    【讨论】:

    • 我需要提示用户输入凭据。 runas 可以做到这一点吗?
    • 由于管理员和普通用户运行应用程序都是完全有效的,我认为清单在这里不能帮助我。除非我错过了什么?
    • Runas 是专门为提示输入凭据而创建的。清单在您的场景中没有多大帮助,这就是我建议 ShellExecute 的原因。我提到了清单,因为这是通常的方法。
    • 我明白了,感谢您的意见。我已经编辑了我的问题,以包括创建自定义安装程序类的可能性。如果没有其他问题,我会接受你的回答:)
    【解决方案4】:

    对不起,我现在明白你在追求什么。

    确实有设置快捷方式标志的方法,但我知道没有直接在 Visual Studio 中。我发现了许多用 C++ 编写的函数,它们在快捷方式上设置 SLDF_RUNAS_USER 标志。

    这些功能的一些链接包括:

    在 NSIS 论坛上就同一主题进行了另一个有趣的讨论,该主题可能会有所帮助。列出了一个可以构建的功能,并提到了存储此类快捷方式设置的注册表位置(如果可行,这似乎是最简单的方法)-我目前无法测试注册表方法,但可以稍后再看看它是否有效。

    这个帖子可以在这里找到:http://forums.winamp.com/showthread.php?t=278764

    如果您非常热衷于以编程方式执行此操作,那么也许您可以调整上述功能之一以作为安装后任务运行?这将在您安装后设置快捷方式的标志,但这再次需要在非广告快捷方式上完成,因此必须像我之前提到的那样修复 MSI。

    我会继续寻找和测试注册表设置方法,看看它是否有效并报告。

    茶达

    【讨论】:

      【解决方案5】:

      我需要让我的应用程序在从开始菜单或程序文件运行时提示管理员权限。

      在将 \bin\Debug\my_app.exe 的“以管理员身份运行此程序”复选框设置为 true 后,我实现了此行为。 (位于 Properties\Compatibility 部分)。

      在安装项目时,此文件已复制到具有所需行为的 Program Files(因此是开始菜单中的快捷方式)。

      谢谢, 巴甫洛

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2011-04-12
        • 1970-01-01
        • 2015-05-13
        • 2014-09-27
        相关资源
        最近更新 更多