共用方式為


CredUIPromptForCredentialsA 函式 (wincred.h)

CredUIPromptForCredentials 函式會建立並顯示可設定的對話方塊,以接受來自使用者的認證資訊。

以 Windows Vista 或 Windows Server 2008 為目標的應用程式應呼叫 CredUIPromptForWindowsCredentials,而不是此函式,原因如下:

語法

CREDUIAPI DWORD CredUIPromptForCredentialsA(
  [in, optional] PCREDUI_INFOA pUiInfo,
  [in]           PCSTR         pszTargetName,
  [in]           PCtxtHandle   pContext,
  [in, optional] DWORD         dwAuthError,
  [in, out]      PSTR          pszUserName,
  [in]           ULONG         ulUserNameBufferSize,
  [in, out]      PSTR          pszPassword,
  [in]           ULONG         ulPasswordBufferSize,
  [in, out]      BOOL          *save,
  [in]           DWORD         dwFlags
);

參數

[in, optional] pUiInfo

CREDUI_INFO 結構的指標,其中包含自定義對話框外觀的資訊。

[in] pszTargetName

Null 終止字串的指標,其中包含認證的目標名稱,通常是伺服器名稱。 針對分散式文件系統 (DFS) 連線,此字串的格式為 serverName\ShareName。 此參數可用來識別儲存和擷取認證時的目標資訊。

[in] pContext

此參數保留供日後使用。 它必須是 NULL

[in, optional] dwAuthError

指定需要認證對話框的原因。 呼叫端可以傳遞由另一個驗證呼叫傳回的這個 Windows 錯誤參數,以允許對話方塊容納某些錯誤。 例如,如果傳遞密碼過期狀態代碼,對話框可能會提示使用者變更帳戶的密碼。

[in, out] pszUserName

Null 終止字串的指標,其中包含認證的用戶名稱。 如果傳遞非零長度字串,對話框的 UserName 選項會預先填入字串。 在 UserName/Password以外的認證案例中,可以傳入認證封送處理格式。 此字串的建立方式是呼叫 CredMarshalCredential

此函式會將使用者提供的名稱複製到此緩衝區,複製最多 ulUserNameMaxChars 個字元。 您可以使用 CredUIParseUsername,將此格式轉換成 UserName/Password 格式。 封送處理格式可以直接傳遞至 安全性支援提供者 (SSP)。

如果未指定CREDUI_FLAGS_DO_NOT_PERSIST旗標,則此參數中傳回的值是不應該檢查、列印或保存的表單,而不是將它傳遞給 CredUIParseUsernameCredUIParseUsername 的後續結果只能傳遞至客戶端驗證函式,例如 WNetAddConnection 或 SSP 函式。

如果未將網域或伺服器指定為此參數的一部分,pszTargetName 參數的值會當做網域來形成 DomainName\UserName 組。 在輸出時,此參數會收到字串,其中包含 DomainName\UserName 組。

[in] ulUserNameBufferSize

可以複製到 pszUserName 的最大字元數, 包括終止的 Null 字元。

Note CREDUI_MAX_USERNAME_LENGTH 不包含終止的 Null 字元。
 

[in, out] pszPassword

包含認證密碼之 Null 終止字串的指標。 如果為 pszPassword指定非零長度字串,對話框的密碼選項將會預先填入字元串。

此函式會將使用者提供的密碼複製到此緩衝區,複製最多 ulPasswordMaxChars 個字元。 如果未指定CREDUI_FLAGS_DO_NOT_PERSIST旗標,則此參數中傳回的值是不應該檢查、列印或保存的窗體,而不是將它傳遞至客戶端驗證函式,例如 WNetAddConnection 或 SSP 函式。

當您完成使用密碼時,請呼叫 SecureZeroMemory 函式,從記憶體清除密碼。 如需保護密碼的詳細資訊,請參閱 處理密碼

[in] ulPasswordBufferSize

可以複製到 pszPassword 的最大字元數, 包括終止的 Null 字元。

Note CREDUI_MAX_PASSWORD_LENGTH 不包含終止的 Null 字元。
 

[in, out] save

BOOL 的指標,指定 [儲存] 複選框的初始狀態,並在使用者回應對話框后收到 [儲存] 複選框的狀態。 如果未 NULL,且 CredUIPromptForCredentials 會傳回NO_ERROR,則當使用者在對話框中選擇 [確定] 時,pfSave 會傳回 [儲存] 複選框的狀態。

如果指定CREDUI_FLAGS_PERSIST旗標,則不會顯示 [儲存] 複選框,但會被視為選取。

如果未指定CREDUI_FLAGS_DO_NOT_PERSIST旗標且未指定CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX,則不會顯示 [儲存] 複選框,但會被視為已清除。

