Форум » [x]Harbour » Как можно воспользоваться Windо-вым запросом пароля ? » Ответить

Как можно воспользоваться Windо-вым запросом пароля ?

Andrey: Уважаемые гуру ! Надеюсь на вашу подсказку и снисхождения..... Надоел в своих прогах простой запрос на ввод пароля. Как к терминалу хХарбора подключить стандартный Windows-запрос пароля. Если к терминалу прицепили "диалог проводника- сохранение или запись файла, папки...", то наверно можно и этот вызвать ! А как ?

Ответов - 54, стр: 1 2 3 All

Andrey: Нашел: CredUIPromptForCredentials http://msdn2.microsoft.com/en-us/library/aa375177.aspx и только начиная с XP в висте так вообще вот эта CredUIPromptForWindowsCredentials http://www.ishodniki.ru/art/print.php?cat=1&id=467&show=net А как сделать рабочую программку, не знаю. Знатоки "С" - помогите !!!!

Pasha: Эта функция находится в credui.dll, которая есть в XP Во-первых, тебе понадобится файл wincred.h, которого нет в bcc55, но есть в bcc582 Но я думаю что с этим файлом будет работать и bcc55. Давай емайл Набросал функцию. Извини, не проверял (с) Брат Переменную dwFlags сформируй сам. Не очень понятно как формировать pfSave #pragma BEGINDUMP #include <windows.h> #include <wincred.h> #include "hbapi.h" HB_FUNC( WINLOGON ) { char szTarget[256]; char szUserName[256]; char szPassword[256]; PBOOL pfSave; DWORD WINAPI ulRet; DWORD dwFlags = 0; szTarget[255] = 0; szUserName[255] = 0; ulRet = CredUIPromptForCredentials( NULL, szTarget, NULL, 0, szUserName, 255, szPassword, 255, pfSave, dwFlags); hb_retl( (ulRet == NO_ERROR) ? TRUE : FALSE ); }

Pasha: в конце надо добавить #pragma ENDDUMP


Andrey: Pasha пишет: Давай емайл 30195@mail.ru

Pasha: отправил wincred.h Надо еще добавить описание DWORD ulRet;

Andrey: Pasha пишет: Надо еще добавить описание DWORD ulRet; А куда нужно добавить ?

Andrey: Сделал тестовый пример и не собирается. Помогите кто может. FUNCTION MAIN() LOCAL cPassword := "andrey", cUserName := "Admin", cTarget := "None" IF Os_IsWinXP() .OR. Os_IsWinVista() .OR. Os_IsWin2003() ? WINLOGON(cTarget,cUserName,cPassword) ELSE ALERT("Only for WinXP, Win2003, WinVista !") ENDIF RETURN NIL ********************************************************* /*Эта функция "CredUIPromptForCredentials" находится в credui.dll, которая есть в XP Во-первых, тебе понадобится файл wincred.h, которого нет в bcc55, но есть в bcc582 Но я думаю что с этим файлом будет работать и bcc55 Переменную dwFlags сформируй сам. Не очень понятно как формировать pfSave */ #pragma BEGINDUMP #include <windows.h> #include <wincred.h> #include "hbapi.h" HB_FUNC( WINLOGON ) { char szTarget[256]; char szUserName[256]; char szPassword[256]; PBOOL pfSave; DWORD WINAPI ulRet; DWORD dwFlags = 0; szTarget[255] = 0; szUserName[255] = 0; ulRet = CredUIPromptForCredentials( NULL, szTarget, NULL, 0, szUserName, 255, szPassword, 255, pfSave, dwFlags); hb_retl( (ulRet == NO_ERROR) ? TRUE : FALSE ); } #pragma ENDDUMP

Pasha: какая ошибка при сборке ?

Pasha: Похоже не будет работать эта функция под bcc55 Надо не только wincred.h, а и остальные *.h от мелкософт Нужен bcc582

