Windows Vista ile beraber karşımıza çıkan UAC (User Account Control) aslında Winforms programcılığında çok şey değiştirdi. Özetle artık istediğimiz gibi herhangi bir klasöre dosya yazamıyoruz veya Registry içerisinde istediğimiz değişiklikleri yapamıyoruz. Ya uygulamamıza verilen haklar çerçevesinde hareket etmek zorundayız ya da kullanıcıdan ek haklar istemeliyiz.
Bu yazıda hızlı bir şekilde Vista ile gelen UAC'nin yazılım geliştirme esnasındaki kullanımına değinerek farklı çözümler geliştireceğiz.
Dosyaları diskte nereye yazmalı?
Programınızın ürettiği bir dosya var ve onu istediğiniz yere yazamadığınızın farkında vardınız. Eğer dosyanın yazılacağı yeri kullanıcıdan bir SaveFileDialog ile alıyorsanız zaten bu prosesi Vista kendisi halledecek ve kullanıcıyı Admin hakkı gerektiğine dair uyaracaktır fakat eğer dosyayı siz programatik olarak doğrudan yazmak istiyorsanız maalesef hakkınız olan bir yer bulmanız gerek.
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Yukarıdaki kod ile kolaylıkla yazma hakkınız olan bir alana ulaşabilirsiniz. Tabi bunun haricinden kullanıcının Desktop veya MyDocuments gibi alanlara da doğrudan Admin hakkı gerekmeksizin ulaşması hakkı vardır. Tüm bu klasörlere de rahatlıkla ulaşabilirsiniz fakat genelde bu noktalara yazılımlarla ilgili özel dosyaların saklanması doğru olmaz.
Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Admin haklarını nasıl alırız?
Eğer hazırladığınız uygulamanın kesinlikle Admin haklarına ihtiyacı varsa uygulamayı UAC'yi çağıracak şekilde düzenlemelisiniz. Böylece program ilk açıldığında kullanıcıdan Admin hakları isteyecektir, aksi halde program açılmayacaktır. Tüm bu ayarları projelerinizdeki app.manifest dosyası içerisinde yapabilirsiniz. Bu dosyaya kolay şekilde ulaşmak için Visual Studio içerisindeki Solution Explorer içerisinde projeye sağ tıklayarak kelen menüden "Properties"i seçip "Application" tabında "View UAC Settings" demeniz yeterli olacaktır.
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
Bu dosya içerisinde normalde asInvoker yazan yere yukarıdaki gibi requireAdministrator yazarsanız bir sonraki Build ile oluşturulan uygulama artık UAC'den admin hakları isteyerek çalışacaktır. Bu da uygulamanıza her yere ulaşım hakkı verildiği anlamına gelir.
Hepinize kolay gelsin.