web-dev-qa-db-ja.com

共有ファイルの読み取りロックを自動的に閉じる

完全なアクセス許可を持つユーザーが共有を介して共有ファイルの読み取りロックを削除したときに、共有ファイルの読み取りロックを自動的に閉じるようにWindowsを構成することはできますか? これを手動で行う方法 があることは知っていますが、自動的に実行したいと思います。

詳細を追加するために、Windows Server 2012R2を実行しているホストマシンがあります。ホストは、Hyper-VでWindows 10 VMを実行しています。ホストは、「Everyone」が読み取り実行アクセス権を持ち、VMの1人のユーザーがフルアクセス権を持つようなアクセス許可を持つフォルダーも共有しています。 2台目のマシンから(「Everyone」ユーザーとして)共有に接続すると、期待どおりにファイル(読み取り専用)にアクセスし、シェルやメモ帳などで開くことができます。ただし、ファイルを開いているときに、VMユーザーを使用して共有からそれらを削除しようとすると、ファイルに読み取りロックがあるため、システムがハングします。ただし、ホストサーバーからそれらを削除すると、読み取りロックは通常(常にではありません)強制的に削除されます。ホスト上で、またはVMユーザーを介してそれらを削除するときに、この動作を一貫して取得する方法はありますか? 「write-access-overrides-read-locks」共有フラグ?

編集:

私が本当にできることは、ホストサーバーとVMの両方から、シェルとコマンドプロンプトの両方を介して、ファイルの名前を変更して削除し、操作を常に成功させることです。 、他のユーザーが共有を介して読み取るためにファイルを開いている場合でも。

Edit2:

automaticの意味を明確にするために、標準コマンド(rmdireraseなど)を使用している場合でも、読み取りロックを無視する必要があります。など)、シェルインターフェイス、理想的にはWin32 API(後者は必須ではありません)です。スクリプトまたは他のカスタムコマンドの使用は、まったく同じ構文を使用している場合でも、カスタムコマンドを使用するために標準コマンドをフックする方法がない限り機能しません。その理由は、共有ファイルを変更するサードパーティのバッチファイルと実行可能ファイルを実行していて、それらのスクリプトとプログラムがターゲットファイルを変更できない場合に失敗するためです。カスタムのロック解除コマンドを使用するようにサードパーティのファイルを変更することはできません。

これらすべての代わりに、内部ステージングディレクトリを使用してサードパーティのプログラムを実行し、完成した出力の一部を移動することもできますが、私の目標は、出力を共有で利用できるようにすることです。各ピースが完成した後だけでなく、徐々に。

3
MooseBoys

PsExec と少しのバッチ作業で、かなり近づけることができます。

サーバー/ VMでは、リリースコマンドを複雑にするのではなく結び付けたいと思いますexistingに名前を変更し、コマンドプロンプトでコマンドを削除します。暗黙の優先順位は、可能な限りシームレスにすることです。

まず、クライアントでPsExecネットワークの実行を有効にするには、regファイルを作成します。

clients-enable-psexec.reg:

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

これにより、クライアントはサーバー/ VMから送信されたコマンドを実行できます。

サーバー側で、 PsExec をTechNetWebサイトからサーバーVMにダウンロードします。

次に、これらの.batファイルをシステム環境ディレクトリに配置して、サーバー/ VMのどこからでも呼び出すことができるようにします。

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のデフォルトコマンドと一緒にサードパーティのコマンドプロンプトをインストールする必要があります: JPSoft Take Command

ここから取得した上記のコマンド: TCC内部コマンドのオーバーライド-JPSoft

3
Aaron Gillion