Петр: Адаптировал для своих нужд. Может кому-то еще пригодится #define NO_ERROR 0 #define ERROR_CANCELLED 1223 #define ERROR_INVALID_FLAGS 1004 #define ERROR_INVALID_PARAMETER 87 #define ERROR_NO_SUCH_LOGON_SESSION 1312 PROCEDURE main() Local pCredUI_Info Local cTargetName := "server\bux" Local cUserName := "User1" Local cPassword := "my^ъpasw" Local lSave := .t. Local nFlags := 0 Local nResult pCredUI_Info := CredUI_Info( 0, "My Message", "My Caption", 0 ) nResult := CredUIPrompt( pCredUI_Info, cTargetName, 0, @cUserName, @cPassword, lSave, nFlags ) if nResult == NO_ERROR ? "Пользователь : ", cUserName ? "Пароль : ", cPassword elseif nResult == ERROR_CANCELLED ? "Пользователь выбрал Cancel." elseif nResult == ERROR_INVALID_FLAGS ? "ERROR_INVALID_FLAGS - придется смотреть документацию :-(" elseif nResult == ERROR_INVALID_PARAMETER ? "ERROR_INVALID_PARAMETER - придется смотреть документацию :-(" elseif nResult == ERROR_NO_SUCH_LOGON_SESSION ? "ERROR_NO_SUCH_LOGON_SESSION - придется смотреть документацию :-(" else //-1000 ? "Невозможно загрузить credui.dll" endif pCredUI_Info := Nil RETURN 0 #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #define CREDUI_MAX_CAPTION_LENGTH 128 #define CREDUI_MAX_MESSAGE_LENGTH 32767 #define CREDUI_MAX_PASSWORD_LENGTH 256 #define CREDUI_MAX_USERNAME_LENGTH 513 typedef struct _CREDUI_INFO { DWORD cbSize; HWND hwndParent; PCTSTR pszMessageText; PCTSTR pszCaptionText; HBITMAP hbmBanner; } CREDUI_INFO, *PCREDUI_INFO; typedef DWORD (CALLBACK* CredUIPromptForCredentials)(PCREDUI_INFO, PCTSTR, void*, DWORD, PCTSTR, ULONG, PCTSTR, ULONG, BOOL*, DWORD ); static PCREDUI_INFO hb_parCredUI_Info( int iParam ); HB_FUNC( CREDUIPROMPT ) { HINSTANCE hDLL = LoadLibrary( "credui.dll" ); LONG lRes = -1000L; if ( hDLL ) { CredUIPromptForCredentials CredUIPrompt = (CredUIPromptForCredentials) GetProcAddress(hDLL, "CredUIPromptForCredentialsA"); if ( CredUIPrompt != NULL ) { PCREDUI_INFO pUiInfo = hb_parCredUI_Info( 1 ); LPSTR pszTargetName = hb_parc( 2 ); DWORD dwAuthError = hb_parni( 3 ); LPSTR pszUserName = hb_parcx(4); LPSTR pszPassword = hb_parcx(5); BOOL pfSave = hb_parl( 6 ); DWORD dwFlags = hb_parni( 7 ); char* szUserName = hb_xgrab( CREDUI_MAX_USERNAME_LENGTH + 1 ); char* szPassword = hb_xgrab( CREDUI_MAX_PASSWORD_LENGTH + 1 ); strcpy( szUserName, pszUserName ); strcpy( szPassword, pszPassword ); lRes = CredUIPrompt( pUiInfo, pszTargetName, NULL, dwAuthError, szUserName, CREDUI_MAX_USERNAME_LENGTH, szPassword, CREDUI_MAX_PASSWORD_LENGTH, &pfSave, dwFlags ); hb_storc( szUserName, 4 ); hb_storc( szPassword, 5 ); hb_xfree( szUserName ); hb_xfree( szPassword ); if ( ISBYREF(6) ) { hb_storl( pfSave, 6 ); } } FreeLibrary( hDLL ); } hb_retnl( lRes ); } /* destructors, it's executed automatically */ static HB_GARBAGE_FUNC( hb_CREDUI_INFO_Destructor ) { PCREDUI_INFO * ppCredUI_Info = (PCREDUI_INFO*) Cargo; if( ppCredUI_Info && *ppCredUI_Info ) { PCREDUI_INFO pInfo = ( PCREDUI_INFO ) ppCredUI_Info; hb_xfree( (LPSTR) pInfo->pszMessageText ); hb_xfree( (LPSTR) pInfo->pszCaptionText ); if( pInfo->hbmBanner != NULL ) { DeleteObject( pInfo->hbmBanner ); pInfo->hbmBanner = NULL; } *ppCredUI_Info = NULL; } } /* */ static PCREDUI_INFO hb_parCredUI_Info( int iParam ) { PCREDUI_INFO pCredUI_Info = (PCREDUI_INFO) hb_parptrGC( hb_CREDUI_INFO_Destructor, iParam ); if( pCredUI_Info ) { return pCredUI_Info; } else { return NULL; } } HB_FUNC( CREDUI_INFO ) { CREDUI_INFO CredUI_Info = { 0 }; PCREDUI_INFO pCredUI_Info; CredUI_Info.cbSize = sizeof( CREDUI_INFO ); CredUI_Info.hwndParent = ( HWND ) hb_parnl( 1 ); CredUI_Info.pszMessageText = hb_strndup( hb_parc(2), CREDUI_MAX_MESSAGE_LENGTH - 1); CredUI_Info.pszCaptionText = hb_strndup( hb_parc(3), CREDUI_MAX_CAPTION_LENGTH - 1); //Note: The bitmap size is limited to 320x60 pixels. if( GetObjectType((HGDIOBJ) hb_parnl(4)) == OBJ_BITMAP ) { CredUI_Info.hbmBanner = ( HBITMAP ) hb_parnl( 4 ); } pCredUI_Info = ( PCREDUI_INFO ) hb_gcAlloc( sizeof(CREDUI_INFO), hb_CREDUI_INFO_Destructor ); *pCredUI_Info = CredUI_Info; hb_retptrGC( (void*) pCredUI_Info ); } #pragma ENDDUMP

