it-swarm-pt.tech

Projeto de instalação do VS2008: arquivos de dados de aplicativos compartilhados (por todos os usuários)?

outros antropoides, lírios e pedalinhos!

Estou desenvolvendo um aplicativo de área de trabalho do Windows em C # /. NET/WPF, usando o VS 2008. O aplicativo é necessário para instalar e executar o Vista e as máquinas XP XP. Estou trabalhando em uma instalação/Windows Installer Project 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 necessário para ser um administrador. Isso significa, é claro, que os arquivos não podem entrar no diretório de instalação do programa (como costumavam acontecer antes da chegada do Vista, sim, sim!).

Eu esperava que a solução fosse simples. Vista e XP ambos têm pastas de dados de aplicativos compartilhados destinados a esse fim. ("\ ProgramData" no Vista, "\ Documents and Settings\All Users\Application Dados "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 de dados do aplicativo compartilhado como um destino no projeto de Instalação.

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

O projeto de instalação 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 uma maneira robusta na versão entre Windows a partir de um projeto de instalação do VS 2008? Alguém pode me dizer como?

31
Lyman Enders Knowles

Eu aprendi a resposta para minha pergunta através de outras fontes, sim, sim! Infelizmente, isso não resolveu o meu problema! O que isso faz de mim - um fixador superior? Sim Sim!

Para colocar coisas em um subdiretório da pasta Common Application Data de um projeto de Instalação do VS2008, aqui está o que você faz:

  1. Clique com o botão direito do mouse no seu projeto de instalação no Solution Explorer e escolha "View -> File System".

  2. Clique com o botão direito do mouse 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 correto.)

  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 ridículo (ainda que inegável) fato 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\Todos os usuários\Application Data\Manufacturer\ProductName" (no XP) quando o instalador é executado.

Agora, no Vista, os não administradores não têm acesso de modificação/gravação aos arquivos aqui. Portanto, todos os usuários podem ler os arquivos, mas eles também aparecem em "\ Arquivos de Programas". Então, qual é o objetivo da pasta Common Application Data?

20
Lyman Enders Knowles

Em vez de marcar "Ativar configurações de segurança 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 "instalação" de um projeto de instalaçã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 "Install"
  3. Modificado Main 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 programaticamente as permissões

    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 o "Ativar segurança do ClickOnce" pode fazer com que o usuário veja um prompt indesejado na inicialização do aplicativo. Fazer isso como descrito acima impedirá que isso aconteça. Espero que isso ajude alguém. Eu sei que poderia ter me beneficiado vendo algo assim há alguns dias!

10
ejwipp

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

Estou usando o Visual Studio 2008 e o Windows Vista

6
Ove

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

[CommonAppDataFolder] [Manufacturer] [ProductName]

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

1
Tricky

Eu tive o mesmo problema. O projeto de instalação oferece ao usuário a opção de instalar o aplicativo "apenas para o usuário atual" ou "para todos os usuários :. Consequentemente, o arquivo de banco de dados terminaria na pasta de dados do aplicativo do usuário atual ou Todos os usuários. precisa escrever essas informações em algum lugar para que o aplicativo possa recuperá-las mais tarde, quando se trata de acessar o banco de dados.Como mais você saberia em qual pasta de dados do aplicativo procurar?

Para evitar esse problema, eu só quero 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 substituir os dados um do outro. Essa é uma possibilidade tão remota, porém, que não quero considerá-la.

A primeira peça do quebra-cabeça que recebi 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 garantir que a fonte de dados contenha o espaço reservado DataDirectory. Esta peça veio de aqui . No designer DataSet, localize as propriedades do DataSet, abra o nó Connection e edite a propriedade ConnectionString da seguinte maneira:

Data Source=|DataDirectory|\YourDatabase.sdf

Depois, segui as instruções de Lyman Enders Knowles acima para saber como adicionar a Pasta de Dados do Aplicativo Comum ao projeto de instalação e coloquei o arquivo de banco de dados nessa pasta.

Segui a sugestão de Ove acima, ou seja, marquei a opção "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 do banco de dados ficou acessível para leitura e gravação.

1
cdonner

eu gosto do conceito abaixo, algumas coisas tiradas de cima

  1. Clique com o botão direito do mouse no seu projeto de instalação no Solution Explorer e escolha "View -> File System".

  2. Clique com o botão direito do mouse 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 correto.)

  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 ridículo (ainda que inegável) fato de que existe uma propriedade de pasta chamada "Propriedade". Bebês cheios de raiva, quem vem com 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); 
1
Ahmad

Não tenho certeza se isso vai 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 no seu aplicativo.

Se o que você está dizendo é que deseja instalar em outras pastas na máquina, isso é um problema. Essencialmente, todo o motivo pelo qual a MS restringiu essas coisas é manter o código malicioso fora das máquinas nas quais o usuário não sabe o que está instalando.

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

0
carl