/ / Skrót do aplikacji .NET dla MSI uruchamiany przez zwykłego użytkownika - visual-studio-2005, instalator systemu Windows, skróty

Skrót aplikacji .NET dla MSI, gdy uruchamiany jest przez zwykłego użytkownika - visual-studio-2005, instalator systemu Windows, skróty

Mam aplikację C #, która korzysta z wbudowanego konstruktora MSI w Visual Studio 2005.

Po wdrożeniu aplikacji za pomocą MSI(przez CD) na komputer docelowy, uruchamiam skrót na pulpicie (jako użytkownik uprzywilejowany) i program działa zgodnie z oczekiwaniami. Ale jeśli wyloguję się, a następnie zaloguję jako użytkownik nieuprzywilejowany i spróbuję uruchomić aplikację, komputer zacznie szukać pliku MSI, ponieważ chce go naprawić / skonfigurować. Oczywiście kończy się to niepowodzeniem, ponieważ nie można ponownie znaleźć pliku MSI.

Mogę jednak przejść do folderu aplikacji w Program Files i skopiować skrót na pulpit i uruchomić go idealnie.

Jak mogę to obejść? Zmieniłem wiele ustawień, próbując obejść to bez powodzenia.

EDYCJA: Mam InstallAllUsers = True set.

Odpowiedzi:

6 dla odpowiedzi № 1

Jak wyjaśniono tutaj, Visual Studio może tworzyć tylko „reklamowane skróty”, które używają pliku MSI do sprawdzania, czy wszystkie pliki i wartości rejestru są obecne.

W tym samym łączu możesz znaleźć rozwiązanie: edytuj bazę danych MSI, aby dodać wartość w tabeli Właściwości. Przetestowałem to, wystarczy dodać „DISABLEADVTSHORTCUTS„o wartości„ 1 ”.

Aby go dodać, możesz użyć narzędzia ORCA, które jest częścią Pakiet SDK Instalatora Windows. To jest ręczny sposób ... I przypuszczam, że ci się nie podoba.

Poszedłem więc dalej i odkryłem, że możesz to zrobić za pomocą wiersza polecenia i skryptu VBS dostarczonego przez zestaw SDK Instalatora Windows:

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

Teraz musisz tylko ustawić wydarzenie po kompilacji dla swojego projektu instalacyjnego (różni się nieco od „zwykłych” projektów, patrz tutaj) w celu wykonania tego skryptu.

Działa dla mnie bardzo dobrze!

Dodatkowe zasoby :
Odwołanie do tabeli właściwości MSI
Edytuj MSI za pomocą wiersza polecenia


0 dla odpowiedzi nr 2

Zwykle jest opcja podczas instalacji, aby zainstalować dla „wszystkich” lub „tylko dla mnie”. Upewnij się, że wszyscy są zaznaczeni. Możesz nawet ustawić to jako domyślne podczas budowania MSI.

Jako dodatkową uwagę, starsze wersje MSPakiet Office miał ten sam problem (może nadal występuje; nie musiałem sprawdzać najnowszych wydań - a może to oznacza, że ​​nie ma rozwiązania). Dawno temu, kiedy pracowałem dla małego sklepu komputerowego, ilekroć konfigurowaliśmy nową wersję zawsze tworzymy początkowe konta użytkowników, a następnie raz ręcznie uruchamiamy biuro, aby uzyskać ten dodatkowy krok dla naszych użytkowników.


0 dla odpowiedzi № 3

Zasadniczo skrót na pulpicie jest specjalnym skrótem, który uruchamia sprawdzanie odporności instalatora systemu Windows - próbuje przywrócić brakujące pliki, foldery i wpisy rejestru.

Najprawdopodobniej brakuje mi niektórych wpisów rejestru dla poszczególnych użytkowników (HKCU lub HKCR), dlatego Instalator Windows próbuje znaleźć plik MSI w celu ich odtworzenia.


0 dla odpowiedzi nr 4

Jeśli MSI zapisuje wpisy rejestru w HKCU,wtedy, gdy nowy użytkownik uruchamia aplikację po raz pierwszy, Instalator Windows widzi, że wpisy nie są dla tego użytkownika, i próbuje je utworzyć. Dlaczego Instalator Windows uważa, że ​​potrzebuje do tego oryginalnego pliku MSI, to jest poza mną w C: WindowsInstaller powinien wystarczyć, ale wydaje się, że nie jest).

W każdym razie zastąpienie skrótu nie jest kompletnym skrótem, ponieważ inne operacje, takie jak wywoływanie komponentów COM, mogą wywoływać ten sam proces samonaprawiania, który wywołuje reklamowany skrót.


0 dla odpowiedzi № 5

EDYCJA cze 2010: MSI, który utworzyłem, był w wersji VS 2005 na Windows XP. Kiedy próbowałem użyć tego samego MSI do zainstalowania / odinstalowania w systemie Vista, odinstalowanie nie było bardzo czyste. Nie oceniłem zakresu ani przyczyny, ale nie zalecam używania tego rozwiązania w systemie Vista bez dalszego badania.

ORYGINALNY POST:

Nadal nie znalazłem prawdziwego rozwiązaniaproblem, chociaż obejście - trochę włamania - działa wystarczająco dobrze dla moich celów. Znalazłem sugestię na innej stronie (opublikuję link do niej, jeśli kiedykolwiek będę mógł ją ponownie znaleźć).

Utworzyłem plik VBS, który ma dwie funkcje: jeden tworzy skrót, a drugi tworzy strukturę katalogów zgodnie z potrzebami. Kiedy plik się uruchamia, wywołuje MakeShortcut tyle razy, ile deweloper uzna za stosowny.

Drugi plik VBS działa w ten sam sposób, ale usuwa skróty.

Pierwszy plik nazywam w ramach akcji niestandardowej (kliknij prawym przyciskiem myszy projekt instalacyjny, WIDOK, AKCJE NIESTANDARDOWE) w folderze instalacyjnym. Nazywam drugi w folderze Uninstall.

Problem polega na tym, że dostają dwa pliki VBSzainstalowany w katalogu docelowym, a także reszta programu. Prawdopodobnie istnieje sposób, aby się ich pozbyć, ale tak naprawdę nie dbam o to, żeby tam pozostali. Ponownie jest to trochę hack i nie tak elegancki, jak miałem nadzieję, ale działa wystarczająco dobrze, dopóki nie znajdę lepszego rozwiązania.

Oto dwa pliki na wypadek, gdyby ktoś chciał z nich skorzystać:

„UTWÓRZ SHORTCUTS.VBS

MakeShortcut "%AllUsersProfile%Start MenuProgramsMy Prog Folder", _
"My Prog", _
"%ProgramFiles%My progprog.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

USUŃ SKRÓTY. VBS

DeleteShortcut "%AllUsersProfile%Start MenuProgramsMy 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