Karşılıklı Kerberos kimlik doğrulaması almak
Bu örnek odbc kullanarak karşılıklı Kerberos kimlik doğrulaması almak nasıl gösterir SQL ServerNative Client.
Bu örnek-ecek değil iş ile birisi yorum-in SQL Serverdaha önce SQL Server 2008.
Daha fazla bilgi için, bkz. Istemci bağlantıları'nda hizmet asıl adı (spn) desteği.
Örnek
Eğer kurmak ve bu örnek 32 bitlik bir uygulama bir 64-bit işletim sisteminde çalışan, odbc Yöneticisi'nde % windir%\SysWOW64\odbcad32.exe ile odbc veri kaynağı oluşturmanız gerekir.
Bu örnek için bilgisayarınızın varsayılan bağlar SQL Serverörneği. Adlandırılmış bir örneğine bağlanmak için aşağıdaki biçimi kullanarak belirtmek için odbc veri kaynağı tanımını değiştirin: server\namedinstance. Varsayılan olarak, SQL Server Expressadlandırılmış bir örneğine yüklenir.
Değişim "Sunucum" bir makine adı örneği olan SQL Server 2008(veya daha yenisi).
Ayrıca müşteri tarafından sağlanan bir spn belirtmek gerekir. Change" CP_SPN" için müşteri tarafından sağlanan bir spn.
/EHsc, d "_UNICODE" d "UNICODE" ve odbc32.lib ile derleyin. Sqlncli.h içeren dizinin, INCLUDE çevre değişkeni içerdiğinden emin olun.
// compile with: /EHsc /D "_UNICODE" /D "UNICODE" odbc32.lib
#define WIN32_LEAN_AND_MEAN
#include <tchar.h>
#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#define _SQLNCLI_ODBC_
#include <sqlncli.h>
#define SUCCESS(x) (!((x) & 0xFFFE))
#define CHKRC(stmt) do \
{ \
rc = (stmt); \
if (!SUCCESS(rc)) \
throw (RETCODE) rc; \
} while(0);
void PrintError(SQLSMALLINT HandleType, SQLHANDLE Handle) {
RETCODE rc = SQL_SUCCESS;
SQLTCHAR szSqlState[6], szMessage[1024];
SQLSMALLINT i = 1, msgLen = 0;
SQLINTEGER NativeError;
do {
i = 1;
while (SQL_NO_DATA != (rc = SQLGetDiagRec(HandleType, Handle, i, szSqlState, &NativeError,
szMessage, sizeof(szMessage)/sizeof(SQLTCHAR), &msgLen)) && SUCCESS(rc)) {
_tprintf(_T("SQLState=%s, NativeError=%ld, Message=%s\r\n"), szSqlState, NativeError, szMessage);
i++;
}
}
while (SQL_NO_DATA != (rc = SQLMoreResults(Handle)) && SUCCESS(rc));
}
int _tmain(int argc, _TCHAR* argv[]) {
RETCODE rc = SQL_SUCCESS;
HENV henv = SQL_NULL_HENV;
HDBC hdbc = SQL_NULL_HDBC;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLTCHAR * pszConnection = _T("DRIVER={SQL Server Native Client 10.0};")
_T("Server=MyServer;") // server with SQL Server 2008 (or later)
_T("Trusted_Connection=Yes;")
_T("ServerSPN=CP_SPN"); // customer-provided SPN
TCHAR szIntgAuthMethod[64];
SQLSMALLINT fMutuallyAuth = 0;
try {
CHKRC(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &henv));
CHKRC(SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0));
CHKRC(SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc));
CHKRC(SQLDriverConnect( hdbc, NULL, pszConnection, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT));
CHKRC(SQLGetConnectAttr(hdbc, SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD, szIntgAuthMethod, sizeof(szIntgAuthMethod)/sizeof(szIntgAuthMethod[0]), NULL));
CHKRC(::SQLGetConnectAttrW(hdbc, SQL_COPT_SS_MUTUALLY_AUTHENTICATED, &fMutuallyAuth, SQL_IS_SMALLINT, NULL));
_tprintf(_T("Authentication method: %s\r\n"), szIntgAuthMethod);
_tprintf(_T("Mutually authenticated: %s\r\n"), fMutuallyAuth?_T("yes"):_T("no"));
}
catch (RETCODE retcode) {
rc = retcode;
}
if (!SUCCESS(rc)) {
if (hstmt)
PrintError(SQL_HANDLE_STMT, hstmt);
else if (hdbc)
PrintError(SQL_HANDLE_DBC, hdbc);
else if(henv)
PrintError(SQL_HANDLE_ENV, henv);
}
if (hstmt)
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if (hdbc) {
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
if (henv)
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
// compile with: /EHsc /D "_UNICODE" /D "UNICODE" odbc32.lib
#define WIN32_LEAN_AND_MEAN
#include <tchar.h>
#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#define _SQLNCLI_ODBC_
#include <sqlncli.h>
#define SUCCESS(x) (!((x) & 0xFFFE))
#define CHKRC(stmt) do \
{ \
rc = (stmt); \
if (!SUCCESS(rc)) \
throw (RETCODE) rc; \
} while(0);
void PrintError(SQLSMALLINT HandleType, SQLHANDLE Handle) {
RETCODE rc = SQL_SUCCESS;
SQLTCHAR szSqlState[6], szMessage[1024];
SQLSMALLINT i = 1, msgLen = 0;
SQLINTEGER NativeError;
do {
i = 1;
while (SQL_NO_DATA != (rc = SQLGetDiagRec(HandleType, Handle, i, szSqlState, &NativeError,
szMessage, sizeof(szMessage)/sizeof(SQLTCHAR), &msgLen)) && SUCCESS(rc)) {
_tprintf(_T("SQLState=%s, NativeError=%ld, Message=%s\r\n"), szSqlState, NativeError, szMessage);
i++;
}
}
while (SQL_NO_DATA != (rc = SQLMoreResults(Handle)) && SUCCESS(rc));
}
int _tmain(int argc, _TCHAR* argv[]) {
RETCODE rc = SQL_SUCCESS;
HENV henv = SQL_NULL_HENV;
HDBC hdbc = SQL_NULL_HDBC;
SQLHSTMT hstmt = SQL_NULL_HSTMT;
SQLTCHAR * pszConnection = _T("DRIVER={SQL Server Native Client 10.0};")
_T("Server=MyServer;") // server with SQL Server 2008 (or later)
_T("Trusted_Connection=Yes;")
_T("ServerSPN=CP_SPN"); // customer-provided SPN
TCHAR szIntgAuthMethod[64];
SQLSMALLINT fMutuallyAuth = 0;
try {
CHKRC(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &henv));
CHKRC(SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0));
CHKRC(SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc));
CHKRC(SQLDriverConnect( hdbc, NULL, pszConnection, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT));
CHKRC(SQLGetConnectAttr(hdbc, SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD, szIntgAuthMethod, sizeof(szIntgAuthMethod)/sizeof(szIntgAuthMethod[0]), NULL));
CHKRC(::SQLGetConnectAttrW(hdbc, SQL_COPT_SS_MUTUALLY_AUTHENTICATED, &fMutuallyAuth, SQL_IS_SMALLINT, NULL));
_tprintf(_T("Authentication method: %s\r\n"), szIntgAuthMethod);
_tprintf(_T("Mutually authenticated: %s\r\n"), fMutuallyAuth?_T("yes"):_T("no"));
}
catch (RETCODE retcode) {
rc = retcode;
}
if (!SUCCESS(rc)) {
if (hstmt)
PrintError(SQL_HANDLE_STMT, hstmt);
else if (hdbc)
PrintError(SQL_HANDLE_DBC, hdbc);
else if(henv)
PrintError(SQL_HANDLE_ENV, henv);
}
if (hstmt)
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
if (hdbc) {
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
if (henv)
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}