サービスのSpnの登録
次のコード例では、サービスインスタンスの1つ以上のサービスプリンシパル名 (Spn) を登録または登録解除します。
この例では、DsWriteAccountSpn関数を呼び出します。この関数は、pszServiceAcctDNパラメーターで指定されたアカウントオブジェクトのservicePrincipalName属性の下に、Active Directoryドメインサービスのspnを格納します。 アカウントオブジェクトは、このサービスインスタンスのCreateService呼び出しで指定されたログオンアカウントに対応します。 ログオンアカウントがドメインユーザーアカウントの場合、pszServiceAcctDNは、そのユーザーアカウントのActive Directoryドメインサーバー内のアカウントオブジェクトの識別名である必要があります。 サービスのログオンアカウントがLocalSystemアカウントの場合、pszServiceAcctDNは、サービスがインストールされているホストコンピューターのコンピューターアカウントオブジェクトの識別名である必要があります。
/***************************************************************************
SpnRegister()
Register or unregister the SPNs under the service's account.
If the service runs in LocalSystem account, pszServiceAcctDN is the
distinguished name of the local computer account.
Parameters:
pszServiceAcctDN - Contains the distinguished name of the logon
account for this instance of the service.
pspn - Contains an array of SPNs to register.
ulSpn - Contains the number of SPNs in the array.
Operation - Contains one of the DS_SPN_WRITE_OP values that determines
the type of operation to perform on the SPNs.
***************************************************************************/
DWORD SpnRegister(TCHAR *pszServiceAcctDN,
TCHAR **pspn,
unsigned long ulSpn,
DS_SPN_WRITE_OP Operation)
{
DWORD dwStatus;
HANDLE hDs;
TCHAR szSamName[512];
DWORD dwSize = sizeof(szSamName) / sizeof(szSamName[0]);
PDOMAIN_CONTROLLER_INFO pDcInfo;
// Bind to a domain controller.
// Get the domain for the current user.
if(GetUserNameEx(NameSamCompatible, szSamName, &dwSize))
{
TCHAR *pWhack = _tcschr(szSamName, '\\');
if(pWhack)
{
*pWhack = '\0';
}
}
else
{
return GetLastError();
}
// Get the name of a domain controller in that domain.
dwStatus = DsGetDcName(NULL,
szSamName,
NULL,
NULL,
DS_IS_FLAT_NAME |
DS_RETURN_DNS_NAME |
DS_DIRECTORY_SERVICE_REQUIRED,
&pDcInfo);
if(dwStatus != 0)
{
return dwStatus;
}
// Bind to the domain controller.
dwStatus = DsBind(pDcInfo->DomainControllerName, NULL, &hDs);
// Free the DOMAIN_CONTROLLER_INFO buffer.
NetApiBufferFree(pDcInfo);
if(dwStatus != 0)
{
return dwStatus;
}
// Write the SPNs to the service account or computer account.
dwStatus = DsWriteAccountSpn(
hDs, // Handle to the directory.
Operation, // Add or remove SPN from account's existing SPNs.
pszServiceAcctDN, // DN of service account or computer account.
ulSpn, // Number of SPNs to add.
(const TCHAR **)pspn); // Array of SPNs.
// Unbind the DS in any case.
DsUnBind(&hDs);
return dwStatus;
}