-- C#, Veri Güvenliği

C# ile Projeyi Yönetici Olarak Çalıştırmak

C# ile Projeyi Yönetici Olarak Çalıştırmak

Geliştirdiğim geniş çaplı bir proje dağıtık mimaride ve çok uygulamalı(web ve desktop istemciler) olarak geliştirilmekte. Masaüstü uygulama tarafından WPF kullanıyorum. Web tarafında ise ASP.NET Web API çekirdeği üzerinde bir Javascript UI bulunuyor. Zaten WPF istemcilere veri sağlayan da gene ASP.NET Web API!

Projeden özet olarak bahsettikten sonra bu projedeki client’ları nasıl yayınladığım ve güncellemelerini yönettiğim hakkında bilgi vereyim. ClickOnce! Evet, ClickOnce ile ‘publishing’ işlemini yönetiyorum. Bir proje yayına hazır hale geldiğinde projenin ana domaini üzerine yüklüyorum ve oradan dağıtımlar yapılıyor. Aynı zamanda ClickOnce ile yeni güncellemeler yapmak da çok kolay. Güncellemeyi yapınca gene ilgili web proje yoluna yeni güncelleme paketlerini ‘publish’ ediyorum ve yaptığım ayarlamalara göre ister istemci her açılırken istersem de kapanırken ya da farklı şekillerde yeni güncelleme kontrolü yapıyor otomatik olarak. Eğer yeni güncelleme varsa bunun kurulup kurulmayacağını soruyor ve kabul ettiğinde(istemci kullanıcısı) kurulum otomatik olarak yapılıyor. Çok sade ve temiz bir süreç…

Şimdi gelelim meseleye…

İstemci bilgisayarlardaki yazılımlar ile dosya sistemine ve bazı sistemsel kaynaklara ulaşmam gerekiyor. Bunun için de bildiğiniz gibi Windows Vista ve sonrasında Windows 7, Windows 8 ve Windows 10 ile gelen şu Kullanıcı Denetimi güvenlik meselesi söz konusu. Bir programın erişebileceği kaynaklar sınırlı. Eğer farklı ve detaylı kaynaklara ulaşmak isterse(yazılım) o zaman kullanıcının bu programa sağ tıklayarak ‘Yönetici olarak çalıştır’ sekmesini kullanarak yönetici modunda açması gerekiyor. İşte bu yönetici olarak çalıştırma olayı kendiliğinden olmuyor. Bunu yazılımcı olarak sizin eklemeniz gerekiyor. O da şöyle…

Adımlar;
Projeye sağ tıklayın ve Properties sekmesi açın.
Security sekmesine gelin.
Enable ClickOnce security settings‘ metnine sahip seçim kutusunu seçin/kaldırın.
– Bu işlemle birlikte projenizin Properties sekmesi altında ‘app.manifest‘ adında bir dosya oluşacak. Bu dosya XML tabanlıdır.
– app.manifest dosyası içerisinde aşağıdaki kodu bulun ve açıklama satırı haline getirin.

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

– ve üstteki kapattığınız kod yerine aşağıdaki şu kodu yazın.

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Bu işlemlerden sonra projeyi çalıştırdığınızda zaten ilgili çalıştırılabilir dosyayı(Exe) yönetici olarak çalıştırmak için size bir onay ekranı gösterecektir.

İlgili ekran görüntüleri işinizi kolaylaştıracaktır;

İş burada bitiyor mu? Hayır… Çünkü ClickOnce ile app.manifest farklı mevzular. Eğer app.manifest ile bu ayarı yaparak yönetici olarak çalıştırılabilir program elde etmek istiyorsanız uygulama dağıtımında ClickOnce kullanamazsınız! Çünkü ClickOnce ‘requireAdministrator’ işlemini, yani yönetici olarak çalıştırma işlemini desteklemiyor. Güvenlik nedeniyle… Ama eğer illa ki yönetici modunda çalışmak ve aynı zaman da ClickOnce uygulama paylaşım mimarisini kullanabilmek istiyorsanız bunun da yolu var. Ancak biraz kod yazacağız!

ClickOnce + UAC(User Account Control) Yönetimini Bir Arada Yapmak

Bu işlem için gerekli kodu uygulamanızın ilk açılan formunun arka planında yazabilirsiniz. AnaForm ya da Login formu açılıyorsa arkasında yazın mesela.

Öncelikle ilgili sayfaya aşağıdaki namespace’leri eklemeniz gerekiyor.

using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

Sonrasında ise işlem kodunu yazıyoruz.

private void AdminRelauncher()
{
     if (!IsRunAsAdmin())
     {
          ProcessStartInfo proc = new ProcessStartInfo();
          proc.UseShellExecute = true;
          proc.WorkingDirectory = Environment.CurrentDirectory;
          proc.FileName = Assembly.GetEntryAssembly().CodeBase;

          proc.Verb = "runas";

          try
          {
               Process.Start(proc);
               Application.Current.Shutdown();
          }
          catch (Exception ex)
          {
               Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString());
          }
   }
}

private bool IsRunAsAdmin()
{
     WindowsIdentity id = WindowsIdentity.GetCurrent();
     WindowsPrincipal principal = new WindowsPrincipal(id);

     return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

Bu kodlarla süreci tanımladıktan sonra, şimdi de formun başlangıç noktası olan InitializeComponent(); metod çağrımından hemen sonra aşağıdaki tanımlamayı yapıyoruz.

public Login()
{
     InitializeComponent();

     // Runas (yönetici modu) ile çalışabilmek için...
     AdminRelauncher();
}

Evet, artık projemiz hazır. Bu son kod örneğini uyguladıysanız hem ClickOnce hem de UAC kullanarak yönetici olarak çalıştırma işlemini yapabilir olacaksınız. Projeyi derleyin ve üretilen .exe dosyasının üzerine bakın! Bir güvenlik kalkanı simgesi göreceksiniz. Çalıştırdığınızda sizden izin isteyecektir.

Başarılar.
Cihan Özhan

Yorumla

Yorum