3

我在Visual Studio安装和部署项目2010年如何设置标志由MSI安装程序创建快捷方式“以管理员身份运行”

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

Set "Run as administrator flag" on shortcut

运行具有管理权限的应用程序使某些功能在其他方面不可用。

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

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

回答

3

这不受Windows安装程序支持。海拔通常由应用程序通过其manifest处理。

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

+0

我需要用户提示输入凭据。这可能与runas? – bernhof

+0

由于它对于管理员和普通用户来说都是完全有效的,所以我不认为这个清单不能帮助我。除非我错过了什么? – bernhof

+0

Runas专门用于提示凭据。清单在你的场景中帮助不大,这就是我为什么推荐ShellExecute的原因。我提到了清单,因为这是通常的做法。 –

5

这很大程度上是由于Windows Installer为Windows Installer软件包使用“播发快捷方式”。

在Visual Studio中没有办法固有禁用它,但可以修改生成的MSI以确保它不使用公布的快捷方式(或仅使用一个)。有2种方式的要对此:

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

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

希望这有助于

+0

感谢您的信息。但是,我所问的是如何在快捷方式上设置“以管理员身份运行”标志,因此用户不必右键单击并选择“以管理员身份运行”。我已经用截图更新了这个问题以澄清。 – bernhof

1

很抱歉的混乱 - 我现在明白你是什么之后。

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

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

关于同一主题的另一个有趣的讨论是在NSIS论坛上进行的,该线程可能会有所帮助。有一个列出的功能,可以建立,以及提及一个存储这种快捷方式设置的注册表位置(这似乎是最简单的方法,如果它的工作) - 我目前无法测试注册表方法,但稍后可以做一下,看看它是否有效。

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

如果你很热衷于编程做到这一点,那么也许你可以适应的上述功能之一来运行一个安装后的任务吗?这会在安装后设置快捷方式的标志,但是这需要再次在Non-Advertised快捷方式上完成,因此必须像我前面提到的那样修复MSI。

我会继续寻找并测试注册表设置方法,看看它是否工作并回报。

查达

5

我知道这是一个很老的问题,但我需要找到答案,我想我可以帮助其他的搜索。我写了一个小函数来在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%。

Daz。

'# 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 
+0

我的答案似乎不适用于Windows 10.任何人都看到这个? – Daz

1

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

在\ bin \ Debug \ my_app.exe'将该程序作为管理员'复选框设置为true后,我实现了此行为。 (位于Properties \ Compatibility部分)。

在安装项目时,该文件被复制到程序文件(因此也是开始菜单中的快捷方式)并具有所需的行为。

谢谢, Pavlo

相关问题