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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top