Autor Beitrag
BerndG
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 24.01.18 10:06 
Erst einmal: Hallo zusammen!

Crosspost aus dem Delphi-Treff, der aber in letzter Zeit relativ schwach frequentiert ist ... vielleicht habe ich ja hier mehr Glück.

Hat sich schon mal jemand mit CredUIPromptForWindowsCredentials beschäftigt?

Ich bekomme das zwar problemlos zur Anzeige, stoße dann aber aber auf 2 Probleme:

Wie lässt sich die Abfrage der Credentials auf die Smartcard einschränken (siehe angehängte Screenshots) ?
Wie prüfe ich, ob die eingegebene PIN auch die richtige ist?

Für hilfreiche Tipps danke ich im Voraus!
Zur Not darf es auch C# oder C++ sein ... :wink:

Gruß
Bernd

P.S.
Ich mache das z.Zt. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var
  UIInfo: CREDUI_INFO;
  Save: BOOL;
  AuthPackage: ULONG;
  AuthBuffer: LPVOID;
  AuthBufferSize: ULONG;
begin
  UIInfo.hwndParent := Parent;
  UIInfo.pszCaptionText := 'ProdLog';
  UIInfo.pszMessageText := 'PKI-Anmeldung erforderlich:';
  UIInfo.hbmBanner := 0;
  UIInfo.cbSize := SizeOf(CREDUI_INFO);

  AuthPackage := 0;
  Save := False;

  Result := CredUIPromptForWindowsCredentials(@UIInfo, 0, AuthPackage, nil0, AuthBuffer, AuthBufferSize, Save, 0);

  ...
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 24.01.18 11:00 
Guten Tag BerndG und willkommen,

bist du dir sicher, dass du die Funktion CredUIPromptForWindowsCredentials() meinst? Ich sehe hier keinerlei "PIN" bzw. einen Paramater, der den Zweck dafür erfüllt.
Die Funktion CredUIPromptForCredentials() hat hingegen wohl ein "Passwort" gegeben, welches man auch auf seine Gültigkeit prüfen kann.
Schön durchlesen, wofür die Funktionen verwendet werden.

Zur letzten Funktion eine Ergänzung:

Parameter: dwFlags [in]
- CREDUI_FLAGS_PASSWORD_ONLY_OK
Populate the combo box with the password only. Do not allow a user name to be entered.
- CREDUI_FLAGS_REQUIRE_SMARTCARD
Populate the combo box with certificates or smart cards only. Do not allow a user name to be entered.


Nachtrag

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
const
  { CredUIPromptForCredentials() Flags }
  CREDUI_FLAGS_INCORRECT_PASSWORD = $1;
  CREDUI_FLAGS_DO_NOT_PERSIST = $2;
  CREDUI_FLAGS_REQUEST_ADMINISTRATOR = $4;
  CREDUI_FLAGS_EXCLUDE_CERTIFICATES = $8;
  CREDUI_FLAGS_REQUIRE_CERTIFICATE = $10;
  CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX = $40;
  CREDUI_FLAGS_ALWAYS_SHOW_UI = $80;
  CREDUI_FLAGS_REQUIRE_SMARTCARD = $100;
  CREDUI_FLAGS_PASSWORD_ONLY_OK = $200;
  CREDUI_FLAGS_VALIDATE_USERNAME = $400;
  CREDUI_FLAGS_COMPLETE_USERNAME = $800;
  CREDUI_FLAGS_PERSIST = $1000;
  CREDUI_FLAGS_SERVER_CREDENTIAL = $4000;
  CREDUI_FLAGS_EXPECT_CONFIRMATION = $20000;
  CREDUI_FLAGS_GENERIC_CREDENTIALS = $40000;
  CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS = $80000;
  CREDUI_FLAGS_KEEP_USERNAME = $100000;

  { CredUIPromptForCredentials() User & Password Length }
  CREDUI_MAX_USERNAME_LENGTH = $201;
  CREDUI_MAX_PASSWORD_LENGTH = $100;

  { CredUIPromptForCredentials() Return Value }
  NO_ERROR = 0;
  ERROR_INVALID_PARAMETER = $57;
  ERROR_INVALID_FLAGS = $3EC;
  ERROR_CANCELLED = $4C7;
  ERROR_NO_SUCH_LOGON_SESSION = $520;

  {$IFDEF UNICODE}
  CUIP_FOR_CREDENTIALS = 'CredUIPromptForCredentialsW';
  {$ELSE}
  CUIP_FOR_CREDENTIALS = 'CredUIPromptForCredentialsA';
  {$ENDIF}

