【问题标题】:Cannot connect to ODBC using user DSN after ImpersonateLoggedOnUser在 ImpersonateLoggedOnUser 之后无法使用用户 DSN 连接到 ODBC
【发布时间】:2018-10-08 02:57:20
【问题描述】:

我目前正在使用 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
    );

【问题讨论】:

    标签: c++ windows odbc impersonation phoenix


    【解决方案1】:

    您的代码看起来都很合理。但是,首先检查简单的东西,当您在 odbc 中创建数据源时......

    • 你是在用户部分还是系统部分创建的(它需要是一个系统 dns 条目才能被你模拟的用户看到
    • 您的程序是 32 位还是 64 位可执行文件,因为您也可以在不正确的 odbc 管理器上创建它(在 c:\windows\system32(64 位版本)中有一个,在 c:\windows 中有一个\sysWow64(32位版本)

    【讨论】:

    • 是的,我实际上已经检查过了。它在使用具有正确用户 ID 并注释 ImpersonateLoggedOnUser 的 runas 启动进程时起作用。我还用普通用户测试了代码 SQLDriverConnect 工作正常,只是我无法读取数据,我得到异常,我无权读取或写入数据。问候,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多