C# Çalışan Bir Uygulamanın Sahibini Bulmak? – Process Owner

C# Çalışan Bir Uygulamanın Sahibini Bulmak? – Process Owner

2 Ocak 2020 0 Yazar: Mustafa BÜKÜLMEZ
Toplam Görüntülenme : 33
Yaklaşık okuma süresi : 12 DK
C# MessageBox Buton Text Değiştirme
C# Programın İki Kere Açılmasını Engellemek

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.

C# Çalışan Bir Uygulamanın Sahibini Bulmak - Process Owner

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;

 

Bu Yazının İçeriği

İlgili İçerik  C# Mail Gönderme İşlemleri

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.

Çalışan Exe Kullanıcı Bilgisini Almak

C# Çalışan Bir Uygulamanın Sahibini Bulmak - Process Owner

Sarı renkle işaretlenmiş satırdaki PID değeri bizim ID değerimiz oluyor. (PID = Process ID) Burada projemin PID’i 16740.

İlgili İçerik  C# Const Kavramı

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.

C# Process Owner

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.

  1. Programın açılıp açılmayacağını belirleyecek bir değişken tanımlıyoruz.
  2. Exe adını ve aktif kullanıcı adını alıyoruz.
  3. Exe adı ile aynı isme sahip işlemlerin Array listesini alıyoruz
  4. Mevcutta çalışan (varsa) uygulamanın hangi kullanıcı tarafından çalıştırıldığını buluyoruz.
  5. İlk İf kontrolünün amacı şudur;
    1. 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.
    2. Bizim buradaki amacımız ikinci defa çalıştırılmak istenir ise hangi kullanıcının çalıştırdığı kontrolü yapmak olacak.
  6. 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.
  7. 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.

İlgili İçerik  C# Nesne Yaklaşımlı SQL Modelleme

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. 😉

C# MessageBox Buton Text Değiştirme
C# Programın İki Kere Açılmasını Engellemek