Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов стандартного диалога выбора пользователя windows и ввода пароля / 17 сообщений из 17, страница 1 из 1
27.09.2021, 11:35
    #40100165
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
Всeм доброго дня,

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

Спасибо
...
Рейтинг: 0 / 0
27.09.2021, 13:43
    #40100192
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
hlopotun
и получить оба значения
Забудьте. Пароль никто вам не отдаст. Но могут отдать токен авторизованного пользователя
...
Рейтинг: 0 / 0
27.09.2021, 14:25
    #40100220
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
...
Рейтинг: 0 / 0
27.09.2021, 14:27
    #40100222
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
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
27.09.2021, 14:36
    #40100228
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
Как известно, код в интернете - говно , но:
Код: 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
27.09.2021, 14:37
    #40100229
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
Мимопроходящий
404


Это уже вопрос к MS.
...
Рейтинг: 0 / 0
27.09.2021, 14:38
    #40100230
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
Вот так, как альтернативная ссылка: CredUIPromptForCredentials .
...
Рейтинг: 0 / 0
27.09.2021, 17:29
    #40100285
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
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
27.09.2021, 19:14
    #40100312
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
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
27.09.2021, 19:33
    #40100318
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
GunSmoker
Мимопроходящий
404


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

В web-archive нет, но вот из кэша гугла .
...
Рейтинг: 0 / 0
27.09.2021, 23:07
    #40100351
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
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
28.09.2021, 09:05
    #40100383
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов стандартного диалога выбора пользователя windows и ввода пароля
YuRock

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


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


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

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

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


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