Не удается подключиться к ODBC, используя DSN пользователя после ImpersonateLoggedOnUser - PullRequest
0 голосов
/ 27 апреля 2018

В настоящее время я использую драйвер Phoenix ODBC. Я могу получить доступ к Фениксу только с определенным пользователем. Когда я использую SQLDriverConnect с обоими пользователями, это работает. Но если я вызываю ImpersonateLoggedOnUser, то SQLDriverConnect не может найти DSN. Это дает мне следующую ошибку.

[Microsoft] [Диспетчер драйверов ODBC] Не найдено имя источника данных и не указан драйвер по умолчанию.

Код - это что-то вроде следующего. Не могли бы вы помочь мне, пожалуйста.

//login with user
DWORD     dwSize;
HANDLE    hToken;
LPVOID    lpvEnv;
PROCESS_INFORMATION pi = {0};
STARTUPINFO         si = {0};
WCHAR               szUserProfile[256] = L"";


TCHAR * tstrUserName = L"USERNAME" ;
TCHAR * tstrPassword = L"PASSWORD" ;

si.cb = sizeof(STARTUPINFO);
if (!LogonUser( 
    tstrUserName, 
    NULL, 
    tstrPassword, 
    LOGON32_LOGON_INTERACTIVE, 
    LOGON32_PROVIDER_DEFAULT, 
    &hToken
    )
)
{
    auto value = GetLastError();
    throw "Cannot Login With ANOTHER USER";
}

ImpersonateLoggedOnUser(hToken);
w_char *connectionString = L"DSN=Phoenix";
SQL_ENVIRONMENT env;
SQL_DBC_HANDLE dbcHandle;


if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env) == SQL_ERROR)
{
    throw;
}

// Register this as an application that expects 3.x behavior,
// you must register something if you use AllocHandle
SQLSetEnvAttr(env,
            SQL_ATTR_ODBC_VERSION,
            (SQLPOINTER)SQL_OV_ODBC3,
            0);

//allocate a connection
RETCODE ret = 0;
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbcHandle);
if(ret == SQL_ERROR || dbcHandle == nullptr )
    throw;

//connect with driver to odbc
ret = SQLDriverConnect( dbcHandle, 
    nullptr, 
    connectionString,
    SQL_NTS,
    nullptr,
    0,
    nullptr,
    SQL_DRIVER_NOPROMPT
    );

1 Ответ

0 голосов
/ 27 апреля 2018

Ваш код выглядит все разумно. Однако сначала проверьте простые вещи, когда вы создали источник данных в odbc ...

  • Вы создали его в разделе пользователей или системы (это должна быть запись системного днс, которую должен видеть пользователь, выдававший себя за
  • - это ваша программа 32-битная или 64-битная исполняемая программа, которую вы могли бы также создать в неправильном менеджере odbc (есть одна в c: \ windows \ system32 (64-битная версия) и одна в c: \ windows \ sysWow64 (32-битная версия)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...