c ++ - Kan ikke oprette forbindelse til ODBC ved brug af bruger DSN efter ImpersonateLoggedOnUser

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger for tiden Phoenix ODBC driver. Jeg kan kun få adgang til Phoenix med en bestemt bruger. Når jeg bruger SQLDriverConnect med begge brugere, virker det. Men hvis jeg kalder ImpersonateLoggedOnUser, kan SQLDriverConnect ikke finde DSN. Det giver mig følgende fejl.


[[Microsoft]] [[ODBC Driver Manager]] Datakilde navn ikke fundet og ingen standard driver angivet.


Koden er nogle hvad som følger. Vil du være sød at hjælpe mig.


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

Bedste reference


Din kode ser alt fornuftigt ud. Kontroller dog de lette ting først, da du oprettede datakilden i odbc ...



  • lavede du det i bruger- eller systemafsnittet (det skal være en system-dns-indgang, der skal ses af den bruger, du udgiver

  • er dit program en 32 bit eller en 64 bit eksekverbar, da du også kunne have oprettet den på den forkerte odbc manager (der er en i c: \ windows \ system32 (64 bit versionen) og en i c: \ windows \ sysWow64 (32bit versionen)