需要使用 CredUI 提示使用者輸入認證,但不需要認證管理員所提供的認證管理服務的應用程式,可以使用 pfSave,在使用者關閉對話框之後,接收 [Save] 複選框的狀態。 若要這樣做,呼叫端必須在 dwFlags中指定CREDUI_FLAGS_DO_NOT_PERSIST和CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX。 設定CREDUI_FLAGS_DO_NOT_PERSIST和CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX時,應用程式會負責檢查函式傳回之後的 *pfSave,如果 *pfSaveTRUE,則應用程式必須採取適當的動作,將使用者認證儲存在應用程式的資源內。

[in] dwFlags

DWORD 值,指定此函式的特殊行為。 這個值可以是位OR 下列值的零或多個組合。

價值 意義
CREDUI_FLAGS_ALWAYS_SHOW_UI
0x00080
指定即使可以從認證管理員中的現有認證傳回認證,也會顯示使用者介面。 只有在同時指定CREDUI_FLAGS_GENERIC_CREDENTIALS時,才允許此旗標。
CREDUI_FLAGS_COMPLETE_USERNAME
0x00800
在下拉式方塊中填入用戶名稱的提示。
CREDUI_FLAGS_DO_NOT_PERSIST
0x00002
請勿儲存認證或顯示複選框。 您可以使用這個旗標傳遞CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX以顯示 [儲存] 複選框,而且結果會傳回 pfSave 輸出參數。
CREDUI_FLAGS_EXCLUDE_CERTIFICATES
0x00008
僅以使用者名稱/密碼填入下拉式方塊。 不要在下拉式方塊中顯示憑證或智慧卡。
CREDUI_FLAGS_EXPECT_CONFIRMATION
0x20000
指定呼叫者會在檢查以判斷傳回的認證是否實際有效之後,呼叫 CredUIConfirmCredentials。 此機制可確保無效的認證不會儲存至認證管理員。 除非指定CREDUI_FLAGS_DO_NOT_PERSIST,否則在所有情況下都指定此旗標。
CREDUI_FLAGS_GENERIC_CREDENTIALS
0x40000
請考慮使用者輸入的認證為一般認證。
CREDUI_FLAGS_INCORRECT_PASSWORD
0x00001
顯示「登入失敗」氣球提示,通知用戶認證不足。
CREDUI_FLAGS_KEEP_USERNAME
0x100000
不允許使用者變更提供的用戶名稱。
CREDUI_FLAGS_PASSWORD_ONLY_OK
0x00200
僅以密碼填入下拉式方塊。 不允許輸入用戶名稱。
CREDUI_FLAGS_PERSIST
0x01000
請勿顯示 [儲存] 複選框 ,但認證會儲存為已顯示並選取方塊。
CREDUI_FLAGS_REQUEST_ADMINISTRATOR
0x00004
僅使用本機系統管理員填入下拉式方塊。Windows XP Home Edition:此旗標會篩選掉已知的系統管理員帳戶。
CREDUI_FLAGS_REQUIRE_CERTIFICATE
0x00010
僅以憑證和智慧卡填入下拉式方塊。 不允許輸入用戶名稱。
CREDUI_FLAGS_REQUIRE_SMARTCARD
0x00100
僅以憑證或智慧卡填入下拉式方塊。 不允許輸入用戶名稱。
CREDUI_FLAGS_SERVER_CREDENTIAL
0x04000
如果驗證失敗,此旗標只有在尋找相符的認證以預先填入對話框時才有意義。 指定此旗標時,將不會比對通配符認證。 寫入認證時沒有任何作用。 CredUI 不會建立包含通配符的認證。 用戶明確建立或以程序設計方式建立任何找到的專案,就像建立 RAS 連線時一樣。
CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX
0x00040
如果選取複選框,請顯示 [儲存] 複選框,並在 pfSave 輸出參數中傳回 true TRUE,否則傳回 false。 複選框預設會使用 pfSave 中的值。
CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS
0x80000
認證是「runas」認證。 TargetName 參數會指定正在執行的命令或程式名稱。 它僅供提示之用。
CREDUI_FLAGS_VALIDATE_USERNAME
0x00400
檢查用戶名稱是否有效。

傳回值

傳回值是 DWORD,可以是下列其中一個值。

價值 描述
ERROR_CANCELLED
使用者選擇 [取消]pszUserNamepszPassword 參數尚未變更。
ERROR_INVALID_FLAGS
這個狀態會針對任何無效的旗標組態傳回。
ERROR_INVALID_PARAMETER
pszTargetName NULL、空字串或超過 CREDUI_MAX_DOMAIN_LENGTH,或 pUiInfo 不是 NULL,且指向的 CredUI_INFO 結構不符合下列其中一項需求:
  • cbSize 成員必須是一個。
  • 如果 hbmBanner 成員不是 NULL,它必須是類型OBJ_BITMAP。
  • 如果 pszMessageText 成員未 NULL,則它不得大於 CREDUI_MAX_MESSAGE_LENGTH。
  • 如果 pszCaptionText 成員不是 NULL,則它不得大於 CREDUI_MAX_CAPTION_LENGTH。
ERROR_NO_SUCH_LOGON_SESSION
無法使用認證管理員。 通常,呼叫 CredUIPromptForCredentials 並傳入 CREDUI_FLAGS_DO_NOT_PERSIST 旗標,來處理此錯誤。
NO_ERROR
使用者選擇 [確定] pszUserNamepszPassword,以及 pfSave 參數會傳回先前記載的值。

