Paylaşılan dosya okuma kilitlerini otomatik olarak kapatma


3

Tam izinli bir kullanıcı paylaşım yoluyla silerken Windows'u, paylaşılan dosya okuma kilidini otomatik olarak kapatması için yapılandırmak mümkün mü? Bunu elle yapmanın bir yolu olduğunu biliyorum, ancak otomatik olarak gerçekleşmesini istiyorum.

Daha fazla ayrıntı eklemek için, Windows Server 2012 R2 çalıştıran bir ana makinem var. Ana bilgisayar, Hyper-V'de bir Windows 10 VM çalıştırıyor. Ev sahibi ayrıca, "Herkes" okuma yürütme erişimine sahip ve VM'deki bir kullanıcı da tam erişime sahip olacak şekilde izinlere sahip bir klasör paylaşıyor. Paylaşıma ikinci bir makineden ("Herkes" kullanıcısı "olarak) bağlandığımda, dosyalara (salt okunur) beklendiği gibi erişebiliyorum, onları kabukta, not defterinde vb. , Onları VM kullanıcısını kullanarak paylaşımdan silmeye çalışıyorum, sistem dosyada bir okuma kilidi olduğu için sistem kilitleniyor. Ancak, bunları ana bilgisayar sunucusundan silersem, okuma kilitleri genellikle(ama her zaman değil) zorla çıkarıldı. Bir ana bilgisayarda veya VM kullanıcısı aracılığıyla bunları silerken bu davranışı tutarlı bir şekilde gerçekleştirmenin bir yolu var mı, örneğin bir "yazma-erişim-geçersiz kıl-okuma-kilitleme" paylaşım bayrağı?

Düzenle:

Ne gerçekten istiyorum hem kabuk aracılığıyla, ev sahibi sunucusu ve VM hem vardır yapabilmek için ve istemi adlandırmak ve dosyaları silmek ve operasyon her zaman aracılığıyla okumak için diğer kullanıcıların açık dosya olsa bile, başarılı olması için emirdir paylaşım.

Edit2:

Derken bunu kastediyorum netleştirmek için otomatik (örn standart komutları kullanırken, ben salt kilitler bile göz ardı edilmesi gereken rmdir, erasevb) yanı sıra kabuk arayüzü ve ideal hatta Win32 API'leri (ikincisi gerekli değildir gerçi) . Bir komut dosyası veya başka bir özel komut kullanmak, aynı sözdizimini kullanıyor olsa bile, özel komutları kullanmak için standart komutları bağlamanın bir yolu olmadıkça çalışmaz. Bunun nedeni, üçüncü taraf toplu iş dosyalarını ve paylaşılan dosyaları değiştiren yürütülebilir dosyaları çalıştırdığım ve hedef dosyaları değiştiremiyorsa bu komut dosyalarının ve programların başarısız olması. Üçüncü taraf dosyaları özel kilitleme komutları kullanmak için değiştirmek bir seçenek değildir.

Bunların hepsine alternatif olarak üçüncü taraf programlarını dahili bir hazırlık dizini kullanarak çalıştırabileceğimi, daha sonra çıktılarını tamamladıkça değiştirebileceğimi biliyorum, ancak hedefim çıktının paylaşıma sunulmasını sağlamak. kademeli olarak, her bir parça bittikten sonra değil.

Yanıtlar:


2

PsExec ve küçük bir toplu iş ile çok yakınlaşabiliriz .

Sunucunuzda / VM'nizde, mevcut yeniden adlandırmak ve komut istemindeki komutları silmek için bir serbest bırakma komutunu bağlamak isteriz . Zımni önceliğin mümkün olduğunca sorunsuz olması .

İlk olarak, istemcilerde PsExec ağ yürütmesini etkinleştirmek için bir reg dosyası oluşturun:

istemciler etkinleştirmek-psexec.reg:

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

Bu, istemcilerin sunucu / VM tarafından gönderilen komutları çalıştırmalarını sağlayacaktır.

Sunucu tarafında, PsExec'i TechNet web sitesinden sunucu VM'nize indirin .

Ardından, bu .bat dosyalarını bir sistem ortamı dizinine yerleştirin , böylece sunucu / VM üzerindeki herhangi bir yerden çağrılabilirler:

x-del.bat (bağımsız değişken: dosya; delkomut yerine )

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

x-ren.bat (tartışma: dosya, ad)

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

Bu .bat dosyasını tüm istemcilere yerleştirin:

client-release.bat (bağımsız değişken: kapatılacak dosya paylaşımı)

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

Komut Kullanımı:

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

Gerçek Geçersiz Kılma:

Gerçek delkomutu ve sürüm kontrolü vb olan toplu iş dosyalarında kullanmak için diğer dahili komutları geçersiz kılmak istiyorsanız, bu sihri kullanabilirsiniz:

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

Yakalayış?

Windows varsayılan cmd yanında kurulu bir 3. parti komut istemine ihtiyacınız var: JPSoft Take Command

Buradan alınan komutların üstünde: TCC Dahili Komutlarını Geçersiz Kılma - JPSoft


Buna verdiğiniz ayrıntıyı takdir ediyorum ancak davranışlarını x-delve x-renkomutlarını standart komutlara bağlamanın bir yolu olmadıkça , bu benim için işe yaramaz. Bunun nedeni, dosyaların sürüm kontrolü altındaki diğer toplu iş dosyaları tarafından yeniden adlandırılması ve silinmesi ve değiştirilememesidir. Soruya bu detayları ekleyeceğim.
MooseBoys,

Hm, Google'da "dahili" dos komutlarını yeniden yönlendirmek için hiçbir şey bulamadım, ancak çok şanslıysam, bu gece Kaynak Hacker'da cmd.exe yükleyebilir ve dize tablolarında ümit verici bilgiler bulabilirim. Sana geri dönüş yapacağız.
Aaron Gillion

Dahili komutları geçersiz kılmak için daha fazla bilgi ekledim! Güncellenmiş cevabı kontrol et.
Aaron Gillion
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.