Merhaba, C# Çalışan Bir Uygulamanın Sahibini Bulmak? – Process Owner dersim ile C# eğitim setime devam ediyorum. Bu dersimiz Görev Yöneticisinde çalışan bir uygulamanın hangi kullanıcı tarafından çalıştırıldığını bulmaya çalışacağız. Bu dersimiz C# Programın İki Kere Açılmasını Engellemek dersim ile alakalı bir derstir. Yani bir programın iki kere açılmasını istemiyoruz ama bir bilgisayarı birden fazla kişi kullanıyor ise kullanıcıların kendi kullanıcılarında programı kullanabilmelerini isteyebiliriz. Eğer bu derste göreceğiniz gibi yapmazsanız bilgisayarda projemiz bir kere açık olacağından diğer kullanıcılar açamayacak. Bu da istemediğimiz bir durum.
Bu konu da bir soru olarak gelmişti. Bende gerçekten önemli ve zor bulanacak bir işlem olduğundan dolayı ders olarak ekleme kararı aldım.
C# Çalışan Bir Uygulamanın Sahibini Bulmak? – Process Owner
Process Owner işlemi aslında Görev Yöneticisinde çalışan bir programın, o bilgisayardaki hangi windows kullanıcısı tarafından açıldığını bulacağız. Yani çalışan uygulamayı kim çalıştırdı? sorusuna cevap bulacağız. Aşağıdaki gibi bir form tasarımı yaptım. İlk olarak bilgilerin doğru geldiğini görelim. Dersin sonunda asıl işlemi vereceğim.
Yapacağımız işlem, bir kullanıcı projemizi sadece bir kere çalıştırabilmesini sağlamak. Diyelim ki ben bilgisayardaki işimi bitirdim ve gittim. Başkası geldi kendi kullanıcısı ile giriş yapmak istediğinde giriş yapamayacak çünkü biz projemizin sadece bir kere açılmasını sağlamıştık. Ama bu durum bir sorun haline geldi. Bizde projeyi çalıştıran kişi, mevcutta çalışan projeyi çalıştıran kişi değil ise, projemiz çalışsın diyeceğiz.
Öncelikle gerekli NameSpace’leri ekleyelim.
using System.Management; using System.Diagnostics;
Windows Aktif Kullanıcı Adını Almak ve Exe Adını Almak
NameSpace’leri ekledikten sonra ilk işimiz windows aktif kullanıcının adını almak ve projemizin exe adını almak olacak. Bilgileri alacağız ve textbox lara yazacağız. Form Load eventine işlemleri yapalım.
private void Form1_Load(object sender, EventArgs e) { txt_exe_adi.Text = System.Diagnostics.Process.GetCurrentProcess().ProcessName; txt_win_kullanici.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name; }
yukarıdaki kodlarımız ile kullanıcı adını ve exe adını aldık. Bu bilgiler bize gerekli olacak.
Uygulamanın PID Değerini Almak
Şimdi yukarıda uygulamamızın adını aldıktan sonra bu bilgi ile projenin ID bilgisini alıp çalıştıran kullanıcıyı bulacak olan metodumuzu çalıştıracağız. İşlemleri Getir butonumuzun click eventine gelelim ve kodlarımızı yazalım.
private void btn_islemler_getir_Click(object sender, EventArgs e) { System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(txt_exe_adi.Text); for (int i = 0; i < processes.Count(); i++) { txt_id.Text = processes[i].Id.ToString(); GetProcessOwner(processes[i].Id); } }
İlk olarak aynı exe adına sahip işlemlerin listesi array olarak alıyoruz.
Array listteki işlem (process) sayısına göre bir döngü başlatıyoruz.
Alınan ID bilgisini textbox’a yazıyoruz.
Aldığımız ID bilgisini kullanıcı adını bulacak metodumuza parametre olarak gönderiyoruz.
Çalışan Exe Kullanıcı Bilgisini Almak
public string GetProcessOwner(int processId) { string query = "Select * From Win32_Process Where ProcessID = " + processId; ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection processList = searcher.Get(); foreach (ManagementObject obj in processList) { string[] argList = new string[] { string.Empty, string.Empty }; int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList)); if (returnVal == 0) { // return DOMAIN\user string owner = argList[1] + "\\" + argList[0]; txt_user.Text = owner; return owner; } } return "Sahiplik Yok"; }
Yıkarıdaki metodumuz, parametre olarak adlığı işlem ID üzerinden Görev Yöneticisinde çalışan uygulamayı bulacak.
Çalışan her uygulamanın bir PID değeri vardır. Bu değerleri Görev Yöneticisinden görebiliriz. Aşağıdaki gibi görev yöneticisinden uygulamamızı bulalım ve sağ tıklayıp Ayrıntılara gidelim.
Sarı renkle işaretlenmiş satırdaki PID değeri bizim ID değerimiz oluyor. (PID = Process ID) Burada projemin PID’i 16740.
Yukarıda verdiğim metod ise bu ID numarası üzerinden, yukarıdaki görselde gördüğünüz Kullanıcı adı kolonundaki Mustafa bilgisini alacak.
Aldığım bilgiler şöyle görünüyor.
Program.cs
Evet bize lazım olacak kodlarımız bu kadardı. İstediğimiz tüm bilgiler elimizde. Şimdi size dersler projemin program.cs dosyasını olduğu gibi atacağım.
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace mustafabukulmez_com_dersler { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { int kapat = 0; string exe_Adi = System.Diagnostics.Process.GetCurrentProcess().ProcessName; string aktif_kullanici = System.Security.Principal.WindowsIdentity.GetCurrent().Name; System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(exe_Adi); string mevcut_calisan_kul_adi = ""; for (int i = 0; i < processes.Count(); i++) { mevcut_calisan_kul_adi = GetProcessOwner(processes[i].Id); } if (System.Diagnostics.Process.GetProcessesByName(exe_Adi).Length > 1) { if (mevcut_calisan_kul_adi == aktif_kullanici) { kapat = 1; MessageBox.Show("Program zaten çalışıyor"); } } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (kapat == 0) { Application.Run(new AnaForm()); } } static string GetProcessOwner(int processId) { string query = "Select * From Win32_Process Where ProcessID = " + processId; System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query); System.Management.ManagementObjectCollection processList = searcher.Get(); foreach (System.Management.ManagementObject obj in processList) { string[] argList = new string[] { string.Empty, string.Empty }; int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList)); if (returnVal == 0) { // return DOMAIN\user string owner = argList[1] + "\\" + argList[0]; return owner; } } return "Sahiplik Yok"; } } }
Kodlarımızı açıklayalım.
- Programın açılıp açılmayacağını belirleyecek bir değişken tanımlıyoruz.
- Exe adını ve aktif kullanıcı adını alıyoruz.
- Exe adı ile aynı isme sahip işlemlerin Array listesini alıyoruz
- Mevcutta çalışan (varsa) uygulamanın hangi kullanıcı tarafından çalıştırıldığını buluyoruz.
- İlk İf kontrolünün amacı şudur;
- Programı ilk defa çalıştırdığımızda Array listemizde bir item olacak ki o da bizim çalıştırdığımız exe olacak. Yani çalışan uygulamalar arasında bizim ilk defa çalıştırdığımız exe olacak.
- Bizim buradaki amacımız ikinci defa çalıştırılmak istenir ise hangi kullanıcının çalıştırdığı kontrolü yapmak olacak.
- Mevcut çalışan exe ile yeni çalıştırılmak istenen exe aynı kullanıcıya ait ise Program zaten açık uyarısı vereceğiz ve kapat değişkenimizi 1 yapacağız.
- Kapat değişkenimiz 1 değil ise projemiz bir kullanıcı tarafından ilk defa açılıyor olacağından exe’nin çalışmasında bir sorun yoktur.
NOT: Bu kodlar iki kullanıcılı bilgsayarlar için. Bir bilgisayarı 2 den fazla kullanıcı kullanıyorsa ise sorunlar yaşayabilirsiniz. Bu kodları kendi projenize uyarlayın ve test edin.
C# Çalışan Bir Uygulamanın Sahibini Bulmak? – Process Owner yazımızında sonuna geldik dostlar.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz…
Sağlıcakla ve takipte kalın.