.NET App atalhos para MSI quando executados por usuário regular
-
06-07-2019 - |
Pergunta
Eu tenho um aplicativo C# que usa o construtor MSI embutido no Visual Studio 2005.
Depois de implantar o aplicativo usando o MSI (via CD) no computador de destino, iniciei o atalho de desktop (como usuário privilegiado) e o programa é executado conforme o esperado. Mas, se eu fizer login e depois voltar como um usuário sem privilégios e tentar executar o aplicativo, o computador começará a procurar o MSI porque deseja corrigi -lo/configurá -lo. É claro que isso falha porque não consegue encontrar o MSI novamente.
No entanto, posso navegar até a pasta do aplicativo nos arquivos de programas e copiar um atalho para a área de trabalho e executar isso perfeitamente bem.
Quão dow eu entendi isso? Mudei várias configurações tentando contornar isso sem sorte.
EDIT: Eu tenho installallusers = conjunto true.
Solução
Como explicado aqui, o Visual Studio pode criar apenas "atalhos anunciados" que usam o arquivo MSI para verificar se todos os arquivos e valores do registro estão presentes.
No mesmo link, você pode encontrar a solução: edite o banco de dados MSI para adicionar um valor na tabela de propriedades. Eu testei, você só precisa adicionar "DisableadvtShortcuts"Com o valor" 1 ".
Para adicioná -lo, você pode usar a ferramenta ORCA que faz parte do Windows Installer SDK. Esta é a maneira manual ... e suponho que você não vai gostar.
Então, olhei mais longe e descobri que você pode fazer isso com uma linha de comando e um script VBS fornecido pelo Window Installer SDK:
Cscript WiRunSQL.vbs Test.msi "INSERT INTO `Property` (`Property`.`Property`,`Property`.`Value`) VALUES ('DISABLEADVTSHORTCUTS',1)"
Agora você só precisa definir um evento de construção para o seu projeto de configuração (é um pouco diferente dos projetos "regulares", veja aqui) para executar este script.
Funciona muito bem para mim !
Recursos adicionais :
Referência da tabela de propriedades MSI
Edite MSI com linha de comando
Outras dicas
Normalmente, há uma opção quando você instala para instalar para "todo mundo" ou "apenas eu". Certifique -se de verificar todos. Você pode até defini -lo como padrão ao criar o MSI.
Como uma nota adicional, as versões mais antigas do MS Office tiveram o mesmo problema (talvez ainda tenha; eu não precisei verificar edições recentes - e talvez isso signifique que não haja solução). Quando eu costumava trabalhar para uma pequena loja de computadores sempre que configuramos uma nova compilação, sempre criamos as contas de usuário iniciais e, em seguida, iniciavamos manualmente o Office uma vez para obter esse passo extra para fora para nossos usuários.
Basicamente, o atalho de desktop é um atalho especial que aciona a verificação de resiliência do instalador do Windows - tentando restaurar arquivos, pastas e entradas de registro ausentes.
Provavelmente, eu diria que você tem algumas entradas de registro por usuário (HKCU ou HKCR) que estão faltando e, portanto, o Windows Installer tenta encontrar o MSI para recriá-los.
Se o MSI gravar alguma entrada de registro no HKCU, quando um novo usuário executar o aplicativo pela primeira vez, o Windows Installer verá que as entradas não estão presentes para esse usuário e tenta criá -las. Por que o Windows Installer acha que precisa do arquivo MSI original para isso está além de mim (o stub em C: Windows Installer deve ser suficiente, mas não parece ser).
De qualquer forma, substituir o atalho não é um atalho completo, pois outras operações, como invocar componentes com, pode invocar o mesmo processo de autocura que o atalho anunciado chama.
Editar junho de 2010: O MSI que eu criei estava sob o VS 2005 no Windows XP. Quando tentei usar o mesmo MSI para instalar/desinstalar no Vista, a desinstalação não era muito limpa. Não avaliei a extensão ou a causa, mas não recomendo usar esta solução no Vista sem investigação adicional.
Postagem original:
Ainda não encontrei uma solução real para o meu problema, embora a solução alternativa - um pouco de hack - funcione bem o suficiente para meus propósitos. Encontrei a sugestão em outro site (vou postar um link para ele, se conseguir encontrá -lo novamente).
Criei um arquivo VBS que possui duas funções: uma cria um atalho e o outro cria a estrutura do diretório conforme necessário. Quando o arquivo é executado, ele chama o MakeHortcut quantas vezes que o desenvolvedor achar adequado.
O segundo arquivo VBS funciona da mesma maneira, mas exclui os atalhos.
Eu chamo o primeiro arquivo como parte de uma ação personalizada (clique com o botão direito do mouse no projeto de configuração, visualização, ações personalizadas) na pasta de instalação. Eu ligo para o segundo na pasta de desinstalação.
O problema é que os dois arquivos VBS são instalados no diretório de destino, bem como no restante do programa. Provavelmente há uma maneira de se livrar deles, mas eu realmente não me importo que eles fiquem lá. Novamente, isso é um pouco de hack e não tão elegante quanto eu esperava, mas funciona bem o suficiente até encontrar uma solução melhor.
Aqui estão os dois arquivos, caso alguém queira usá -los:
'Crie atalhos.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
Exclua atalhos.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