Как установить флаг «Запуск от имени администратора» на ярлыке, созданном установщиком MSI - PullRequest
3 голосов
/ 11 июля 2011

У меня есть проект установки и развертывания в Visual Studio 2010.

Я бы хотел, чтобы установщик создал два ярлыка для исполняемого файла другого проекта в моем решении.Один обычный ярлык, который просто запускает приложение, используя текущие учетные данные, а другой, у которого установлен флаг Запуск от имени администратора , тем самым гарантируя, что при нажатии ярлыка у пользователя запрашиваются учетные данные с правами администратора.

Set

Запуск приложения с правами администратора включает определенные функции, которые в противном случае недоступны.

Установка этого флага на первый взгляд кажется невозможной.Это можно сделать прямо в Visual Studio?Если нет, есть ли другие варианты?

Редактировать: Если нет, можно ли программно изменить ярлык с помощью пользовательского класса установщика?

Ответы [ 5 ]

6 голосов
/ 03 сентября 2012

Я знаю, что это довольно старый вопрос, но мне нужно было найти ответ, и я подумал, что смогу помочь другим искателям. Я написал небольшую функцию для выполнения этой задачи в VBScript (вставлено ниже). Он легко адаптируется к VB.net / VB6.

Коды возврата из функции:
0 - успех, изменение ярлыка.
99 - флаг ярлыка уже установлен для запуска от имени администратора.
114017 - файл не найден
114038 - Недопустимый формат файла данных (в частности, файл слишком мал)
Все остальные ненулевые = непредвиденные ошибки.


Как упоминал Чада в более позднем посте, этот сценарий не будет работать на объявленных ярлыках MSI. Если вы используете этот метод для управления битами в ярлыке, это должен быть стандартный нерекламированный ярлык.

Ссылка: Формат ярлыка MS LNK: http://msdn.microsoft.com/en-us/library/dd871305
Некоторое вдохновение: Чтение и запись двоичного файла в 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
5 голосов
/ 26 июля 2011

Во многом это связано с тем, что установщик Windows использует «объявленные ярлыки» для пакетов установщика Windows.

Нет никакого способа отключить это в Visual Studio, но можно изменить созданный MSI, чтобы убедиться, что он не использует объявленные ярлыки (или использует только один). Есть 2 способа сделать это:

  • Если ваше приложение использует один или два exe-файла - используйте ORCA для редактирования MSI. Под таблицей ярлыков измените Целевую запись на «[TARGETDIR] \ MyExeName.exe» - где MyExeName - имя вашего exe - это гарантирует, что этот конкретный ярлык не будет объявлен.
  • Добавьте DISABLEADVTSHORTCUTS = 1 в таблицу свойств MSI, используя ORCA или событие после сборки (используя скрипт WiRunSQL.vbs). Если вам нужно больше информации об этом, дайте мне знать. Это отключает все объявленные ярлыки.

может быть лучше использовать первый подход, создать 2 ярлыка и изменить только один в ORCA, чтобы вы могли щелкнуть правой кнопкой мыши и запустить в качестве администратора.

Надеюсь, это поможет

3 голосов
/ 12 июля 2011

Это не поддерживается установщиком Windows. Повышение обычно обрабатывается приложением через манифест .

Решением является создание оболочки (VBScript или EXE), которая использует ShellExecute с runas глаголом для запуска приложения в качестве администратора. Ваш ярлык может затем указывать на эту оболочку вместо фактического приложения.

1 голос
/ 04 июня 2013

Мне нужно было сделать так, чтобы в моем приложении запрашивались права администратора при запуске из меню «Пуск» или из программных файлов.

Я добился такого поведения после установки в \ bin \ Debug \ my_app.exe 'Запустить эту программу какфлажок администратора в true.(находится в разделе «Свойства \ Совместимость»).

При установке проекта этот файл копировался в файлы программ (и, следовательно, в меню «Пуск») с необходимым поведением.

Спасибо, Павло

1 голос
/ 27 июля 2011

Извините за путаницу - теперь я понимаю, что вам нужно.

Действительно, есть способы установить флаг ярлыка, но ни один из тех, которые я знаю прямо в Visual Studio. Я нашел ряд функций, написанных на C ++, которые устанавливают флаг SLDF_RUNAS_USER на ярлык.

Некоторые ссылки на такие функции включают:

Другое интересное обсуждение на ту же тему было проведено на форумах NSIS, ветка может быть полезной. В списке есть функция, которая может быть встроена, а также упоминание места в реестре, в котором хранятся такие настройки ярлыков (это, кажется, самый простой способ, если он работает) - я не могу проверить метод реестра в данный момент но можно сделать чуть позже, чтобы увидеть, работает ли он.

Эту тему можно найти здесь: http://forums.winamp.com/showthread.php?t=278764

Если вы очень заинтересованы в том, чтобы делать это программно, то, возможно, вы могли бы адаптировать одну из функций выше для запуска в качестве задачи после установки? Это установит флаг ярлыка после вашей установки, но это снова нужно сделать для ярлыков без рекламы, чтобы MSI пришлось исправить, как я упоминал ранее.

Я продолжу искать и протестировать метод настройки реестра, чтобы проверить, работает ли он, и доложить.

1024 * Chada *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...