powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов стандартного диалога выбора пользователя windows и ввода пароля
17 сообщений из 17, страница 1 из 1
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100165
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всeм доброго дня,

есть ли уже что то готовое что можно вызвать либо через windows api или через библиотеки delphi?
По сути нужен диалог в котором можно выбрать конкретного пользователя локального или доменного из списка, ввести его пароль и получить оба значения (domen\имя_пользователя или pc\имя_пользователя и пароль) на выходе в свой код.
Начал рисовать но подумал может не стоит велосипед изобретать и воспользоваться готовым чем то.

Спасибо
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100192
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
и получить оба значения
Забудьте. Пароль никто вам не отдаст. Но могут отдать токен авторизованного пользователя
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100220
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100222
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
27.09.2021 14:25, GunSmoker пишет:
> CredUIPromptForCredentials < https://docs.microsoft.com/en-us/windows/desktop/api/wincred/nf-wincred-creduipromptforcredentialsa>.

404
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100228
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как известно, код в интернете - говно , но:
Код: pascal
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.
90.
{$A8}
function LoginUser(const ACaption, AMessage: String; var AUserName, APassword: String; var ASavePassword: Boolean): Boolean;
type
  PCredUIInfo = ^TCredUIInfo;
  TCredUIInfo = record
    cbSize: DWORD;
    hwndParent: HWND;
    pszMessageText: PChar;
    pszCaptionText: PChar;
    hbmBanner: HBITMAP;
  end;

var
  Lib: HMODULE;
  CredUIPromptForCredentials: function(pUiInfo: PCredUIInfo; pszTargetName: PChar; pContext: Pointer; dwAuthError: DWORD; pszUserName: PChar; ulUserNameBufferSize: ULONG; pszPassword: PChar; ulPasswordBufferSize: ULONG; var save: BOOL; dwFlags: DWORD): DWORD; stdcall;
  CredInfo: TCredUIInfo;
  User, Password: String;
  Ret: DWORD;
  Save: BOOL;
const
  MAXBUFLEN                                = 10240;  // maximum login and password length in chars
  credui                                   = 'credui.dll';
  CredUIPromptForCredentialsName           = {$IFDEF UNICODE}
                                             'CredUIPromptForCredentialsW'
                                             {$ELSE}
                                             'CredUIPromptForCredentialsA'
                                             {$ENDIF};
  CREDUI_FLAGS_INCORRECT_PASSWORD          = $00001; // indicates the username is valid, but password is not
  CREDUI_FLAGS_DO_NOT_PERSIST              = $00002; // Do not show "Save" checkbox, and do not persist credentials
  CREDUI_FLAGS_REQUEST_ADMINISTRATOR       = $00004; // Populate list box with admin accounts
  CREDUI_FLAGS_EXCLUDE_CERTIFICATES        = $00008; // do not include certificates in the drop list
  CREDUI_FLAGS_REQUIRE_CERTIFICATE         = $00010;
  CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX         = $00040;
  CREDUI_FLAGS_ALWAYS_SHOW_UI              = $00080;
  CREDUI_FLAGS_REQUIRE_SMARTCARD           = $00100;
  CREDUI_FLAGS_PASSWORD_ONLY_OK            = $00200;
  CREDUI_FLAGS_VALIDATE_USERNAME           = $00400;
  CREDUI_FLAGS_COMPLETE_USERNAME           = $00800;
  CREDUI_FLAGS_PERSIST                     = $01000; // Do not show "Save" checkbox, but persist credentials anyway
  CREDUI_FLAGS_SERVER_CREDENTIAL           = $04000;
  CREDUI_FLAGS_EXPECT_CONFIRMATION         = $20000; // do not persist unless caller later confirms credential via CredUIConfirmCredential() api
  CREDUI_FLAGS_GENERIC_CREDENTIALS         = $40000; // Credential is a generic credential
  CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS = $80000; // Credential has a username as the target
  CREDUI_FLAGS_KEEP_USERNAME               = $100000; // don't allow the user to change the supplied username
