更新架構快取的範例程序代碼
下列 C/C++ 函式會取得架構主機的 DNS 名稱(GetSchemaMasterDNSName),並在架構主機更新架構快取 (UpdateSchemaMasterCache)。 若要使用這些函式,請呼叫 GetSchemaMasterDNSName 以取得架構主要 DNS 名稱,將架構主要 DNS 名稱傳遞至 UpdateSchemaMasterCache,在包含架構主要 DNS 名稱的字串上呼叫 CoTaskMemFree。
如需詳細資訊,請參閱 更新架構快取。
HRESULT UpdateSchemaMasterCache(LPOLESTR szSchemaMasterDNSName)
{
if (!szSchemaMasterDNSName)
return E_POINTER;
HRESULT hr = E_FAIL;
IADs *pObject = NULL;
VARIANT var;
LPOLESTR szPath = new OLECHAR[MAX_PATH];
wcscpy_s(szPath,L"LDAP://");
wcscat_s(szPath,szSchemaMasterDNSName);
wcscat_s(szPath,L"/rootDSE");
hr = ADsOpenObject(szPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,
(void**)&pObject);
if (SUCCEEDED(hr))
{
VariantInit(&var);
var.vt = VT_I4;
var.lVal = 1L;
hr = pObject->Put(CComBSTR("schemaUpdateNow"), var);
if (SUCCEEDED(hr))
{
hr = pObject->SetInfo();
if (SUCCEEDED(hr))
MessageBox(NULL,L"Updated",L"Extend Schema Wizard",MB_OK|MB_ICONEXCLAMATION);
else
MessageBox(NULL,L"Update Failed",L"Extend Schema Wizard",MB_OK|MB_ICONEXCLAMATION);
}
}
if (pObject)
pObject->Release();
return hr;
}
HRESULT GetSchemaMasterDNSName(LPOLESTR *pszSchemaMasterDNSName)
{
if (!pszSchemaMasterDNSName)
return E_POINTER;
HRESULT hr = E_FAIL;
IADs *pObject = NULL;
IADs *pTempSchema = NULL;
IADs *pNTDS = NULL;
IADs *pServer = NULL;
BSTR bstrParent;
LPOLESTR szPath = new OLECHAR[MAX_PATH];
VARIANT var, varRole,varComputer;
hr = ADsOpenObject(L"LDAP://rootDSE",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,
(void**)&pObject);
if (SUCCEEDED(hr))
{
hr = pObject->Get(CComBSTR("schemaNamingContext"), &var);
if (SUCCEEDED(hr))
{
wcscpy_s(szPath,L"LDAP://");
wcscat_s(szPath,var.bstrVal);
hr = ADsOpenObject(szPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,
(void**)&pTempSchema);
if (SUCCEEDED(hr))
{
// Read the fsmoRoleOwner attribute to see which server is the schema master.
hr = pTempSchema->Get(CComBSTR("fsmoRoleOwner"), &varRole);
if (SUCCEEDED(hr))
{
// fsmoRoleOwner attribute returns the nTDSDSA object.
// The parent is the server object.
// Bind to NTDSDSA object and get the parent object.
wcscpy_s(szPath,L"LDAP://");
wcscat_s(szPath,varRole.bstrVal);
hr = ADsOpenObject(szPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,
(void**)&pNTDS);
if (SUCCEEDED(hr))
{
hr = pNTDS->get_Parent(&bstrParent);
if (SUCCEEDED(hr))
{
// Bind to server object
// and get the reference to the computer object.
wcscpy_s(szPath,bstrParent);
hr = ADsOpenObject(szPath,
NULL,
NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,
(void**)&pServer);
if (SUCCEEDED(hr))
{
// Get the dns name of the server.
hr = pServer->Get(CCOmBSTR("dNSHostName"), &varComputer);
if (SUCCEEDED(hr))
{
*pszSchemaMasterDNSName = (OLECHAR *)CoTaskMemAlloc (sizeof(OLECHAR)*(wcslen(varComputer.bstrVal)+1));
if (*pszSchemaMasterDNSName)
{
wcscpy_s(*pszSchemaMasterDNSName, varComputer.bstrVal);
}
else
{
hr = E_OUTOFMEMORY;
}
}
VariantClear(&varComputer);
}
if (pServer)
pServer->Release();
}
SysFreeString(bstrParent);
}
if (pNTDS)
pNTDS->Release();
}
VariantClear(&varRole);
}
if (pTempSchema)
pTempSchema->Release();
}
VariantClear(&var);
}
if (pObject)
pObject->Release();
return hr;
}