Automaticamente fechando bloqueios de leitura de arquivos compartilhados

3

É possível configurar o Windows para fechar automaticamente um bloqueio de leitura de arquivo compartilhado quando um usuário com permissões totais o excluir por meio do compartilhamento? Sei que existem maneiras de fazer isso manualmente , mas quero que isso aconteça automaticamente.

Para adicionar mais detalhes, tenho uma máquina host executando o Windows Server 2012 R2. O host está executando uma VM do Windows 10 no Hyper-V. O host também está compartilhando uma pasta com permissões de modo que "Everyone" tenha acesso de leitura e execução e um usuário na VM tenha acesso total. Quando eu me conectar ao compartilhamento de uma segunda máquina (como um usuário "Todos"), eu posso acessar os arquivos (somente leitura) como esperado, abri-los no shell, bloco de notas, etc. Mas se, enquanto eu tenho arquivos abertos , Eu tento excluí-los do compartilhamento usando o usuário da VM, o sistema trava porque há um bloqueio de leitura no arquivo. Se, no entanto, eu os excluir do servidor host, os bloqueios de leitura serão geralmente (mas nem sempre) forçosamente removidos. Existe uma maneira de obter esse comportamento de forma consistente ao excluí-los no host ou através do usuário da VM, por exemplo, um sinalizador de compartilhamento "write-access-overrides-read-locks"?

Editar:

O que eu realmente quero é poder fazer é, tanto do servidor host quanto da VM, através do shell e do prompt de comando, renomear e excluir arquivos e ter a operação sempre bem-sucedida, mesmo se outros usuários tiverem os arquivos abertos para leitura por meio do compartilhamento.

Edit2:

Para esclarecer o que quero dizer com automático , preciso que os bloqueios de leitura sejam ignorados mesmo ao usar os comandos padrão (por exemplo, rmdir , erase , etc.), bem como interface de shell e, idealmente, até mesmo APIs Win32 (embora o último não seja necessário). Usar um script ou outro comando personalizado, mesmo que use exatamente a mesma sintaxe, não funcionará a menos que haja uma maneira de ligar os comandos padrão para usar os personalizados. O motivo é porque estou executando arquivos em lotes e executáveis de terceiros que modificam os arquivos compartilhados, e esses scripts e programas falham se não conseguirem modificar os arquivos de destino. Modificar os arquivos de terceiros para usar comandos de quebra de bloqueio personalizados não é uma opção.

Sei que, como alternativa a tudo isso, posso executar os programas de terceiros usando um diretório temporário interno e passar partes de suas saídas à medida que são finalizadas, mas meu objetivo é disponibilizar a saída sobre a quota progressivamente, não apenas uma vez que cada peça é concluída.

    
por MooseBoys 12.01.2016 / 04:33

1 resposta

2

Podemos ficar muito próximos com o PsExec e com um pequeno trabalho em lote.

No seu servidor / VM, vamos querer amarrar, não complicar , um comando de liberação no existente renomeie e exclua comandos no prompt de comando. A prioridade implícita é que seja tão perfeita quanto possível .

Primeiro, para habilitar a execução da rede PsExec nos clientes, crie um arquivo reg:

clients-enable-psexec.reg:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"LocalAccountTokenFilterPolicy"=dword:00000001

Isso garantirá que os clientes executem comandos enviados pelo servidor / VM.

No lado do servidor, faça o download do PsExec do site do TechNet na sua VM do servidor

Em seguida, coloque esses arquivos .bat em um diretório de ambiente do sistema , para que eles possam ser chamados de qualquer lugar no servidor / VM:

x-del.bat (argumento: arquivo; substituto do comando del )

psexec \* c:\client-release.bat %~n1   :: \* = all network clients, %~n1 = filename
timeout /t 3
del %1

x-ren.bat (argumento: arquivo, nome)

psexec \* c:\client-release.bat %~n1
timeout /t 3
ren %1 %2

Coloque este arquivo .bat em todos os clientes:

client-release.bat (argumento: compartilhamento de arquivos para fechar)

setlocal enabledelayedexpansion
net file > c:\temp.txt
for /F "tokens=*" %%A in (c:\temp.txt) do ( :: Loop through net file output line by line
 echo.%%A | findstr /I /C:"%1">nul && ( :: Check if entry contains file in question
  set vara=%%A
  set varb=!vara:~0,1!  :: First char of line output is PID of of file
  net file !varb! /close
 ) || (
  rem not found, move on
 )
)
del c:\temp.txt

Uso do comando:

c:\> del Z:\ServerFolders\file.doc
File could not be deleted: in use
c:\> ren Z:\ServerFolders\file.doc newfile.doc
Access Denied
c:\> x-del Z:\ServerFolders\file.doc
File Deleted Sucessfully
c:\> x-ren Z:\ServerFolders\file.doc newfile.doc
Renamed
c:\>

O Real Override:

Se você quiser substituir o comando del real e outros comandos internos para uso em arquivos em lote com controle de versão, etc, você pode usar essa mágica:

setdos /i-del
alias del=c:\windows\system32\x-del.bat
setdos /i-ren
alias ren=c:\windows\system32\x-ren.bat

A pegadinha?

Você precisa de um prompt de comando de terceiros instalado junto com o cmd padrão do Windows: Comando Take do JPSoft

Comandos acima tomados daqui: Substituir Comandos Internos do TCC - JPSoft

    
por 22.01.2016 / 11:17