Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sampel ini menunjukkan cara mendapatkan autentikasi Kerberos bersama dengan menggunakan OLE DB di Driver OLE DB untuk SQL Server. Sampel ini berfungsi dengan SQL Server 2008 (10.0.x) dan versi yang lebih baru.
Untuk informasi selengkapnya tentang SPN dan autentikasi Kerberos, lihat Dukungan Nama Prinsipal Layanan (SPN) di Koneksi Klien.
Contoh
Anda harus menentukan server. Dalam file .cpp, ubah "MyServer" menjadi nama komputer yang memiliki instans SQL Server 2008 (10.0.x) dan versi yang lebih baru.
Anda juga harus menentukan SPN yang disediakan pelanggan. Dalam file .cpp, ubah "CPSPN" menjadi SPN yang disediakan pelanggan.
Pastikan variabel lingkungan INCLUDE Anda menyertakan direktori yang berisi msoledbsql.h. Kompilasi dengan ole32.lib oleaut32.lib.
// compile with: ole32.lib oleaut32.lib
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>
#include <msoledbsql.h>
#define CHECKHR(stmt) \
do\
{\
hr = (stmt);\
if (FAILED(hr))\
{\
printf("CHECK_HR " #stmt " failed at (%hs, %d), hr=0x%08X\r\n", __FILE__, __LINE__, hr); \
goto CleanUp; \
} \
} while (0)
#define SAFERELEASE(p) \
do\
{\
if ((p) != nullptr)\
{\
p->Release(); \
p = nullptr; \
} \
} while (0)
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = S_OK;
IDBInitialize* pInitialize = nullptr;
IDBProperties* pProperties = nullptr;
DBPROP rgDBProp[1] = {};
LPCWSTR lpwszProviderString = L"Server=MyServer;" // server with SQL Server 2008 (or later)
L"Trusted_Connection=Yes;"
L"Encrypt=Mandatory;"
L"ServerSPN=CP_SPN;"; // customer-provided SPN
DBPROPSET* prgPropertySets = nullptr;
ULONG cPropertySets = 0;
CHECKHR(CoInitialize(nullptr));
CHECKHR(CoCreateInstance(CLSID_MSOLEDBSQL, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IDBProperties), reinterpret_cast<void**>(&pProperties)));
// set provider string
rgDBProp[0].dwPropertyID = DBPROP_INIT_PROVIDERSTRING;
rgDBProp[0].dwOptions = DBPROPOPTIONS_REQUIRED;
rgDBProp[0].colid = DB_NULLID;
VariantInit(&(rgDBProp[0].vValue));
V_VT(&(rgDBProp[0].vValue)) = VT_BSTR;
V_BSTR(&(rgDBProp[0].vValue)) = SysAllocString(lpwszProviderString);
{ // set the property to the property set
DBPROPSET PropertySet[1] = {};
PropertySet[0].rgProperties = &rgDBProp[0];
PropertySet[0].cProperties = 1;
PropertySet[0].guidPropertySet = DBPROPSET_DBINIT;
// set properties and connect to server
CHECKHR(pProperties->SetProperties(sizeof(PropertySet)/sizeof(DBPROPSET), PropertySet));
}
CHECKHR(pProperties->QueryInterface<IDBInitialize>(&pInitialize));
CHECKHR(pInitialize->Initialize());
{ // get properties
DBPROPIDSET rgDBPropIDSet[1] = {};
DBPROPID rgDBPropID[2] = {};
rgDBPropID[0] = SSPROP_INTEGRATEDAUTHENTICATIONMETHOD;
rgDBPropID[1] = SSPROP_MUTUALLYAUTHENTICATED;
rgDBPropIDSet[0].rgPropertyIDs = &rgDBPropID[0];
rgDBPropIDSet[0].cPropertyIDs = 2;
rgDBPropIDSet[0].guidPropertySet = DBPROPSET_SQLSERVERDATASOURCEINFO;
CHECKHR(pProperties->GetProperties(1, rgDBPropIDSet, &cPropertySets, &prgPropertySets));
}
wprintf(L"Authentication method: %s\r\n", V_BSTR(&(prgPropertySets[0].rgProperties[0].vValue)));
wprintf(L"Mutually authenticated: %s\r\n",
(V_BOOL(&(prgPropertySets[0].rgProperties[1].vValue)) == VARIANT_TRUE) ? L"yes" : L"no");
CleanUp:
SAFERELEASE(pProperties);
SAFERELEASE(pInitialize);
if (prgPropertySets)
{
for (ULONG iPropSet = 0; iPropSet < cPropertySets; ++iPropSet)
{
for (ULONG iProp = 0; iProp < prgPropertySets[iPropSet].cProperties; ++iProp)
{
VariantClear(&prgPropertySets[iPropSet].rgProperties[iProp].vValue);
}
}
}
VariantClear(&(rgDBProp[0].vValue));
CoUninitialize();
}