Не удается подключиться к ODBC, используя DSN пользователя после ImpersonateLoggedOnUser

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

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

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

//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
);

0

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]