Форум » [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 Вот что значит читать как придется. Написано же чисто по английски "имя ресурса", читаешь по русски "имя или ресурс". Да, плохо когда читаешь не то что написано ! Спасибо Григорий за твое терпенье !!!



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