言論

CredUIPromptForCredentials 函式會建立並顯示應用程式強制回應對話方塊。 顯示對話框之後,直到使用者或應用程式關閉對話框為止,應用程式內沒有其他視窗可以變成作用中狀態。

旗標CREDUI_FLAGS_REQUIRE_SMARTCARD、CREDUI_FLAGS_REQUIRE_CERTIFICATE和CREDUI_FLAGS_EXCLUDE_CERTIFICATE互斥。

如果指定了CREDUI_FLAGS_DO_NOT_PERSIST,則必須指定 pszTargetName ,或必須指定 uiInfo-pszMessageTextuiInfo-pszCaption

旗標CREDUI_FLAG_USERNAME_TARGET_CREDENTIALS和CREDUI_FLAGS_GENERIC_CREDENTIALS互斥。 如果兩者都未指定,認證就是網域認證。

X509 憑證必須具有 增強密鑰使用 (EKU) 值 szOID_KP_SMARTCARD_LOGON (1.3.6.1.4.1.311.20.2.2)才能顯示。

Windows XP:此 EKU 值不需要顯示 X509 憑證。

如果未指定CREDUI_FLAGS_GENERIC_CREDENTIALS或指定CREDUI_FLAGS_COMPLETE_USERNAME,則會檢查具類型的名稱 語法。 語法檢查會套用 CredUIParseUserName所套用的相同規則。 如果具類型的名稱無效,系統會提示使用者輸入有效的名稱。 如果遺漏具型別名稱的網域部分,則會根據目標名稱提供一個。

如果指定了CREDUI_FLAGS_GENERIC_CREDENTIALS,而且也指定了CREDUI_FLAGS_VALIDATE_USERNAME,則會檢查具類型的名稱。 如果具類型的名稱無效,系統會提示使用者輸入有效的名稱。

如果指定了CREDUI_FLAGS_GENERIC_CREDENTIALS,而且未指定CREDUI_FLAGS_COMPLETE_USERNAME或CREDUI_FLAGS_VALIDATE_USERNAME,則不會以任何方式檢查具類型的名稱。

如果未設定CREDUI_FLAGS_PERSIST或CREDUI_FLAGS_DO_NOT_PERSIST,則會顯示 [儲存] 複選框 ,並控制認證是否已儲存。

呼叫模式

  • 呼叫端會嘗試存取目標資源、呼叫 credui(傳遞目標資源的描述和失敗狀態)、呼叫 CredUIParseUserName、再次存取目標資源,然後呼叫 CredUIConfirmCredentials
  • 呼叫端可以透過傳遞CREDUI_FLAGS_DO_NOT_PERSIST來提示認證,而不需要存取任何資源。
  • 針對泛型認證,沒有驗證套件。 因此,應用程式必須存取認證來執行驗證。 提示輸入認證,而不是在第一次驗證之前傳遞CREDUI_FLAGS_ALWAYS_SHOW_UI。 只有在認證管理員中沒有認證時,才會顯示使用者介面。 在應用程式內的所有後續訊息上,將會傳遞CREDUI_FLAGS_ALWAYS_SHOW_UI,因為認證管理員中的認證顯然對該資源無效。
目標資訊

目標資訊是所要存取之資源位置的相關信息。 如需資源所有潛在目標名稱的清單,請呼叫 CredGetTargetInfoCredGetTargetInfo 傳回交涉、NTLM 或 Kerberos 驗證套件在其中一個封裝用來向具名目標進行驗證時所快取的資訊。 CredGetTargetInfo 會針對目標傳回下列部分或所有名稱:

  • 計算機的 NetBIOS 伺服器名稱
  • 計算機的 DNS 伺服器名稱
  • 計算機所屬網域的 NetBIOS 功能變數名稱
  • 計算機所屬網域的 DNS 功能變數名稱
  • 計算機所屬樹狀結構的 DNS 樹狀目錄名稱
  • 收集資訊的套件名稱
如果資訊不適用於目標計算機,可能會遺失此資訊的任何部分。 例如,屬於工作組成員的計算機沒有 NetBIOS 功能變數名稱。

認證會根據目標名稱儲存在認證管理員中。 每個目標名稱通常會盡可能儲存,而不會與認證管理員中已儲存的認證發生衝突。 由於認證是以目標名稱儲存,因此特定使用者只能在認證管理員中儲存每個目標一個認證。

注意

wincred.h 標頭會根據 UNICODE 預處理器常數的定義,將 CredUIPromptForCredentials 定義為自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的 慣例。

要求

要求 價值
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
支援的最低伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平臺 窗戶
標頭 wincred.h
連結庫 Credui.lib
DLL Credui.dll

另請參閱

CredGetTargetInfo

CredMarshalCredential

CredUIConfirmCredentials

CredUIParseUserName

CredUIPromptForWindowsCredentials

CredUI_INFO

WNetAddConnection