type
  PCREDUI_INFO = ^TCredUIInfo;
  _CREDUI_INFO = record
    cbSize: DWord;
    hwndParent: HWND;
    pszMessageText, pszCaptionText: PChar;
    hbmBanner: HBITMAP;
  end;
  CREDUI_INFO = _CREDUI_INFO;
  TCredUIInfo = _CREDUI_INFO;

function CredUIPromptForCredentials(pUiInfo: PCREDUI_INFO; pszTargetName: PChar;
  Reserved: THandle; dwAuthError: DWord; pszUserName: PChar;
  ulUserNameMaxChars: DWord; pszPassword: PChar; ulPasswordMaxChars: DWord;
  var pfSave: Boolean; dwFlags: DWord): DWord; stdcall;
  external 'Credui.dll' name CUIP_FOR_CREDENTIALS;

implementation

function ShowCredUIDialog(Target, User: stringvar Password: string): DWord;
var
  info: TCredUIInfo;
  save: Boolean;
  flags : DWord;
begin
  with info do
  begin
    cbSize := SizeOf(TCredUIInfo);
    hwndParent := 0// alternativ Application.Handle
    pszMessageText := 'PKI-Anmeldung erforderlich:';
    pszCaptionText := 'ProdLog';
    hbmBanner := 0;
  end;
  save := false;
  flags := CREDUI_FLAGS_REQUIRE_SMARTCARD or CREDUI_FLAGS_KEEP_USERNAME;

  SetLength(User, CREDUI_MAX_USERNAME_LENGTH);
  SetLength(Password, CREDUI_MAX_PASSWORD_LENGTH);

  result := CredUIPromptForCredentials(@info, PChar(Target), 00,
                                       PChar(User), CREDUI_MAX_USERNAME_LENGTH + 1,
                                       PChar(Password), CREDUI_MAX_PASSWORD_LENGTH + 1,
                                       save, flags);
end;

// Aufruf
var
  pw: string;
begin
  ShowCredUIDialog('localhost''Benutzer', pw);
  ShowMessage(pw);
end;

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
BerndG Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 30.01.18 13:58 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
bist du dir sicher, dass du die Funktion CredUIPromptForWindowsCredentials() meinst? Ich sehe hier keinerlei "PIN" bzw. einen Paramater, der den Zweck dafür erfüllt.
Die Funktion CredUIPromptForCredentials() hat hingegen wohl ein "Passwort" gegeben, welches man auch auf seine Gültigkeit prüfen kann.
Schön durchlesen, wofür die Funktionen verwendet werden.

Hab' ich brav gemacht ... alles fein durchgelesen :wink:
CredUIPromptForCredentials ist die "alte" Version.
Zitat:
Applications that target Windows Vista or Windows Server 2008 should call CredUIPromptForWindowsCredentials instead of this function, for the following reasons:
CredUIPromptForWindowsCredentials is consistent with the current Windows user interface.
CredUIPromptForWindowsCredentials is more extensible, allowing integration of additional authentication mechanisms such as biometrics and smart cards.
CredUIPromptForWindowsCredentials is compliant with the Common Criteria specification.

Mit der bekomme ich das auch problemlos hin, sieht aber k***e aus :?

Ab Vista sollte CredUIPromptForWindowsCredentials verwendet werden, die dann in ppvOutAuthBuffer etwas zurückliefert das man mit CredUnPackAuthenticationBuffer weiterverarbeiten kann.
Mit pulAuthPackage kann man der Funktion irgendwie mitteilen, welche Provider aufgelistet werden sollen:
Zitat:
If the value of pvInAuthBuffer is NULL and the CREDUIWIN_AUTHPACKAGE_ONLY flag is set in the dwFlags parameter, only credential providers capable of serializing credentials for the specified authentication package are to be enumerated.

Den gewünschten Provider holt man sich mit LsaLookupAuthenticationPackage()

Bloß wie???
Ich komme zwar in der Regel halbwegs mit dem Windows-API klar, aber hier steig ich dann irgendwann aus ...