none
c# İle Bir Programın Çalışmasını Engelleme RRS feed

  • Genel Tartışma

  • Yazdığım program bilgisayardaki kurulu bütün programları kullanıcıya listeleyip kullanıcının seçtiği programı yine seçtiği bilgisayar oturumda engellemeye çalışıyorum. Bunu nasıl yapabilirim? 

    Seçilen programın exe'sini gizleyebilir miyim ? 

    Seçilen programın c# üzerinden izinlerine ulaşıp ilgili oturumu seçtirebilir miyim ? 

    Yani seçilen programı nasıl çalıştırmamayı başarabilirim ? 

    27 Kasım 2017 Pazartesi 10:15

Tüm Yanıtlar

  • Bu olay C#'dan çok C++ gibi bir dil ile sisteme yakın olarak yapılabilir aksi taktirde tüm makinelerde illa bir kriz yaşarsın. Neden mi? Bir uygulama çalıştırıldığı zaman sistem onu izler, durduk yere kapanırsa (proccess kill olayı gibi) sistem hata tanılama başlatmak isteyebilir veya hata raporlama gönderir. Makul olan o .exe'nin izinlerini ayarlamak olur ama bir de servisler var, ben bir uygulama yazdığımda güncelleme için bile servis kullanıyorum, eğer güncelleme modülü yok ise indir, kur sonra işlemleri yap veya izinleri değiştirilmiş ise düzelt gibisinden komutlar içeriyor. Bunu diğer firmalar ve yazılımcılar da yapıyor, bu yüzden esas mesele .exe'nin silinmesi veya engellenmesi değil aynı zamanda servislerin ve hizmetlerin de takip edilmesi, içeriğinin bilinmesi gerek.


    Üstelik bunlarla da kalmıyor, bir servis durdurdun diyelim tekrar çalıştırmak istediğinde tonla hata ile karşılabilirsin, sonuçta belirli süreçlerin takip etmesi gerekiyor olabilir. Zaten antivirüs gibi programlar direkt core ile haşır neşir, normal olarak onları öylece durduramazsın.

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...


    29 Kasım 2017 Çarşamba 16:11
  • Hocam basit programları kapatmaya çalışacağım. 

    Şuanda kafamdaki bir servis ile saniyede bir çalışılması istenmeyen processi kill etmek. 

    Bu şekilde bir sonuca varabilir miyim ? 

    29 Kasım 2017 Çarşamba 16:46
  • Bu olay C#'dan çok C++ gibi bir dil ile sisteme yakın olarak yapılabilir aksi taktirde tüm makinelerde illa bir kriz yaşarsın. Neden mi? Bir uygulama çalıştırıldığı zaman sistem onu izler, durduk yere kapanırsa (proccess kill olayı gibi) sistem hata tanılama başlatmak isteyebilir veya hata raporlama gönderir. Makul olan o .exe'nin izinlerini ayarlamak olur ama bir de servisler var, ben bir uygulama yazdığımda güncelleme için bile servis kullanıyorum, eğer güncelleme modülü yok ise indir, kur sonra işlemleri yap veya izinleri değiştirilmiş ise düzelt gibisinden komutlar içeriyor. Bunu diğer firmalar ve yazılımcılar da yapıyor, bu yüzden esas mesele .exe'nin silinmesi veya engellenmesi değil aynı zamanda servislerin ve hizmetlerin de takip edilmesi, içeriğinin bilinmesi gerek.


    Üstelik bunlarla da kalmıyor, bir servis durdurdun diyelim tekrar çalıştırmak istediğinde tonla hata ile karşılabilirsin, sonuçta belirli süreçlerin takip etmesi gerekiyor olabilir. Zaten antivirüs gibi programlar direkt core ile haşır neşit, normal olarak onları öylece durduramazsın.

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    "Neden mi?" den sonra açıkladığınız problemler C++ için de aynen geçerli bu sebeple ben C# kullanılmasında bir beis görmüyorum.C# ile bir uygulamayı engellemek için de C++ da da aynı apiların kullanılması gerekecek. C# genellikle böyle durumlarda "nedense" küçümseniyor c# ile  Windows işletim sistemi için driver dahi yazabilirsiniz (kernel mode driver hariç).

    @benna21 eğer bir şeyin olup olmadığını sürekli timer ile kontrol ediyorsan burada bir hata yapıyorsundur. Şöyle düşün form üzerine bir düğme koyduğunda saniyede 1 bu düğmeye tıklandı mı acaba diye kod yazıyor musun? Bunun için varsa öncelikli tercih event mekanizmaları olmalıdır. Bu yoksa ancak polling  uygulanabilir. 

    İşletim sisteminde işlemler hakkında eventleri alabileceğin sınıfın adı ManagementEventWatcher 

    https://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx

    Kod örneğini bilinçli olarak vermiyorum.



    • Düzenleyen Cihan Yakar 29 Kasım 2017 Çarşamba 17:19
    29 Kasım 2017 Çarşamba 17:18
  • @Cihan Yakar

    Hocam dediğiniz konuyu düşünmüştüm aslında yani, 

    İşletim sisteminde processlerin çalışmasını dinleyebilirsem sorunum çözülecekti zaten ama bir türlü başaramadım. 

     void WaitForProcess()
            {
                ManagementEventWatcher startWatch = new ManagementEventWatcher(
                new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
                startWatch.EventArrived
                += new EventArrivedEventHandler(startWatch_EventArrived);
                startWatch.Start();
            }

    Böyle bir mothod ile çözülecek gibi ama bir türlü yapıyı anlayamadım ve çalıştıramadım.


    • Düzenleyen benna21 29 Kasım 2017 Çarşamba 20:14
    29 Kasım 2017 Çarşamba 20:13
  • Processleri sürekli izlemek efektif bir yöntem değil zaten Windows'un bize sunduğu firewall ile bunu yapabiliriz. Kayıt defterine ekleyeceğin policylerle kolayca yapılabilir. Şu dökümanlar yardımcı olabilir. 

    iyi çalışmalar

    https://www.wikihow.com/Block-a-Program-with-Windows-Firewall

    https://blogs.msdn.microsoft.com/securitytools/2009/08/21/automating-windows-firewall-settings-with-c/

    https://technet.microsoft.com/en-us/library/cc737845(WS.10).aspx

    30 Kasım 2017 Perşembe 07:48
  • Processleri sürekli izlemek efektif bir yöntem değil zaten Windows'un bize sunduğu firewall ile bunu yapabiliriz. Kayıt defterine ekleyeceğin policylerle kolayca yapılabilir. Şu dökümanlar yardımcı olabilir. 

    iyi çalışmalar

    https://www.wikihow.com/Block-a-Program-with-Windows-Firewall

    https://blogs.msdn.microsoft.com/securitytools/2009/08/21/automating-windows-firewall-settings-with-c/

    https://technet.microsoft.com/en-us/library/cc737845(WS.10).aspx

    Hocam kayıt defterinde nereye eklemem lazım, bu konuyu da araştırdım lakin bulamadım 
    30 Kasım 2017 Perşembe 11:12
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules

    Tavsiyem Denetim masası > Güvenlik seçeneklerinden herhangi bir program'a firewall'dan kural oluştur. Sonra burdan eklediğin kuralı bul sonra C# ile aynı kaydı ekle. Sonuçları incele. Deneyecektim ama zaman bulamadı :)

    30 Kasım 2017 Perşembe 14:29
  • Bu olay C#'dan çok C++ gibi bir dil ile sisteme yakın olarak yapılabilir aksi taktirde tüm makinelerde illa bir kriz yaşarsın. Neden mi? Bir uygulama çalıştırıldığı zaman sistem onu izler, durduk yere kapanırsa (proccess kill olayı gibi) sistem hata tanılama başlatmak isteyebilir veya hata raporlama gönderir. Makul olan o .exe'nin izinlerini ayarlamak olur ama bir de servisler var, ben bir uygulama yazdığımda güncelleme için bile servis kullanıyorum, eğer güncelleme modülü yok ise indir, kur sonra işlemleri yap veya izinleri değiştirilmiş ise düzelt gibisinden komutlar içeriyor. Bunu diğer firmalar ve yazılımcılar da yapıyor, bu yüzden esas mesele .exe'nin silinmesi veya engellenmesi değil aynı zamanda servislerin ve hizmetlerin de takip edilmesi, içeriğinin bilinmesi gerek.


    Üstelik bunlarla da kalmıyor, bir servis durdurdun diyelim tekrar çalıştırmak istediğinde tonla hata ile karşılabilirsin, sonuçta belirli süreçlerin takip etmesi gerekiyor olabilir. Zaten antivirüs gibi programlar direkt core ile haşır neşit, normal olarak onları öylece durduramazsın.

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    "Neden mi?" den sonra açıkladığınız problemler C++ için de aynen geçerli bu sebeple ben C# kullanılmasında bir beis görmüyorum.C# ile bir uygulamayı engellemek için de C++ da da aynı apiların kullanılması gerekecek. C# genellikle böyle durumlarda "nedense" küçümseniyor c# ile  Windows işletim sistemi için driver dahi yazabilirsiniz (kernel mode driver hariç).

    @benna21 eğer bir şeyin olup olmadığını sürekli timer ile kontrol ediyorsan burada bir hata yapıyorsundur. Şöyle düşün form üzerine bir düğme koyduğunda saniyede 1 bu düğmeye tıklandı mı acaba diye kod yazıyor musun? Bunun için varsa öncelikli tercih event mekanizmaları olmalıdır. Bu yoksa ancak polling  uygulanabilir. 

    İşletim sisteminde işlemler hakkında eventleri alabileceğin sınıfın adı ManagementEventWatcher 

    https://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx

    Kod örneğini bilinçli olarak vermiyorum.



    Haklısınız C# birçok işe yetebiliyor ama şöyle düşündüm, C# ile apileri her zaman mutlak güzellikte veya doğrulukta kullanamayabiliyoruz, ötneğin windows10'da bir tema uygulaması yazmaya çalıştığımda dökümanlara göre gitmeme rağmen sistem çöktü ve onaramadım bile. Ayrıca C++ ile yönetimi biraz daha kolaylaştırabiliyorsunuz diye düşünüyorum, örneğin bir sanallaştırma uygulaması donanımla haberleşmesi için idealdir veya oyun üreticileri büyük oyun motorlarını kullanırken C++ gibi dilleri ağırlıklı olarak kullanıyorlar çünkü directx ve diğer onlarca unsur göz önünde bulunduruluyor. Tabi bunlar kişisel fikrim (amacım küçümsemek değildi), zamanında C++ ile win api'yi daha etkin bir içimde kullanabiliyordum ve kaynakları da oldukça geniş. Elbette C# ile de yapılabilir.

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    2 Aralık 2017 Cumartesi 20:05
  • Eğer ki unsafe bellek erişimi ve assembly kod çalıştırma, kernel mode programming gibi işlemlere girmeyeceksen (donanıma yakın olmak gerekmeyecekse) olay sadece Windows veya DirectX gibi API çağırmak ise istersen Vb6 kullan :) asıl işi API'ın kendisi yaptığı için problem yaşamazsın (burada işletim sistemine yakın olmaya çalışıyorsun). Senin etkin kullanman muhtemlen C++'a çok daha hakim olman ve örnek kodların C++ olmasından kaynaklanıyor. Ya da www.pinvoke.net 'den haberin yok :) 
    3 Aralık 2017 Pazar 18:31