C# ile Projeyi Yönetici Olarak Çalıştırma
C# ile geliştirdiğiniz bazı uygulamalarda Windows kayıt defterine (Registry) erişmek, sistem ayarlarını değiştirmek, servis işlemleri gerçekleştirmek, CMD veya PowerShell komutları çalıştırmak ya da sistem üzerinde yönetici yetkisi gerektiren işlemler yapmak gerekebilir.
Bu tür işlemlerde uygulama standart kullanıcı yetkileriyle çalıştırıldığında erişim reddedildi, yetki yetersiz veya benzeri hatalarla karşılaşılabilir.
Kullanıcıdan her seferinde uygulamaya sağ tıklayıp “Yönetici olarak çalıştır” seçeneğini kullanmasını istemek yerine, uygulamanın Windows tarafından başlatılırken yönetici yetkisi talep etmesini sağlayabiliriz.
Bunun için C# projelerinde Application Manifest File kullanabiliriz.
Application Manifest File Nedir?
Application Manifest File, Windows uygulamasının çalışma şekliyle ilgili çeşitli bilgilerin tanımlanabildiği XML tabanlı bir dosyadır.
Bu dosya üzerinden uygulamanın Windows tarafından hangi yetki seviyesinde çalıştırılmasının istendiği belirtilebilir.
Yönetici yetkisi gerektiren uygulamalarda kullanacağımız temel ayar ise:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
satırıdır.
Bu ayar sayesinde uygulama başlatıldığında Windows, uygulamanın yönetici yetkisiyle çalıştırılmasını ister.
Application Manifest File Ekleme
Öncelikle Visual Studio'da yönetici olarak çalıştırmak istediğimiz C# projesini açıyoruz.
Ardından Solution Explorer üzerinden projemize sağ tıklıyoruz.
Menüden:
Add → New Item
seçeneğini seçiyoruz.
Açılan pencerede Application Manifest File seçeneğini buluyoruz.
Dosyayı projemize ekliyoruz.
Visual Studio, manifest dosyasını oluşturduktan sonra içerisinde uygulamanın çalışma yetkilerini belirleyen XML yapılandırmasını görebilirsiniz.
requestedExecutionLevel Ayarını Değiştirme
Manifest dosyası içerisinde aşağıdaki satırı buluyoruz:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
Buradaki asInvoker değeri, uygulamanın mevcut kullanıcı yetkileriyle çalıştırılmasını ifade eder.
Yani kullanıcı uygulamayı standart kullanıcı olarak çalıştırıyorsa uygulama da standart kullanıcı yetkileriyle çalışır.
Yönetici yetkisi talep etmek için bu satırı aşağıdaki şekilde değiştiriyoruz:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Sonuç olarak ilgili bölüm şu şekilde olacaktır:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
requireAdministrator Ne İşe Yarar?
Buradaki:
requireAdministrator
ifadesi, uygulamanın çalışabilmesi için Windows'tan yönetici yetkisi talep edilmesini sağlar.
Uygulama başlatıldığında Windows, kullanıcı hesabının yetkilerine ve UAC yapılandırmasına bağlı olarak Kullanıcı Hesabı Denetimi (UAC) ekranını gösterebilir.
Kullanıcı gerekli onayı verdiğinde uygulama yönetici yetkileriyle çalışır.
Bu sayede kullanıcı her seferinde uygulama dosyasına sağ tıklayıp “Yönetici olarak çalıştır” seçeneğini manuel olarak seçmek zorunda kalmaz.
Uygulama İçerisinde Yönetici Yetkisi Gerektiren İşlemler
Bu yöntem özellikle aşağıdaki işlemleri gerçekleştiren uygulamalarda kullanılabilir:
- Windows Registry işlemleri
- Sistem dosyaları üzerinde işlem yapma
- Windows servislerini yönetme
- Firewall kurallarını değiştirme
- Sistem ayarlarını değiştirme
- CMD veya PowerShell üzerinden yönetici yetkisi gerektiren komutlar çalıştırma
- Ağ yapılandırmasıyla ilgili bazı işlemler
- Program kurulumu ve güncelleme işlemleri
- Sistem seviyesinde çalışan yardımcı araçlar
Örneğin uygulamanız Windows Firewall üzerinde kural eklemek için yönetici yetkisine ihtiyaç duyuyorsa manifest dosyasında requireAdministrator kullanılması gerekebilir.
Uygulamanın Çalışma Mantığı
Normal durumda uygulamanız:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
şeklindeyse mevcut kullanıcı yetkileriyle çalışır.
Yönetici yetkisi istediğinizde ise:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
kullanılır.
Temel olarak çalışma mantığı şu şekildedir:
Uygulama başlatılır ↓ Manifest dosyası kontrol edilir ↓ requireAdministrator ↓ Windows yönetici yetkisi talep eder ↓ UAC onayı ↓ Uygulama yönetici yetkileriyle çalışır
Dikkat Edilmesi Gerekenler
requireAdministrator kullanıldığında uygulamanız her zaman yönetici yetkisiyle çalışır.
Bu nedenle uygulamanızın gerçekten yönetici yetkisine ihtiyacı olup olmadığını değerlendirmek önemlidir.
Gereksiz yere yönetici yetkisi istemek güvenlik açısından önerilen bir yaklaşım değildir.
Eğer uygulamanın yalnızca belirli bir işlemi yönetici yetkisiyle gerçekleştirmesi gerekiyorsa, tüm uygulamayı yönetici olarak çalıştırmak yerine yalnızca ihtiyaç duyulan işlemi ayrı bir yönetici yetkili işlem olarak tasarlamak daha güvenli bir yaklaşım olabilir.
Ayrıca requireAdministrator kullanılması, UAC'nin tamamen devre dışı bırakıldığı anlamına gelmez. Windows'un güvenlik politikalarına göre kullanıcıdan yetki onayı istenebilir.
Sonuç
C# ile geliştirdiğiniz uygulamanızın Windows üzerinde yönetici yetkileriyle otomatik olarak başlatılmasını istiyorsanız Application Manifest File kullanabilirsiniz.
Manifest dosyasındaki:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
satırını:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
şeklinde değiştirmeniz yeterlidir.
Bu ayardan sonra uygulamanız başlatılırken Windows tarafından yönetici yetkisi talep edilir ve kullanıcı her seferinde “Yönetici olarak çalıştır” seçeneğini manuel olarak kullanmak zorunda kalmaz.
Özellikle Registry, Windows servisleri, Firewall, sistem ayarları ve yönetici yetkisi gerektiren diğer işlemleri gerçekleştiren masaüstü uygulamalarında bu yöntem oldukça kullanışlıdır.