begin
  Lib := SafeLoadLibrary(credui);
  if Lib = 0 then
    RaiseLastOSError;
  try
    CredUIPromptForCredentials := GetProcAddress(Lib, CredUIPromptForCredentialsName);
    if not Assigned(CredUIPromptForCredentials) then
      RaiseLastOSError;
    FillChar(CredInfo, SizeOf(CredInfo), 0);
    CredInfo.cbSize := SizeOf(CredInfo);
    if Screen.FocusedForm <> nil then
      CredInfo.hwndParent := Screen.FocusedForm.Handle
    else if Screen.ActiveForm <> nil then
      CredInfo.hwndParent := Screen.ActiveForm.Handle
    else
      CredInfo.hwndParent := 0;
    CredInfo.pszCaptionText := PChar(ACaption);
    CredInfo.pszMessageText := PChar(AMessage);
    User := AUserName + #0;
    Password := APassword + #0;
    Save := ASavePassword;
    SetLength(User, MAXBUFLEN);
    SetLength(Password, MAXBUFLEN);
    Ret := CredUIPromptForCredentials(@CredInfo, nil, nil, 0, PChar(User), MAXBUFLEN, PChar(Password), MAXBUFLEN, Save, CREDUI_FLAGS_ALWAYS_SHOW_UI or CREDUI_FLAGS_DO_NOT_PERSIST or CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX or CREDUI_FLAGS_GENERIC_CREDENTIALS);
    case Ret of
      NO_ERROR:
      begin
        AUser := PChar(User);
        APassword := PChar(Password);
        ASavePassword := Save;
        Result := True;
        Exit;
      end;
      ERROR_CANCELLED:
      begin
        Result := False;
        Exit;
      end;
    else
      SetLastError(Ret);
      RaiseLastOSError;
    end;
  finally
    FreeLibrary(Lib);
  end;
end;
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100229
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
404


Это уже вопрос к MS.
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100230
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так, как альтернативная ссылка: CredUIPromptForCredentials .
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100285
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker
Мимопроходящий
404


Это уже вопрос к MS.


пара маленьких исправлений:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
......
 AUser := PChar(User);  // заменить на ->   AUserName := PChar(User); похоже на описку
......
и в 
    else
      result := false; //<-- Добавить Иначе может быть неоднозначность
      SetLastError(Ret);
      RaiseLastOSError;
    end;



спасибо, то что надо было
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100312
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
GunSmoker
пропущено...


Это уже вопрос к MS.


пара маленьких исправлений:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
......
 AUser := PChar(User);  // заменить на ->   AUserName := PChar(User); похоже на описку
......
и в 
    else
      result := false; //<-- Добавить Иначе может быть неоднозначность
      SetLastError(Ret);
      RaiseLastOSError;
    end;




спасибо, то что надо было
Result в случае raise (который следом идет) можешь засунуть в одно место. Лишняя операция.
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100318
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Мимопроходящий
404


Это уже вопрос к MS.

В web-archive нет, но вот из кэша гугла .
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100351
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Result в случае raise (который следом идет) можешь засунуть в одно место. Лишняя операция.
Да. Но компилятор будет бросать ворнинг.

Я бы так написал
Код: pascal
1.
2.
3.
4.
5.
    else
      SetLastError(Ret);
      RaiseLastOSError;
      result := false;
    end;

или даже так
Код: pascal
1.
2.
3.
4.
    else
      RaiseLastOSError(Ret);
      result := false;
    end;

и ворнинга не будет и операция не выполнится
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100383
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock

..........
спасибо, то что надо было
Result в случае raise (который следом идет) можешь засунуть в одно место. Лишняя операция.
оно понятно, но предупреждение глаза царапало.
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100385
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
интересно по какому принципу в раскрывающийся список этого окна попадают пользователи? Просто последние которые использовались когда то? И рядом с раскрывающимся списком есть кнопка с многоточием, у меня она не активна. Подозреваю по ней можно дополнительных пользователей искать но как её активировать? Или это вопрос текущих прав пользователя?
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100394
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и можно ли этот список наполнить пользователями которые известны программе. Насколько я понимаю, в этот диалог можно передать только одного пользователя.
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100411
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
404


у меня открывается
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100412
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11
Мимопроходящий
404


у меня открывается

да, уже починили. Быстро среагировали :)
...
Рейтинг: 0 / 0
Вызов стандартного диалога выбора пользователя windows и ввода пароля
    #40100422
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Да. Но компилятор будет бросать ворнинг.

По этой причине у себя я заменил все штуки вроде RaiseError(...) на raise Error(...).
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов стандартного диалога выбора пользователя windows и ввода пароля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]