Andrey: Петр пишет: Может кому-то еще пригодится Конечно понадобится !!! Большое спасибо !!! Куда пиво высылать ????

Andrey: А как сделать чтоб ОКНО ПАРОЛЯ не пряталось под все другие открытые окна задач ? юзера мышкой тыкнут и бегут с криком задача не пускает работать....

Петр: При вызове функции CredUI_Info в качестве первого параметра нужно указать хэндл родительского окна, например так: hWnd := GetForegroundWindow() hBitmap := LoadBitmap("MYLOGO") pCredUI_Info := CredUI_Info( hWnd, "My Message", "My Caption", hBitmap )

Andrey: Error: Unresolved external '_HB_FUN_GETFOREGROUNDWINDOW' referenced from D:\@\TEST_PASSWORD\TEST2.OBJ Error: Unresolved external '_HB_FUN_LOADBITMAP' referenced from D:\@\TEST_PASSWORD\TEST2.OBJ Нет таких функций в хХарборе. Если есть у тебя, то можешь ли их дать ?

Петр: Лично для тебя http://clipper.fastbb.ru/?1-4-0-00000136-000-0-0-1168687120

Andrey: Не надо ловить по мелочам .... Эту функцию нашел, уже после отправки . А где взять LOADBITMAP() ?

gfilatov: Andrey пишет: где взять LOADBITMAP() ? /* Harbour MiniGUI 1.3 Extended (Build 33) Author P.Chornyj Function LoadBitmap() --------------------- Syntax LoadBitmap( cBitmap ) --> nHandle Arguments <cBitmap> is the name of resource Returns If the function succeeds, the return value is the handle to the specified bitmap. If the function fails, the return value is 0. */ HB_FUNC( LOADBITMAP ) { PHB_ITEM bitmap = hb_param( 1, HB_IT_STRING ); if( bitmap != NULL ) { hb_retnl( (LONG) LoadBitmap(GetModuleHandle(NULL), hb_parc(1)) ); } else { hb_retnl( NULL ); } }

Andrey: Спасибо за функцию ! Только картинка в ПАРОЛЕ (MyLOGO) не появляется ! Что делать ?

