Pergunta

companheiros antropóides e nenúfares e rodas de pás!

Estou desenvolvendo um aplicativo de desktop do Windows em C#/.NET/WPF, usando o VS 2008.O aplicativo é necessário para instalação e execução em máquinas Vista e XP.Estou trabalhando em um projeto de instalação/Windows Installer para instalar o aplicativo.

Meu aplicativo requer acesso de leitura/modificação/gravação a um arquivo de banco de dados SQLCE (.sdf) e alguns outros arquivos do tipo banco de dados relacionados a um controle de terceiros que estou usando.Esses arquivos devem ser compartilhados entre todos os usuários/logins no PC, nenhum dos quais pode ser obrigado a ser Administrador.Isso significa, é claro, que os arquivos não podem ir para o diretório de instalação do próprio programa (como costumavam acontecer antes da chegada do Vista, sim, sim!).

Eu esperava que a solução fosse simples. Vista e XP possuem pastas de dados de aplicativos compartilhados destinadas a essa finalidade. ("\ProgramData" no Vista, "\Documents and Settings\All Users\Application Data" no XP.) A chamada .NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData) existe para encontrar os caminhos para essas pastas em um determinado PC, sim , sim!

Mas não consigo descobrir como especificar a pasta shared-application-data como destino no projeto Setup.

O projeto de instalação oferece uma pasta "Arquivos comuns", mas destinada a componentes de programas compartilhados (não arquivos de dados), geralmente localizada em "Arquivos de programas" e tem as mesmas restrições de segurança que qualquer outra coisa em "Arquivos de programas". sim Sim!

O projeto Setup oferece uma pasta "Dados do aplicativo do usuário", mas é uma pasta por usuário, que é exatamente o que estou tentando evitar, sim, sim!

É possível adicionar arquivos à pasta shared-app-data de maneira robusta e entre versões do Windows a partir de um projeto de configuração do VS 2008?Alguém pode me dizer como?

Foi útil?

Solução

Aprendi a resposta à minha pergunta através de outras fontes, sim, sim!Infelizmente, isso não resolveu meu problema!O que é que isso me torna - um consertador?Sim Sim!

Para colocar coisas em um subdiretório da pasta Common Application Data de um projeto de configuração do VS2008, faça o seguinte:

  1. Clique com o botão direito em seu projeto de configuração no Solution Explorer e escolha "Exibir -> Sistema de Arquivos".

  2. Clique com o botão direito em "Sistema de arquivos na máquina de destino" e escolha "Adicionar pasta especial -> Pasta personalizada".

  3. Renomeie a pasta personalizada para "Pasta de dados de aplicativos comuns". (Este não é o nome que será usado para a pasta resultante, é apenas para ajudá -lo a mantê -lo reto.)

  4. Altere a propriedade DefaultLocation da pasta para "[CommonAppDataFolder][Manufacturer]\[ProductName]".Observe a semelhança com a propriedade DefaultLocation da Pasta do Aplicativo, incluindo o uso estranho de uma única barra invertida.

  5. Maravilhe-se por um momento com o fato ridículo (mas inegável) de que existe uma propriedade de pasta chamada “Propriedade”.

  6. Altere a propriedade Property da pasta para "COMMONAPPDATAFOLDER".

Os arquivos de dados colocados na pasta "Common Application Data" serão copiados para "\ProgramData\Manufacturer\ProductName" (no Vista) ou "\Documents and Settings\All Users\Application Data\Manufacturer\ProductName" (no XP) quando o o instalador é executado.

Acontece que no Vista, os não administradores não têm acesso de modificação/gravação aos arquivos aqui.Assim, todos os usuários podem ler os arquivos, mas também em "Arquivos de Programas".Então, eu me pergunto qual é o objetivo da pasta Common Application Data?

Outras dicas

