Visual studio 2010 如何设置;“以管理员身份运行”;MSI安装程序创建的快捷方式上的标志

Visual studio 2010 如何设置;“以管理员身份运行”;MSI安装程序创建的快捷方式上的标志,visual-studio-2010,windows-installer,setup-project,shortcut,setup-deployment,Visual Studio 2010,Windows Installer,Setup Project,Shortcut,Setup Deployment,我在VisualStudio2010中有一个安装和部署项目 我希望安装程序在我的解决方案中为另一个项目的可执行文件创建两个快捷方式。一个普通快捷方式仅使用当前凭据运行应用程序,另一个快捷方式设置了以管理员身份运行标志,从而确保在单击快捷方式时向用户询问具有管理权限的凭据 使用管理权限运行应用程序可以启用某些其他情况下不可用的功能 乍一看,设置此标志似乎是不可能的。这可以直接在VisualStudio中完成吗?如果没有,还有其他选择吗 编辑:如果没有,是否可以使用自定义安装程序类以编程方式修改快

我在VisualStudio2010中有一个安装和部署项目

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

使用管理权限运行应用程序可以启用某些其他情况下不可用的功能

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


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

Windows installer不支持此操作。提升通常由应用程序通过其


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

这主要是因为Windows Installer为Windows Installer软件包使用了“广告快捷方式”

在VisualStudio中无法固有地禁用此功能,但可以修改生成的MSI,以确保它不使用公布的快捷方式(或仅使用一个快捷方式)。有两种方法可以做到这一点:

  • 如果应用程序使用单个exe或两个exe,请使用ORCA编辑MSI。在快捷方式表下,将目标条目更改为“[TARGETDIR]\MyExeName.exe”-其中MyExeName是您的exe的名称-这确保不会公布特定的快捷方式
  • 使用ORCA或生成后事件(使用WiRunSQL.vbs脚本)将DISABLEADVTSHORTCUTS=1添加到MSI的属性表中。如果你需要更多的信息,请告诉我。这将禁用所有播发的快捷方式
最好使用第一种方法,创建两个快捷方式,并在ORCA中只修改一个快捷方式,以便您可以右键单击并以管理员身份运行


希望这能有所帮助

对不起,我现在明白你的意思了

确实有很多方法可以设置快捷方式标志,但据我所知,在VisualStudio中没有直接设置快捷方式标志的方法。我已经发现了许多用C++编写的函数,它在快捷方式上设置了SLDFGRunasuUs用户标记。 这些功能的一些链接包括:

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

此线程可在此处找到:

如果您非常热衷于通过编程来实现这一点,那么您是否可以将上面的某个函数调整为作为安装后任务运行?这将在安装后设置快捷方式的标志,但这再次需要在非广告快捷方式上进行,因此MSI必须按照我前面提到的那样进行修复

我将继续查看并测试注册表设置方法,看看它是否有效,然后返回报告


查达

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

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


正如Chada在后面的文章中提到的,此脚本在msi广告的快捷方式上不起作用。如果使用此方法操作快捷方式中的位,则它必须是标准的、非公布的快捷方式

参考资料: MS快捷方式LNK格式:
一些启示:

请注意,该函数不检查有效的LNK快捷方式。事实上,您可以向它提供任何文件,它将改变文件中的十六进制字节15h,将位32设置为on

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

达斯

”#D.柯林斯-12:58 03/09/2012
“#设置快捷方式以设置RunAs标志。将LNK文件拖到此脚本上进行测试
选项显式
暗淡的桨
Set oArgs=WScript.Arguments
如果桨数>0,则
ret=FSETRUNASONLK(桨(0))
MsgBox“完成,返回=”&ret
其他的
MsgBox“无参数”
如果结束
函数fSetRunAsOnLNK(sInputLNK)
Dim fso、wshShell、oFile、iSize、aInput()、ts、i
设置fso=CreateObject(“Scripting.FileSystemObject”)
设置wshShell=CreateObject(“WScript.Shell”)
如果不存在fso.FileExists(sInputLNK),则fSetRunAsOnLNK=114017:退出函数
文件集=fso.GetFile(sInputLNK)
iSize=文件大小
无线电输入(iSize)
设置ts=oFile.OpenAsTextStream()
i=0
不要使用ts.AtEndOfStream
输入(i)=ts.Read(1)
i=i+1
环
关闭
如果UBound(aInput)<50,则FSETRUNASONLK=114038:退出功能
如果(Asc(aInput(21))和32)=0,则
输入功率(21)=Chr(Asc(输入功率(21))+32)
其他的
fSetRunAsOnLNK=99:退出功能
如果结束
fso.CopyFile sInputLNK,wshShell.ExpandEnvironmentStrings(“%temp%\”&oFile.Name&“&Hour(Now())&“-&Minute(Now())&“-&Second(Now()))
出错时继续下一步
设置ts=fso.CreateTextFile(sInputLNK,True)
如果错误号为0,则fSetRunAsOnLNK=Err.Number:退出函数
ts.Write(Join(aInput,“”)
如果错误号为0,则为fSetR
'# 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