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

相關問題