在XP和Windows Server 2003使用凭据管理下


在我的代码中,我在尝试进行数据库连接之前,检查值是否为 NO_ERROR(可以将其更为确定地描述为 SUCCESS)。如果该 API 调用返回 NO_ERROR,但数据库连接失败,则我使用 ConfirmCredentials 调用通知凭据系统这些凭据无效,因而不应该保留。如果数据库连接成功,则我使用 ConfirmCredentials 调用通知凭据系统该用户 ID 和密码组合有效,并且应该保留。

         Dim connString As String
  Dim password, userid As String
  Dim selectAuthors As String = _
  "Select au_id, au_lname, au_fname From authors"
  If result = CredUIReturnCodes.NO_ERROR Then
  connString = String.Format( _
  "Password={1};User ID={0};" & _
  "Initial Catalog=pubs;" & _
  "Data Source=MyServer", _
  userid, password)
  Dim conn As New SqlConnection(connString)
  Try
  conn.Open()
  CredUI.ConfirmCredentials(host, True)
  Catch sqlEx As SqlException
  If sqlEx.Number = 18456 Then
  MsgBox("Authentication Failed")
  CredUI.ConfirmCredentials(host, False)
  End If
  Catch ex As Exception
  MsgBox("Connection Error")
  CredUI.ConfirmCredentials(host, False)
  End Try
  If conn.State = ConnectionState.Open Then
  Dim cmdAuthors As New SqlCommand( _
  selectAuthors, _
  conn)
  Dim daAuthors As New SqlDataAdapter(cmdAuthors)
  Dim dtAuthors As New DataTable("Authors")
  daAuthors.Fill(dtAuthors)
  retrievedData.SetDataBinding(dtAuthors.DefaultView, "")
  End If
  ElseIf result <> CredUIReturnCodes.ERROR_CANCELLED Then
  MsgBox("There was an error in authentication")
  End If

使用自己的图形

  凭据对话框已经相当漂亮了(参见图 2),它非常不错并且“一致”,但如果您希望使其更个性化一点,我也能够理解。您很幸运,您可以通过 PromptForCredentials API 提供自己的 320x60 图形(参见图 3),以取代默认图像。

 

 图 3. 向标准凭据对话框中添加了自定义图形。

  在您自己的代码中完成该操作相当容易,因为 System.Drawing.Bitmap 类提供了一个便利的方法 GetHbitmap 来获取基础图形的本机句柄。您需要创建 System.Drawing.Bitmap 的实例,然后将 CREDUI_INFO 结构的 .hbmBanner 成员设置为该位图的本机句柄。在使用完该 CREDUI_INFO 结构(已经对 PromptForCredentials 进行了调用)之后,需要释放该本机句柄,以避免任何形式的内存泄漏。要释放该句柄,需要使用另一个 API 调用,即 DeleteObject。我已经在我的 CredUI 类中包含了该 API 调用,以使自定义位图的使用变得尽可能地容易。

         Dim credBmp As New Bitmap("d:\credui.bmp")
  Dim info As New CREDUI_INFO()
  With info
  .hwndParent = Me.Handle
  .pszCaptionText = host
  .pszMessageText = _
  String.Format("Please Enter Credentials for {0}", host)
  .hbmBanner = credBmp.GetHbitmap()
  End With
  'make call to PromptForCredentials
  '...
  CredUI.DeleteObject(info.hbmBanner)
  为了与 Windows 保持一致,建议您仍然使用默认图形,但能够在需要的时候自定义对话框也很不错。我从示例代码中的一个文件中加载了该图像,但如果您有这方面的爱好,也可以使用 GDI+ 临时绘制该图像。

  小结

  如果您需要提示用户输入数据库凭据、网站凭据或任何其他凭据组,则完成该任务的最佳方式是使用内置的操作系统功能。除了为用户提供一致的用户界面以外,您还可以因为操作系统缓存与已登录用户关联的凭据而受益

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3