3

Можно ли настроить Windows на автоматическое закрытие блокировки чтения общего файла, когда пользователь с полными разрешениями удаляет его через общий ресурс? Я знаю, что есть способы сделать это вручную, но я хочу, чтобы это происходило автоматически.

Чтобы добавить больше деталей, у меня есть хост-компьютер под управлением Windows Server 2012 R2. На хосте установлена виртуальная машина Windows 10 в Hyper-V. Хост также совместно использует папку с разрешениями, так что "Все" имеют доступ на чтение и выполнение, а один пользователь на ВМ имеет полный доступ. Когда я подключаюсь к общему ресурсу со второго компьютера (как пользователь "Все"), я могу получить доступ к файлам (только для чтения), как и ожидалось, открыть их в оболочке, блокноте и т.д. Но если, хотя у меня открыты файлы, я пытаюсь удалить их из общего ресурса с помощью пользователя виртуальной машины, система зависает, поскольку файл заблокирован от чтения. Однако, если я удаляю их с хост-сервера, блокировки чтения обычно (но не всегда) удаляются принудительно. Есть ли способ получить такое поведение последовательно при удалении их на хосте или через пользователя виртуальной машины, например, флаг общего ресурса write-access-overrides-read-locks?

Редактировать:

Чего я действительно хочу, так это того, чтобы можно было как с хост-сервера, так и с виртуальной машины через оболочку и командную строку переименовывать и удалять файлы, и операция всегда была успешной, даже если другие пользователи открывали файлы для чтения через доля.

Edit2:

Чтобы уточнить, что я имею в виду под автоматическим, мне нужно игнорировать блокировки чтения даже при использовании стандартных команд (например, rmdir , erase и т.д.), А также интерфейса оболочки и, в идеале, даже Win32 API (хотя последний не является требуется). Использование сценария или другой пользовательской команды, даже если она использует тот же синтаксис, не будет работать, если только нет способа подключить стандартные команды для использования пользовательских. Причина в том, что я запускаю сторонние пакетные файлы и исполняемые файлы, которые изменяют общие файлы, и эти сценарии и программы завершаются ошибкой, если они не могут изменить целевые файлы. Модификация сторонних файлов для использования пользовательских команд взлома не является опцией.

Я знаю, что в качестве альтернативы всему этому я мог бы запускать сторонние программы с использованием внутреннего промежуточного каталога, а затем перемещать фрагменты их выходных данных по мере их завершения, но моя цель - сделать вывод доступным на общем ресурсе постепенно, а не только после того, как каждая часть закончена.

1 ответ1

2

С PsExec и небольшими пакетными работами мы можем получить довольно чертовски близко.

На вашем сервере / виртуальной машине мы хотим связать, а не усложнить, команду release с существующими командами переименования и удаления в командной строке. Предполагаемый приоритет состоит в том, чтобы он был как можно более плавным.

Во-первых, чтобы включить выполнение PsExec-сети на клиентах, создайте файл reg:

клиенты включить-psexec.reg:

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

Это обеспечит выполнение клиентами команд, отправленных сервером / виртуальной машиной.

На стороне сервера загрузите PsExec с веб-сайта TechNet на виртуальную машину вашего сервера.

Затем поместите эти .bat-файлы в каталог системной среды, чтобы их можно было вызывать из любого места на сервере / виртуальной машине:

x-del.bat (аргумент: файл; заменить команду del )

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

x-ren.bat (аргумент: файл, имя)

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

Разместите этот файл .bat на всех клиентах:

client-release.bat (аргумент: общий ресурс для закрытия)

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

Использование команды:

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:\>

Реальное Переопределение:

Если вы хотите переопределить фактическую команду del и другие внутренние команды для использования в пакетных файлах с контролем версий и т.д., Вы можете использовать эту магию:

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

Подвох?

Вам необходимо установить стороннюю командную строку вместе с Windows cmd по умолчанию: JPSoft Take Command

Вышеприведенные команды взяты отсюда: Переопределить внутренние команды TCC - JPSoft

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .