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.