Makale Özeti

Bu makalede Visual Studio 2005’i kullanarak bir örnek uygulama geliştiriyor olacağız. Uygulamada, bir windows uygulamasında komut satırı argumanlarının kullanımı ve kullanıcının belirteceği bir windows kullanıcı hesabının geçerliliğinin doğrulanması, yetkilerinin denetlenmesi işlemlerini ele alıyor olacağız.

Makale

Bu makalede Visual Studio 2005’i kullanarak bir örnek uygulama geliştiriyor olacağız. Uygulamada, bir windows uygulamasında komut satırı argumanlarının kullanımı ve kullanıcının belirteceği bir windows kullanıcı hesabının geçerliliğinin doğrulanması, yetkilerinin denetlenmesi işlemlerini ele alıyor olacağız.

Uygulamanın geliştirilmesini dört  adımda ele alıyor olacağız.

-         Görsel tasarım

-         Komut Satırı Argumanlarını algılayacak kodların geliştirilmesi

-         Kullanıcı hesabının denetlenmesi

-         Yetki Denetim Kodlarının Geliştirilmes

Görsel Tasarım ve Uygulama Ayarları
Uygulama çalıştığında önce kullanıcı hesabını denetleyecek, sonra kullanıcının yetkilerini denetleyecek ve yetkisi dahilinde görüntüleyebileceği formlara erişim imkanı verecek olan Form1 ile çalışıyor olacak. Dolayısıyla Project à Uygulama Özellikleri ekranından Startup Form özelliğini Form1, Shutdown Mode özelliğini ise “When last form closes” şeklinde değiştiriyoruz.

Uygulamamızda iki adet button ve bir adet label yer alıyor olacak. Görsel tasarım aşağıdaki gibi olacaktır.

Komut Satırı Argumanlarını algılayacak kodların geliştirilmesi
İlk etapta uygulama çalışırken kullanılan komut satırı argumanlarını, Visual Basic 2005 ile gelen My nesneleri aracılığıyla algılıyoruz. Aşağıdaki kodları projemize ekleyerek Form_Load eventinde
getCommandLineArguments adlı prosedürü çalıştırıyoruz.

Dim arrList As New ArrayList

Sub getCommandLineArguments()

For Each Arg As String In My.Application.CommandLineArgs

    arrList.Add(Arg)

Next

If arrList.Count < 2 Then

MessageBox.Show("Eksik / hatalı parametre" & ControlChars.CrLf & "Uygulamayı aşağıdaki söz dizimi ile çalıştırınız:" & ControlChars.CrLf & My.Application.Info.AssemblyName & " <kullanici adi> <parola>")

Application.Exit()

ElseIf arrList.Count > 2 Then

MessageBox.Show("Fazla / hatalı parametre" & ControlChars.CrLf & "Uygulamayı aşağıdaki söz dizimi ile çalıştırınız:" & ControlChars.CrLf & My.Application.Info.AssemblyName & " <kullanici adi> <parola>")

Application.Exit()

End If

End Sub

Bu kodlar ile uygulama çalıştırılırken iki adet komut satırı argumanı talep edecektir. Eksik veya fazla arguman gelmesi durumunda uygulama hata mesajı vererek kapanacak, iki arguman gelmesi durumunda ise bu argumanlar ArrayList’e eklenecek.

Bu argumanlardan birincisi kullanıcı adı, ikincisi ise parola olarak kabul edilecek ve bir sonraki adımda windows kullanıcı hesabının geçerliliğini denetlerken kullanılacaktır.

Kullanıcı Hesabının Denetlenmesi
Bir önceki adımda arrayliste eklediğimiz iki argumandan ilkini kullanıcı adı ikincisini ise parola olarak kullanarak girilen değerlerin windows üzerinde geçerli olup olmadığını denetleyeceğiz.

Bu bölümde projeye aşağıdaki kodları ekleyeceğiz;

Imports System.Security.Principal

Imports System.Security.Permissions

Imports System.Runtime.InteropServices

Imports System.Environment

'LogonUser fonksiyonu yerel bilgisayarda belirtilen kullanıcı adı ve parola

'ile oturum açmayı deniyor.

Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _

       ByVal lpszDomain As [String], ByVal lpszPassword As [String], _

       ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _

       ByRef phToken As IntPtr) As Boolean

 

'FormatMessage fonksiyonu gelen veriyi biçimlendirmekte kullanılıyor

<DllImport("kernel32.dll")> _

Public Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef lpSource As IntPtr, _

       ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef lpBuffer As [String], _

       ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer

End Function

 

'CloseHandle fonksiyonu kullanılan kaynakların serbest bırakılmasında kullanılıyor

Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Boolean

 

'The GetErrorMessage fonksiyonu oluşan hata koduna dair hata mesajını biçimlendirerek

'görüntülemekte kullanılıyor.

