Registro de los SPN para un servicio
En el ejemplo de código siguiente se registra o anula el registro de uno o varios nombres de entidad de seguridad de servicio (SPN) para una instancia de servicio.
El ejemplo llama a la función DsWriteAccountSpn, que almacena los SPN en Servicios de dominio de Active Directory bajo el atributo servicePrincipalName del objeto account especificado por el parámetro pszServiceAcctDN. El objeto account corresponde a la cuenta de inicio de sesión especificada en la llamada CreateService para esta instancia de servicio. Si la cuenta de inicio de sesión es una cuenta de usuario de dominio, pszServiceAcctDN debe ser el nombre distintivo del objeto de cuenta en Dominio de Active Directory Servidores para esa cuenta de usuario. Si la cuenta de inicio de sesión del servicio es la cuenta LocalSystem, pszServiceAcctDN debe ser el nombre distintivo del objeto de cuenta de equipo para el equipo host en el que está instalado el servicio.
/***************************************************************************
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;
}