gfilatov: Andrey пишет: Только картинка в ПАРОЛЕ (MyLOGO) не появляется ! gfilatov пишет: Arguments <cBitmap> is the name of resource Картинка размера 320х60 должна быть добавлена в РЕСУРСЫ Win-приложения

Andrey: gfilatov пишет: <cBitmap> is the name of resource Вот что значит читать как придется. Написано же чисто по английски "имя ресурса", читаешь по русски "имя или ресурс". Да, плохо когда читаешь не то что написано ! Спасибо Григорий за твое терпенье !!!

Andrey: После добавления этой функции на некоторых компах происходит непонятное - при выходе из программы появляется такое сообщение: Закономерности не нашел. Взял установил на ноутбуке чистую систему ХР sp2 и на чистой системе такая же фигня. Хотя во многих местах стоит эта же программа и ничего не появляется. Как избавиться от ЭТОГО сообщения при выходе из программы ???

k_dima: Никто не пробовал прикрутить после запроса данных пользователя, их проверку через WinApi функцию LogonUser() ? Я нашел примерчик на http://www.rsdn.ru/Archive/VC/issues/pvc072.htm и добавил строчку ret=LogonUserA(szUserName,pszTargetName,szPassword,LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,&hToken); после запроса пароля, но, почему то, проверки не происходит и возвращается 0.

Andrey: Использую эту функцию ввода пароля ! Но есть большая проблема: на некоторых компах не могу ВООБЩЕ ввести ПОЛЬЗОВАТЕЛЯ ! Ввод заблокирован !!! Что делать ?

fil: Приведенная Петром программа, "Адаптировал для своих нужд", работает замечательно. А как указать несколько Пользователей дабы выбирать их из выпадающего списка ?

Andrey: Опять возвращаюсь к этой теме ! Может кто-нибудь уже разобрался с этим ? Использую эту функцию ввода пароля ! Уже очень давно, года 3 наверно ! Но есть большая проблема: на некоторых компах не могу ВООБЩЕ ввести ПОЛЬЗОВАТЕЛЯ ! Ввод заблокирован !!! Что делать ?

fil: Если проблема в том, что Get ввода не активен, то можно найти его хендл и сделать Enable

Andrey: Andrey пишет: Но есть большая проблема: на некоторых компах не могу ВООБЩЕ ввести ПОЛЬЗОВАТЕЛЯ ! Ввод заблокирован !!! Проблема в ЭТОМ !

PSP: Andrey пишет: Но есть большая проблема: на некоторых компах не могу ВООБЩЕ ввести ПОЛЬЗОВАТЕЛЯ ! Ввод заблокирован !!! Проблема в ЭТОМ ! Возможно, учетная запись администратора на этих компьютерах не имеет пароля. Политика безопасности Windows по-умолчанию не разрешает подключение к компьютеру, если учетка администратора не имеет пароля.

fil: Ну хендл Combobox'a, один черт

Andrey: PSP пишет: Возможно, учетная запись администратора на этих компьютерах не имеет пароля. Политика безопасности Windows по-умолчанию не разрешает подключение к компьютеру, если учетка администратора не имеет пароля. Т.е. если создать пароль для "Администратора" этого компа, то заработает ? Спасибо, попробую.

PSP: Нужно установить пароль ко всем учетным записям, имеющим права администратора. Их на компьютере может быть не одна. PS: в общем случае, чтобы подключаться к компьютеру по сети, используя локальную учетку, эта учетка должна иметь пароль.

Andrey: PSP пишет: Нужно установить пароль ко всем учетным записям, имеющим права администратора. Проверил ! Не работает ! На компе Windows XP Home, один пользователь с администраторским доступом. Пароль сделал. Все равно при входе не дает вводить имя пользователя: Что делать ?

PSP: Andrey пишет: На компе Windows XP Home Вот это и есть проблема. Что делать ? Имхо, ничего ты не сделаешь. PS: ... хотя надо еще подумать...

Dima: PSP пишет: PS: ... хотя надо еще подумать... Похоже нужно что то в реестре "хакнуть" , но это конечно не выход :)

PSP: Андрей, выполни: control userpasswords2. Что винда нарисовала?

