2011-07-11 12 views
5

Ağ paylaşım klasöründeki bir sunucuda bulunan bir uygulamam var. Ağdaki birçok kullanıcı bu dosyayı aynı anda kullanabilir. Bu EXE dosyasının bir güncellemesini yapmak ve bunu yapmak için ağdaki (yanı sıra) bu dosyayı kimin kullandığını bilmek isterim.Ağ paylaşımlı EXE dosyasının birden fazla kullanıcı tarafından kullanıldığını nasıl kontrol edebilirim?

Bu program aracılığıyla kontrol etmek mümkün mü? Örneğin: şu anda bu dosyayı kullanan tüm kullanıcı adlarını listelemek için? Ya da bu dosyadaki kilitlerin sayısını almak için en azından?

Teşekkürler.

+0

bir istemci makineden sunucu tarafında o da yapabilecek istiyorsunuz bu örnek kod? – RRUZ

+1

Tam olarak aradığınızı tam olarak bilmiyorsanız, SysInternal'ın [PsFile] (http://technet.microsoft.com/en-us/sysinternals/bb897552) belirli bir makinede açık dosyalara sahip olduğunu söyleyebilir. Aşina olmadığım bazı NET API'larından bahsetmişler, ancak sizin için bir lider olabilir. – eran

+0

@RRUZ İdeal olarak bir istemci uygulaması olacaktır. İstemci uygulamasının sunucuda bazı updater.exe işlemlerini çalıştırması gerekip gerekmediğini bilmiyorum. @eran Teşekkürler, ben kontrol edeceğim. – Wodzu

cevap

7

bir makinede açık paylaşılan dosyaları ADSI (Active Directory Hizmet Arabirimleri) kullanabilir listelemek için. Eğer Sonra bu yöntem Resources denilen bir yöntem paylaşılan tüm ile bir koleksiyon dönmek içeren IADsFileServiceOperations arayüze erişmek Aktif DS tür kitaplığı

enter image description here

aktarmanız gerekir delphi bu arayüzleri kullanmak için

kaynaklar açıldı.

Kontrol

{$APPTYPE CONSOLE} 

uses 
    ActiveDs_TLB, 
    Variants, 
    ActiveX, 
    SysUtils; 


function ADsGetObject(lpszPathName:WideString; const riid:TGUID; out ppObject):HRESULT; safecall; external 'activeds.dll'; 


procedure ListSharedResourcesInUse; 
var 
    FSO   : IADsFileServiceOperations; 
    Resources  : IADsCollection; 
    Resource  : OleVariant; 
    pceltFetched : Cardinal; 
    oEnum   : IEnumvariant; 
begin 
    //establish the connection to ADSI 
    ADsGetObject('WinNT://./lanmanserver', IADsFileServiceOperations, FSO); 
    //get the resources interface 
    Resources := FSO.Resources; 
    //get the enumerator 
    oEnum:= IUnknown(Resources._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, Resource, pceltFetched) = 0 do 
    begin 
    Writeln(Format('Resource %s User %s',[Resource.Path,Resource.User])); 
    Resource:=Unassigned; 
    end; 
end; 


begin 
try 
    CoInitialize(nil); 
    try 
     ListSharedResourcesInUse; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+0

Teşekkürler @RRUZ, maalesef beklendiği gibi çalışmıyor. Daha spesifik olmak gerekirse, sadece bir kez çalışır. Kullanıcılarla paylaşmak için bir dizin seçtiyse, onu etkinleştiririm ve örneğini çalıştırırsanız bu dizini gösterir. Ama sonra örneğini kapatıp tekrar açarsam hiçbir şey göstermez mi? Çok garip .. – Wodzu

+0

Tamam, şimdi anladım, sunucumun ana bilgisayarında olsa bile ağ üzerinden o kaynağa bağlanmam gerekiyor. Sadece meraktan, bu konuda daha önceki deneyimlerden nefret ettin mi yoksa Internet'e bu konuda yardımcı olmak için mi aradın? – Wodzu

+0

Geçmişte 'ADSI' ile çalıştığımdan, neden soruyorsun? Aslında ADSI, WMI, Scripting ve diğerleri gibi COM tabanlı teknolojilerle çok çalışıyorum. – RRUZ

2

Gerçekten ihtiyacınız olan şey, bir exe dosyasının yerini almaksa, kullanımda olabilir, yürütülebilir dosyayı yeniden adlandırabilir ve ardından yeni dosyayı aynı konuma kopyalayabilirsiniz. Yeni kullanıcılar, yeni yürütülebilir dosyayı çalıştıracaklar, eski (yeniden adlandırılan) biri son kullanıcı çalıştırıldığında, uygulamanın kapatılmasını sağlar.

+1

Bu yaklaşımı birkaç kez başarıyla kullandım. Yine de güvenilir olup olmadığından emin değilim. –

+0

@Silver öneriniz için teşekkürler, ancak bu benim için kabul edilemez. Ben de veritabanını güncellemeliyim, bu yüzden birisinin EXE'i kullanıp kullanmadığını bilmem gerek. – Wodzu

+0

@Wodzu Veritabanını nasıl güncelleyeceğiniz ve EXE'i tek bir atomik işlemle güncelleyeceksiniz. Sorunuza doğrudan bir yanıt olarak, yalnızca EXE güncellemesini ele almak, tüm güncelleme işlemini atomik yapmayacaktır. –

0

Eğer exe başlarsanız, yazma için kilitlenir. Yani, exe'yi değiştirmek veya yeniden adlandırmak güvenlidir, ancak eğer yapamazsanız, bu exe'nin kullanıldığı anlamına gelir.

PsFile ve "net file" dosya açılıp açılmadığını gösterebilir ve dosyayı kapatabilirsiniz. Ancak bu program başlatılan kullanıcılar için iyi değil.

Programın tüm kullanıcılarına ileti göndermek için işlev oluşturursanız en iyisi olduğunu düşünüyorum. Yükseltmeye ihtiyacınız varsa, yeni girişleri devre dışı bırakın ve tüm kullanıcılara mesaj gönderin "Lütfen çıkın, yükseltme gerekli!". Exe'yi değiştirene kadar bunu tekrar deneyin. PsFile dosyayı kimin kullandığını söyleyemez, ancak sadece dosya kullanılıyorsa.

1

Bu bir aşırı istemci olabilir, ancak sunucu-istemci mimarisine sahip olmaktan ne haber? Bir uygulama sunucunuzda çalışıyor olabilir ve bir kullanıcı bir istemci başlattığında, sunucuya bağlanır. vb DEVAM yükseltme, yükseltme için HAZIRLIK, NORMAL

Açtığınız bağlantıların listesi üzerinden yineleme ve gönderebilir Bu şekilde:

mevcut ihtiyaca değiştirebilir denkleme bir "durum/eyalet" Add Sistemin bakım moduna alınacağını veya müşterinin ne zaman piyasaya sürdüğünü herkese bir mesaj, ne olup bittiğini kullanıcıya bildirebilir.

Alkış

+0

Simmilar çözümü hakkında düşünüyordum. Fikir için teşekkürler. – Wodzu

+0

Bundan bahsetme, daha fazla fikir bir cevap bulmaya daha yakın. – Morfic

İlgili konular