Em vez de marcar "Ativar configurações de segurança do ClickOnce" e selecionar "Este é um aplicativo de confiança total", é possível alterar as permissões do CommonAppDataDirectory do seu aplicativo com uma ação personalizada na seção "instalar" de um projeto de configuração.Aqui está o que eu fiz:

  1. Adicionada uma ação personalizada para chamar o aplicativo que está sendo instalado (como alternativa, você pode criar um programa/dll separado e chamá-lo)
  2. Defina a propriedade Arguments como "Instalar"
  3. Main modificado em Program.cs para verificar esse argumento:

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. Escreveu a função SetPermissions para alterar permissões programaticamente

    public static void SetPermissions() { String path = GetPath(); try { // Create security idenifier for all users (WorldSid) SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(); // add a new file access rule w/ write/modify for all users to the directory security object
    ds.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, // all sub-dirs to inherit PropagationFlags.None, AccessControlType.Allow)); // Turn write and modify on // Apply the directory security to the directory di.SetAccessControl(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

Como o instalador é executado com direitos de administrador, o programa poderá alterar as permissões.Li em algum lugar que "Ativar segurança ClickOnce" pode fazer com que o usuário veja um prompt indesejado na inicialização do aplicativo.Fazer conforme descrito acima evitará que isso aconteça.Espero que isso ajude alguém.Eu sei que poderia ter me beneficiado ao ver algo assim há alguns dias!

Eu resolvi assim.Mantive o arquivo do banco de dados (.sdf) na mesma pasta onde o aplicativo está instalado (Pasta do Aplicativo).Na guia de segurança da janela de propriedades do projeto principal, marquei "Ativar configurações de segurança do ClickOnce" e selecionei "Este é um aplicativo de confiança total", reconstruí e executei a configuração.Depois disso, não há problema de segurança

Estou usando o Visual Studio 2008 e o Windows Vista

Isso funcionou para mim usando o VS2005, mas tive que alterar o DefaultLocation, adicionei um '\' para separar o CommonAppDataFolder.

[CommonAppDataFolder][Fabricante][Nome do Produto]

Não sei se isso foi um erro de digitação, mas Lyman se referiu ao uso estranho de uma única barra invertida, mas isso não parece correto.

Eu tive o mesmo problema.O projeto de configuração dá ao usuário a opção de instalar o aplicativo “somente para o usuário atual” ou “para todos os usuários:.Conseqüentemente, o arquivo de banco de dados acabaria na pasta de dados do aplicativo do usuário atual ou na pasta de dados do aplicativo Todos os Usuários.O setup teria que escrever essas informações em algum lugar para que a aplicação pudesse recuperá-las posteriormente, quando se tratasse de acessar o banco de dados.De que outra forma ele saberia em qual pasta de dados do aplicativo procurar?

Para evitar esse problema, desejo apenas instalar o banco de dados na pasta Todos os usuários/Dados do aplicativo, independentemente de o aplicativo ter sido instalado para um usuário ou para todos os usuários.Percebo, é claro, que dois usuários não poderiam instalar o aplicativo no mesmo computador sem sobrescrever os dados um do outro.Esta é uma possibilidade tão remota que não quero considerá-la.

A primeira peça do quebra-cabeça que consegui aqui:

Form_Load(object sender, EventArgs e)
{
  // Set the db directory to the common app data folder
  AppDomain.CurrentDomain.SetData("DataDirectory", 
            System.Environment.GetFolderPath
           (System.Environment.SpecialFolder.CommonApplicationData));
}

Agora precisamos ter certeza de que a fonte de dados contém o espaço reservado DataDirectory.Esta peça veio de aqui.No designer DataSet, encontre as propriedades do DataSet, abra o nó Connection e edite a propriedade ConnectionString para ter a seguinte aparência:

Data Source=|DataDirectory|\YourDatabase.sdf

Em seguida, segui as instruções de Lyman Enders Knowles acima sobre como adicionar a pasta Common Application Data ao projeto de configuração e coloquei o arquivo de banco de dados nessa pasta.

Então segui a sugestão de Ove acima, ou seja.Marquei "Ativar configurações de segurança do ClickOnce" e selecionei "Este é um aplicativo de confiança total.

Depois disso, o aplicativo foi implantado corretamente no Vista e o arquivo de banco de dados ficou acessível para leitura e gravação.

eu gosto do conceito abaixo, algumas coisas tiradas de cima

  1. Clique com o botão direito em seu projeto de configuração no Solution Explorer e escolha "Exibir -> Sistema de Arquivos".

  2. Clique com o botão direito em "Sistema de arquivos na máquina de destino" e escolha "Adicionar pasta especial -> Pasta personalizada".

  3. Renomeie a pasta personalizada para "Pasta de dados de aplicativos comuns". (Este não é o nome que será usado para a pasta resultante, é apenas para ajudá -lo a mantê -lo reto.)

  4. Altere a propriedade DefaultLocation da pasta para "[CommonAppDataFolder][Manufacturer][ProductName]".Observe a semelhança com a propriedade DefaultLocation da Pasta do Aplicativo, incluindo o uso estranho de uma única barra invertida.

  5. Marvel por um momento no fato ridículo (mas inegável) de que existe uma propriedade de pasta chamada "Propriedade". Bebês cheios de raiva, quem inventa essa merda?

  6. Altere a propriedade Property da pasta para "COMMONAPPDATAFOLDER".

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

Não tenho certeza se isso ajudará no seu caso ou não.

Mas se você adicionar uma seção privada ao arquivo de configuração do seu aplicativo

Você pode especificar pastas extras para fazer check-in em seu aplicativo.

Se o que você está dizendo é que deseja instalar em outras pastas na máquina, isso é um problema.Essencialmente, toda a razão pela qual a MS restringiu esse material é manter o código malicioso de máquinas onde o usuário não tem consciência do que está instalando.

Então, isso não funcionará se você precisar de outro diretório.O que essa correção faz é permitir que você especifique onde dentro do seu aplicativo procure arquivos ......

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top