Andrey: Обломс..... До понедельника. Комп недоступен.

Andrey: PSP пишет: Андрей, выполни: control userpasswords2. Что винда нарисовала? Вот это: И что дальше ?

PSP: Andrey пишет: И что дальше ? Скажи, а эта фича только на компах с Home Edition?

PSP: PS. И еще: проверь, есть ли на этих компах учетка "Гость". Если есть и выключена - включи.

Andrey: PSP пишет: Скажи, а эта фича только на компах с Home Edition? По всей видимости ДА ! Попробовать не смогу, комп уже недоступен. До завтра !

Andrey: Pasha А нельзя ли "отвязать" эту функцию от НАСТРОЕК WINDOWS ?

Andrey: PSP пишет: И еще: проверь, есть ли на этих компах учетка "Гость". Если есть и выключена - включи. Включил ! Все равно не работает ! Взял пример в MiniGUI\SAMPLES\Advanced\GetPassword - работает ! Значит что-то в моем исходнике. Буду разбираться.

Andrey: Всем привет ! Возвращаюсь к проблеме "нет возможности ввода пользователя" в графу ПОЛЬЗОВАТЕЛЬ: ! Взял пример в MiniGUI\SAMPLES\Advanced\GetPassword - работает ! Мой нет. Решил переделать пример из папки GetPassword на хХарбор терминал GTWIN ! Столкнулся с С-ными ошибками. Помогите, кто может .... Пример здесь http://files.mail.ru/EPFUX9

Pasha: Обьявление static-структуры static const HB_GC_FUNCS s_gcCREDUI_INFOFuncs = { hb_CREDUI_INFO_Destructor, hb_gcDummyMark }; надо перенести перед первой функцией а что такое hb_CREDUI_INFO_Destructor, hb_gcDummyMark ? Эти функции нигде не обьявлены

Andrey: Pasha пишет: Эти функции нигде не обьявлены Так не знаю где взять. Я это пример из папки МиниГУи взял. Подправь пожалуйста чтоб заработал этот пример. А пароль не везде работает ....

Pasha: Andrey пишет: Так не знаю где взять. Я это пример из папки МиниГУи взял. так в примере нет структуры s_gcCREDUI_INFOFuncs

Andrey: Pasha пишет: так в примере нет структуры s_gcCREDUI_INFOFuncs А в МиниГуи он собирается. Для меня это загадка ...

Andrey: Вот отдельный пример, который "не работает" на некоторых компах. http://files.mail.ru/GQSPX7 Т.е. в графу USER: ничего нельзя ввести ! Может здесь ЧТО-ТО подкрутить можно ?

Andrey: Всем привет ! Опять возвращаюсь к проблеме "нет возможности ввода пользователя" в графу ПОЛЬЗОВАТЕЛЬ: ! Сделали сетку в другом городе, моя программа не пускает ввести ЛОГИН пользователя. В качестве СЕРВЕРА WinXP Prof SP2, в качестве клиента где нельзя ввести пользователя - WinXP Home SP3. Что можно подкрутить в сети ? Или что можно подкрутить в исходнике ? - исходник здесь http://files.mail.ru/GYVUYV

Dima: Andrey А сваяй свой диалог , пример тут svn\harbour-trunk\harbour\contrib\hbwin\tests\dlg.prg

Andrey: Dima пишет: А сваяй свой диалог , пример тут svn\harbour-trunk\harbour\contrib\hbwin\tests\dlg.prg У меня хХарбор 1.0 и 1.2 , на Харбор пока еще не перешел... Нехватка времени...

Dima: Andrey И зря он пошустрее будет и стабильнее. Я перешел легко на него как с Clipper так и с Xharbour.

Andrey: Dima пишет: А сваяй свой диалог , пример тут svn\harbour-trunk\harbour\contrib\hbwin\tests\dlg.prg Я жду от тебя пример диалога !

Dima: Andrey пишет: Я жду от тебя пример диалога ! Чес слово не поняв о чем ты ;) DLG.PRG и DLG.RC есть , разбирай и осмысливай.



полная версия страницы