Vários computadores podem ser anexados simultaneamente a um arquivo em um compartilhamento de arquivos do Windows?

2

Estou tentando registrar certas informações da minha rede de máquinas Windows; Eu os configurei para coletar periodicamente essas informações e, em seguida, quero em um único arquivo CSV em uma unidade de rede. Estou usando um VBS para coletar esses dados, usando o OpenTextFile no modo append para gravação. Isso permitirá que vários computadores anexem simultaneamente uma linha a esse arquivo? Ou há outra maneira de fazer isso (além de armazenar um arquivo separado para cada dispositivo).

Eu não me importo com o pedido (eu coleto um timestamp de cada dispositivo).

    
por askvictor 24.05.2013 / 01:37

3 respostas

5

O Windows tem a capacidade de compartilhar o acesso simultâneo a arquivos por meio de mecanismos como bloqueios de intervalo de bytes, em que um processo bloqueia apenas uma determinada região de um arquivo, etc. Mas os aplicativos precisam ser escritos apropriadamente para aproveitar isso. É perfeitamente possível codificar seu aplicativo de forma que você bloqueie o arquivo inteiro, e não apenas uma região dele. Você pode até mesmo bloquear um arquivo para que outro processo não possa ler a partir dele.

No entanto, você complica as coisas quando fala sobre o acesso a um arquivo em um compartilhamento de arquivos de rede. Agora estamos acessando arquivos pelo protocolo de rede SMB.

O SMB usa oplocks (bloqueios oportunistas) e aluga para gerenciar o acesso simultâneo aos arquivos. Os tipos de oplocks e leases são os seguintes:

Oplocks

  • Nível 1, acesso exclusivo Esse bloqueio permite que um cliente abra um arquivo para acesso exclusivo. O cliente pode executar o buffer de leitura antecipada e ler ou gravar em cache.
  • Nível 2, acesso compartilhado Esse bloqueio permite vários leitores simultâneos de um arquivo e nenhum gravador. O cliente pode executar o buffer de leitura antecipada e ler o armazenamento em cache dos dados e atributos do arquivo. Uma gravação no arquivo fará com que os portadores do bloqueio sejam notificados de que o bloqueio foi quebrado.
  • Lote, acesso exclusivo Esse bloqueio recebe o nome do bloqueio usado ao processar arquivos em lote (.bat), que são abertos e fechados para processar cada linha dentro do arquivo. O cliente pode manter um arquivo aberto no servidor, mesmo que o aplicativo tenha (talvez temporariamente) fechado o arquivo. Esse bloqueio suporta leitura, gravação e manipulação de cache.
  • Filtro, acesso exclusivo Esse bloqueio fornece aos aplicativos e aos filtros do sistema de arquivos um mecanismo para abrir o bloqueio quando outros clientes tentam acessar o mesmo arquivo, mas ao contrário de um bloqueio de Nível 2, o arquivo não pode ser aberto excluir acesso e o outro cliente não receberá uma violação de compartilhamento. Este bloqueio suporta o cache de leitura e gravação.

Locações

  • Read (R), acesso compartilhado Permite vários leitores simultâneos de um arquivo e nenhum gravador. Essa concessão permite que o cliente realize o buffer de leitura antecipada e leia o armazenamento em cache.
  • Read-Handle (RH), acesso compartilhado Isso é semelhante ao bloqueio de nível 2, com o benefício adicional de permitir que o cliente mantenha um arquivo aberto no servidor, mesmo que o acessador do cliente tenha fechado o arquivo. (O gerenciador de cache limpará os dados não gravados e limpará as páginas de cache não modificadas com base na disponibilidade de memória.) Isso é superior a um bloqueio de nível 2 porque a concessão não precisa ser interrompida entre as aberturas e fechamentos do identificador de arquivo. (A esse respeito, ele fornece semântica semelhante ao bloqueio de lote.) Esse tipo de concessão é especialmente útil para arquivos que são repetidamente abertos e fechados porque o cache não é invalidado quando o arquivo é fechado e reabastecido quando o arquivo é aberto novamente. proporcionando uma grande melhoria no desempenho para aplicações intensivas de E / S complexas.
  • Read-Write (RW), acesso exclusivo Esta concessão permite que um cliente abra um arquivo para acesso exclusivo. Esse bloqueio permite que o cliente execute armazenamento em buffer de leitura antecipada e leia ou grave em cache.
  • Read-Write-Handle (RWH), acesso exclusivo Esse bloqueio permite que um cliente abra um arquivo para acesso exclusivo. Essa concessão suporta ler, gravar e manipular o armazenamento em cache (semelhante à concessão de manipulação de leitura).

Windows Internals 6ª ed., Mark Russinovich, et al.

Nenhum desses modos lhe dará o acesso de gravação compartilhado que você procura.

Altere sua estratégia. Como o MDMarra disse, o log de eventos do Windows é uma escolha melhor. Outra ideia seria ter todos os clientes gravando em seus próprios arquivos no compartilhamento de arquivos, e então ter um processo de servidor para coletar todos os arquivos e agregá-los. Você menciona em sua pergunta que está escrevendo código, então está em condições de alterar o funcionamento desse aplicativo. Eu sugeriria ir ao StackOverflow e perguntar-lhes sobre a melhor maneira de abordar o acesso de gravação compartilhada a um único arquivo na rede.

    
por 24.05.2013 / 04:45
3

Não. Quando um arquivo é aberto para gravação, ele é bloqueado. Outras tentativas de gravar enquanto bloqueado resultarão em "Acesso negado".

Você deve considerar escrever os eventos que estiverem nos logs de eventos locais e usar as Assinaturas do Log de Eventos para puxar todos esses logs para uma fonte central. A partir daí, você pode exportá-lo para o formato que desejar.

    
por 24.05.2013 / 01:42
1

Outra maneira de lidar com esse problema pode ser que cada máquina tenha um bloqueio exclusivo no arquivo enquanto o grava e libera imediatamente a partir de então, e também cada máquina programada com um loop que tenta obter acesso de gravação ao arquivo, e Ao receber uma mensagem de "acesso negado", basta tentar novamente até que o arquivo esteja disponível. A necessidade dessa pessoa é anexar mensagens de log de tamanho curto ao arquivo comum. Assim, cada máquina iria bloquear o arquivo apenas brevemente. Um loop para obter um bloqueio de gravação exclusivo obteria rapidamente acesso de gravação. Desde que cada processo seja gravado no modo append, acredito que isso deve fornecer a função necessária, sendo que cada máquina adiciona ao arquivo de log conforme necessário.

    
por 17.08.2014 / 22:13