1

ログインフォームに次のコードを使用します。

Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
    Dim ErrorCount As Integer = 0

    If (ErrorCount = 3) Then
        MessageBox.Show(" The System has been Lock ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Form3.Show()
    Else

        Dim con As OleDbConnection = New OleDbConnection( _
                   "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= UserPass.mdb;")
        con.Open()
        Dim str As String
        str = "SELECT * FROM UserPass WHERE Username='" & txtUsername.Text & "' AND Password='" & txtPassword.Text & "'"
        Dim cmd As OleDbCommand = New OleDbCommand(str, con)
        cmd.Parameters.AddWithValue("user", txtUsername.Text)
        cmd.Parameters.AddWithValue("pass", txtPassword.Text)
        Dim sdr As OleDbDataReader = cmd.ExecuteReader()
        ' It will be case sensitive if you compare usernames here.   
        If sdr.HasRows Then
            If sdr.Read Then
                If txtPassword.Text <> sdr("Password").ToString Or txtUsername.Text <> sdr("Username").ToString Then
                    MessageBox.Show(" Incorrect Username/Password. Login Denied ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    ErrorCount = ErrorCount + 1
                Else
                    MessageBox.Show(" You are now Logged In! ", " Welcome! ", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
                    frmOne.Show()
                    Me.Hide()
                End If
            End If
        Else
            MessageBox.Show(" Incorrect Username/Password. Login Denied ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If


        sdr.Close()
        con.Close()
    End If

ユーザーがシステムに3回ログインできなかった場合、システムはロックされていることを示す別のフォームが表示され、ユーザーはシステムからパスワードを入力してログインを試みる必要があります。再び。どうぞよろしくお願いします。

ユーザー名とパスワードのデータベースとしてmsaccessを使用しているim

4

4 に答える 4

2

他の2つの答えの組み合わせ。状態を維持するために、宣言を静的に変更する必要があります。Dim ErrorCount As Integer = 0Static ErrorCount As Integer

また、ユーザーが無効なユーザー名を入力したコードパスにデクリメントを追加する必要があります。

MessageBox.Show(" Incorrect Username/Password. Login Denied ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)
ErrorCount = ErrorCount + 1 'add this here

次に、ifをSQLの後に移動するので、これを後に移動しますcon.close()

If (ErrorCount = 3) Then
    MessageBox.Show(" The System has been Lock ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Form3.Show()
Else

また、パラメータ化されたクエリについて混乱しているようです。パラメータ化されたクエリを使用している場合は、SQLを連結する必要はありません。

    str = "SELECT * FROM UserPass WHERE Username=@user AND Password=@pass"

また、通常の状態では決して真ではないはずの内部

If txtPassword.Text <> sdr("Password").ToString Or txtUsername.Text <> sdr("Username").ToString Then 
     ' this code path is only evaluated if the database ignores the where clause or 
     ' the user changes the username or password textboxs whilst the database connection is proccessing and is therfore unnessacary 
     MessageBox.Show(" Incorrect Username/Password. Login Denied ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)
     ErrorCount = ErrorCount + 1
Else
     MessageBox.Show(" You are now Logged In! ", " Welcome! ", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
     frmOne.Show()
     Me.Hide()
End If

最後に、パスワードをプレーンテキストとして保存しないでください。System.Security.Cryptography名前空間からのハッシュをソルトで使用します。

于 2013-03-27T10:55:01.857 に答える
0

私はその質問を理解しているとは完全にはわかりません。しかし、この部分は、プログラムでのログオン試行が3回失敗した後、コンピューターのデスクトップ全体をロックしようとしているように聞こえます。

ユーザーがシステムに3回ログインできなかった場合、システムはロックされていることを示す別のフォームが表示され、ユーザーはシステムからパスワードを入力してログインを試みる必要があります。再び。

それが良い考えかどうかはわかりません。コンピューター全体をロックするのではなく、ユーザーをプログラムからロックアウトするだけで十分ではないでしょうか。このように考えてください。ローカルの違反に対してグローバルな罰を科す理由はありません。

しかし、それが良い考えだと思うかどうかはさておき、VB.NETから完全に実行可能です。LockWorkStationログイン試行が3回失敗したことをカウンターが示した後、関数を呼び出すだけです。この関数はWin32APIの一部として提供されているため、.NETアプリケーションから直接呼び出すには、P/Invokeを使用する必要があります。この関数の署名は比較的単純なので、その定義を理解するのはそれほど難しくありません。

<DllImport("user32.dll", SetLastError=True)> _
Public Shared Function LockWorkStation() As Boolean
End Function

この関数には、その使用に関していくつかの重要な制約があります。つまり、インタラクティブデスクトップで実行されているプロセスからのみ呼び出すことができます。ただし、これは問題ではありません。インタラクティブデスクトップでのみ実行できるGUIアプリケーションを構築しており、誰かが無効なパスワードを3回入力した場合、そのユーザーは間違いなくログインして座っていることがわかっています。キーボードから数フィート。

コードから魔法を呼び出すのは比較的簡単ですが、関数が失敗する可能性があり、それらのエラー状態を処理する必要があります(誰かがアプリケーションにセキュリティバックドアを見つけないようにする):

If (FailedLogonAttempts < 3) Then
    ' Do whatever...
Else
    ' Lock 'em out!
    Dim success As Boolean = LockWorkstation()
    If Not success Then
        ' Uh-oh! An error occurred! You need to handle this, otherwise someone
        ' might be able to gain unauthorized access to the system.
        '
        ' For demonstration and debugging purposes, we'll throw an exception,
        ' but that's obviously not a secure long-term solution.
        Throw New Win32Exception(Marshal.GetLastWin32Error())
    End If
End If

既存のコードを修正する方法を尋ねているだけの場合、問題はErrorCode変数が0を超えないことです。次のbtnLogin_Clickようにメソッドの先頭で宣言しました。

Dim ErrorCount As Integer = 0

これは、メソッドレベルのスコープを持つ通常の変数です。つまり、メソッドが実行されるたびに再初期化され(0になります)、その値は保持されません。

値を保持するメソッドレベルのスコープで変数を宣言する場合、次のようにStaticキーワードを使用して変数を宣言する必要があります。

Static ErrorCount As Integer = 0

これらをテストし、何が問題なのかを理解するための優れた方法は、btnLogin_Checkメソッド内にブレークポイントを設定し、変数の値を正確に確認することです。これを行うと、実行が最初の行を通過した後、毎回、ErrorCountが0に設定されることに気付くでしょう。それが問題が何であるかについてのあなたの直接の手がかりになるでしょう。次に、値を固定する方法を理解する必要があります。これで、キーワードを使用してそれを行うことがわかりStaticました(または、スコープを上に移動して、Formクラスのメンバーにして、そのクラスのオブジェクトと同じ長さになるようにします)。

于 2013-03-26T02:51:56.667 に答える
-1

あなたはこのようなことを試すことができます:

Dim ErrorCount As Int = 0

If (ErrorCount =3) Then
     MessageBox.Show(" The System has been Lock ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)

'Do stuff 
'Add Your Code to show new Form something like
 Me.Hide()
 Form3.Show()


Else 

Dim con As OleDbConnection = New OleDbConnection( _
           "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= UserPass.mdb;")


con.Open()
Dim str As String
str = "SELECT * FROM UserPass WHERE Username='" & txtUsername.Text & "' AND Password='" & txtPassword.Text & "'"
Dim cmd As OleDbCommand = New OleDbCommand(str, con)
cmd.Parameters.AddWithValue("user", txtUsername.Text)
cmd.Parameters.AddWithValue("pass", txtPassword.Text)
Dim sdr As OleDbDataReader = cmd.ExecuteReader()
' It will be case sensitive if you compare usernames here.   
If sdr.HasRows Then
    If sdr.Read Then
        If txtPassword.Text <> sdr("Password").ToString Or txtUsername.Text <> sdr("Username").ToString Then
            MessageBox.Show(" Incorrect Username/Password. Login Denied ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)

             ErrorCount = ErrorCount + 1 

        Else
            MessageBox.Show(" You are now Logged In! ", " Welcome! ", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
            frmOne.Show()
            Me.Hide()
        End If
    End If
Else
    MessageBox.Show(" Incorrect Username/Password. Login Denied ", " Error! ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If

    sdr.Close()
    con.Close()

End If

よろしくお願いします

于 2013-03-26T01:54:48.363 に答える
-1
Imports System.Data.OleDb

パブリッククラスForm1プライベート試行AsInteger= 3

Private Sub cmdLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLogin.Click
    Dim cn As New OleDbConnection("Provider=Microsoft.Ace.Oledb.12.0; Data Source=" & My.Application.Info.DirectoryPath.ToString() & "\BackUp\testing.Accdb;")
    cn.Open()
    If txtpassword.Text = "" Then
        MsgBox("Please Enter Your Password !!!", MsgBoxStyle.Critical, "Attention...")
        Exit Sub
    End If

    Dim dr1 As OleDbDataReader
    Dim com1 As New OleDbCommand

    com1.CommandText = "select [UserID],[Pass] from userinfo where userid = '" & txtUserID.Text & "'"
    com1.Connection = cn
    If cn.State = ConnectionState.Closed Then cn.Open()
    dr1 = com1.ExecuteReader
    If dr1.Read Then
        If UCase(dr1("Pass")) = UCase(txtpassword.Text) Then
            MessageBox.Show("Welecome")
            Me.Close()
        Else
            MessageBox.Show("Wrong Password  [" & attempt - 1 & "]  Attempt(s) Remaing")
            attempt -= 1
            txtpassword.Focus()
            If attempt = 0 Then
                End
            End If
        End If
        Exit Sub

    Else
        MessageBox.Show("Wrong UserID  [" & attempt - 1 & "]  Attempt(s) Remaing")
        attempt -= 1
        txtpassword.Focus()
        If attempt = 0 Then
            End
        End If
    End If
    cn.Close()
End Sub

Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancel.Click
    End
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Me.Dispose()
End Sub

エンドクラス

于 2013-03-27T10:18:03.130 に答える