Ярлык приложения .NET для MSI при запуске обычным пользователем - PullRequest
2 голосов
/ 09 марта 2009

У меня есть приложение C #, которое использует встроенный построитель MSI в Visual Studio 2005.

После развертывания приложения с помощью MSI (через CD) на целевом компьютере я запускаю ярлык на рабочем столе (как привилегированный пользователь), и программа запускается, как и ожидалось. Но если я выйду из системы, а затем вернусь как непривилегированный пользователь и попытаюсь запустить приложение, компьютер начнет искать MSI, потому что он хочет исправить / настроить его. Конечно, это не удается, потому что он не может найти MSI снова.

Однако я могу перейти к папке приложения в Program Files, скопировать ярлык на рабочий стол и запустить его отлично.

Как мне это обойти? Я изменил ряд настроек, пытаясь обойти это без удачи.

РЕДАКТИРОВАТЬ: У меня есть InstallAllUsers = True установлен.

Ответы [ 5 ]

6 голосов
/ 22 июля 2009

Как объяснено здесь , Visual Studio может создавать только «объявленные ярлыки», которые используют файл MSI для проверки наличия всех файлов и значений реестра.

По той же ссылке вы можете найти решение: отредактируйте базу данных MSI, добавив значение в таблицу свойств. Я проверил это, вам просто нужно добавить " DISABLEADVTSHORTCUTS " со значением "1".

Чтобы добавить его, вы можете использовать инструмент ORCA, который является частью Windows Installer SDK . Это ручной способ ... И я полагаю, вам это не понравится.

Итак, я посмотрел дальше и обнаружил, что вы можете сделать это с помощью командной строки и сценария VBS, предоставляемого Windows Installer SDK:

Cscript WiRunSQL.vbs Test.msi "INSERT INTO `Property` (`Property`.`Property`,`Property`.`Value`) VALUES ('DISABLEADVTSHORTCUTS',1)"

Теперь вам нужно просто установить событие после сборки для вашего проекта установки (оно немного отличается от «обычных» проектов, см. здесь ), чтобы выполнить этот скрипт.

У меня это очень хорошо работает!

Дополнительные ресурсы:
Ссылка на таблицу свойств MSI
Редактировать MSI с помощью командной строки

0 голосов
/ 23 сентября 2009

Если MSI записывает какие-либо записи реестра в HKCU, то, когда новый пользователь запускает приложение в первый раз, установщик Windows видит, что записи отсутствуют для этого пользователя, и пытается их создать. Почему установщик Windows считает, что для этого нужен оригинальный файл MSI, мне не понятно (заглушки в C: \ Windows \ Installer должно быть достаточно, но, похоже, ее нет).

В любом случае замена ярлыка не является полным ярлыком, так как другие операции, такие как вызов компонентов COM, могут вызывать тот же процесс самовосстановления, который вызывает объявленный ярлык.

0 голосов
/ 10 марта 2009

По сути, ярлык на рабочем столе - это специальный ярлык, который запускает проверку устойчивости установщика Windows - пытается восстановить отсутствующие файлы, папки и записи реестра.

Скорее всего, я бы сказал, что у вас отсутствуют некоторые записи реестра для каждого пользователя (HKCU или HKCR), и поэтому установщик Windows пытается найти MSI для их воссоздания.

0 голосов
/ 03 апреля 2009

РЕДАКТИРОВАТЬ Июнь 2010: MSI, который я создал, был под VS 2005 на Windows XP. Когда я пытался использовать тот же MSI для установки / удаления под Vista, удаление было не очень чистым. Я не оценил степень или причину, но я не рекомендую использовать это решение в Vista без дальнейшего изучения.

ОРИГИНАЛЬНАЯ ПОЧТА:

Я до сих пор не нашел реального решения моей проблемы, хотя обходной путь - немного хакерский - работает достаточно хорошо для моих целей. Я нашел предложение на каком-то другом сайте (я опубликую ссылку на него, если смогу найти его снова).

Я создал файл VBS, который имеет две функции: одна создает ярлык, а другая создает структуру каталогов по мере необходимости. Когда файл выполняется, он вызывает MakeShortcut столько раз, сколько разработчик сочтет нужным.

Второй файл VBS работает так же, но удаляет ярлыки.

Я вызываю первый файл как часть пользовательского действия (щелкните правой кнопкой мыши по проекту установки, ПРОСМОТР, ПОЛЬЗОВАТЕЛЬСКИЕ ДЕЙСТВИЯ) в папке Install. Я вызываю второй в папке Uninstall.

Проблема заключается в том, что два файла VBS устанавливаются в целевой каталог, а также в остальную часть программы. Возможно, есть способ избавиться от них, но мне все равно, что они там останутся. Опять же, это немного взломано и не так элегантно, как я надеялся, но оно работает достаточно хорошо, пока я не найду лучшего решения.

Вот два файла на случай, если кто-нибудь захочет их использовать:

'CREATE SHORTCUTS.VBS

MakeShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
             "My Prog", _
             "%ProgramFiles%\My prog\prog.exe"


Function MakeShortcut (location, text, target)

    Dim objShortcut
    Dim objShell
    Dim expLocation

    Set objShell = CreateObject("WScript.Shell")
    expLocation  = objShell.ExpandEnvironmentStrings(location)
    expTarget    = objShell.ExpandEnvironmentStrings(target)

    MakeDirectory(expLocation)

    set objShortcut = objShell.CreateShortcut(expLocation & "\" & text & ".lnk") 
    objShortcut.TargetPath = expTarget
    objShortcut.Save
End Function


Function MakeDirectory (newPath)

    Dim objFSO
    Dim arrPath
    Dim length
    Dim count
    Dim path

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    If objFSO.FolderExists(newPath) Then    
        Exit Function
    End If

    path = ""
    count = 0
    arrPath = split(newPath, "\")
    length = ubound(arrPath)
    While count <= length 
        path = path + arrPath(count) + "\"
        count = count + 1
        If Not objFSO.FolderExists(path) Then 
            objFSO.CreateFolder(path)
        End If
    Wend
End Function

УДАЛИТЬ ШОРТКУ.VBS

DeleteShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
               "My Prog.lnk", _
               True


Function DeleteShortcut (location, shortcut, delLoc)

    Dim objShortcut
    Dim objShell
    Dim expLocation

    Set objShell = CreateObject("WScript.Shell")
    Set objFSO   = CreateObject("Scripting.FileSystemObject")
    expLocation  = objShell.ExpandEnvironmentStrings(location)

    DeleteDirectory(expLocation)

    If objFSO.FileExists(expLocation) Then
       objFSO.DeleteFile expLocation & "\" & shortcut
    End If 

    If delLoc = True Then
        DeleteDirectory location
    End If

End Function


Function DeleteDirectory (path)

    Dim objFSO

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    If objFSO.FolderExists(path) Then  
        objFSO.DeleteFolder path, True
    End If
End Function
0 голосов
/ 09 марта 2009

Обычно при установке вы можете установить «для всех» или «только для меня». Обязательно проверяйте всех. Вы даже можете установить это как значение по умолчанию при создании MSI.

Как дополнительное примечание, в более старых версиях MS Office была та же проблема (возможно, она все еще существует; мне не нужно было проверять последние выпуски - и, возможно, это означает, что решения не существует). Еще тогда, когда я работал в небольшом компьютерном магазине, когда мы настраивали новую сборку, мы всегда создавали первоначальные учетные записи пользователей, а затем вручную запускали офис, чтобы сделать этот дополнительный шаг для наших пользователей.

...