Public Shared Function GetErrorMessage(ByVal errorCode As Integer) As String

        Dim FORMAT_MESSAGE_ALLOCATE_BUFFER As Integer = &H100

        Dim FORMAT_MESSAGE_IGNORE_INSERTS As Integer = &H200

        Dim FORMAT_MESSAGE_FROM_SYSTEM As Integer = &H1000

 

        Dim msgSize As Integer = 255

        Dim lpMsgBuf As String

        Dim dwFlags As Integer = FORMAT_MESSAGE_ALLOCATE_BUFFER Or FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS

 

        Dim lpSource As IntPtr = IntPtr.Zero

        Dim lpArguments As IntPtr = IntPtr.Zero

        'FormatMessage fonksiyonu ile veriyi biçimlendiriyoruz.

        Dim returnVal As Integer = FormatMessage(dwFlags, lpSource, errorCode, 0, lpMsgBuf, _

                msgSize, lpArguments)

        If returnVal = 0 Then

            Throw New Exception("Mesaj biçimlendirilirken bir hata oluştu: " + errorCode.ToString() + ". ")

        End If

        Return lpMsgBuf

    End Function

 

 

Function logonUser(ByVal _userName As String, ByVal _password As String)

        Dim tokenHandle As New IntPtr(0)

        Dim returnValue As Boolean

        Try

            Dim UserName, MachineName, Pwd As String

            'uygulamayı çalıştıran bilgisayarda denetim yapacağız

            MachineName = System.Environment.MachineName

 

            UserName = _userName

            Pwd = _password

            Const LOGON32_PROVIDER_DEFAULT As Integer = 0

            Const LOGON32_LOGON_INTERACTIVE As Integer = 2

            tokenHandle = IntPtr.Zero

            'Kullanıcı geçerli mi?

            returnvalue = logonUser(UserName, MachineName, Pwd, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle)

            'kullandığımız kaynakları serbest bırakalım

            If Not System.IntPtr.op_Equality(tokenHandle, IntPtr.Zero) Then

                CloseHandle(tokenHandle)

            End If

        Catch ex As Exception

            MessageBox.Show("İçimde kötü bir his var: " + ex.Message)

        End Try

        Return returnValue

End Function

Bu noktadan itibaren uygulamamız windows kullanıcı hesabını denetleyecek logonUser fonksiyonuna sahip durumdadır. Artık kalan tek şey uygulama çalıştırılırken belirtilen argumanlara bağlı olarak kullanıcı hesabının geçerliliğini denetlemek.

Bu noktada uygulama boyunca kullanacağımız bir test hesabı tanımlıyoruz.
Ben kullanıcı adı olarak “test” parola olaraksa “1q2w3e4r5t” belirledim.

Geçerli windows hesabı ile deneme yapıldığında ise karşımıza aşağıdaki ekran geliyor;

 

Ok butonunu tıkladığımızda ise karşımıza form1 geliyor. Henüz yetki denetimi ile ilgili kodları eklemediğimiz için form1 ham halde görünüyor.

Sırada belirtilen kullanıcı adının Yönetici grubuna dahil olup olmadığını denetleyerek kullanıcı arayüzünü düzenleyecek kodun yazılması var.

Yetki Denetim Kodlarının Geliştirilmesi

Bu noktada belirtilen kullanıcı adı ve parolanın yönetici grubuna dahil olup olmadığına bağlı olarak kullanıcı arayüzünü düzenleyeceğiz.

Oldukça kısa bir kod ile yetki denetimi ve arayüz oluşturulmasınıda gerçekleştiriyoruz:

Sub createUI()

        Dim newId As New WindowsIdentity(tokenHandle)

        Dim userperm As New WindowsPrincipal(newId)

        If userperm.IsInRole(WindowsBuiltInRole.Administrator) Then

            Button1.Left = 60

            Button2.Left = 169

            Button1.Visible = True

            Button2.Visible = True

            Label1.Text = "Merhaba, " & arrList(0) & " kullanıcı seviyesi: Yönetici"

        Else

            Button1.Left = 109

            Button1.Visible = True

            Button2.Visible = False

            Label1.Text = "Merhaba, " & arrList(0) & " kullanıcı seviyesi: Normal Kullanıcı"

        End If

 

End Sub

 

Artık Form_Load prosedürüne son haline veriyoruz:

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        getCommandLineArguments()

        Select Case LogonUser(arrList(0), arrList(1))

            Case True

                MsgBox("kimlik doğrulandı")

            Case False

                MsgBox("hatalı kullanıcı adı ve/veya parola")

                Application.Exit()

        End Select

        createUI()

End Sub

 

Son olarak uygulamayı test etmek için ikinci bir kullanıcı daha tanımlıyor ve bu kullanıcıyı Administrators grubuna dahil ediyorum..

 

Kullanıcı adı: test2
Parola: 1q2w3e4r5t

 

Ve uygulamayı çalıştırıyoruz..

 

İlk olarak normal user olan test kullanıcısı ile çalıştırıyoruz uygulamayı:

Kimlik doğrulandı..

Ve arayüz oluşturuldu..

 

Şimdide Yönetici hesabı olan test2 ile uygulamayı çalıştırıyoruz:

Kimlik doğrulandı..

 

Ve arayüz oluşturuldu.

 

Böylece windows’u kullanan kullanıcı hesabı değil, uygulamayı çalıştırırken kullanılan windows kullanıcı hesabının doğrulanması ve yetki denetiminin yapılmasına dair bir örnek uygulama geliştirmiş olduk.

Kadir SÜMERKENT
http://www.sumerkent.com

 

Projeyi buradan download edebilirsiniz. (Visual Studio 2005 Beta 2 ile geliştirilmiştir)