¿Cómo habilito MSDTC en SQL Server?

106

¿Es esta incluso una pregunta válida? Tengo una aplicación de Windows .NET que usa MSTDC y está lanzando una excepción:

System.Transactions.TransactionManagerCommunicationException: se ha deshabilitado el acceso a la red para el Administrador de transacciones distribuidas (MSDTC). Habilite DTC para el acceso a la red en la configuración de seguridad de MSDTC utilizando la herramienta administrativa de servicios de componentes ---> System.Runtime.InteropServices.COMException (0x8004D024): el administrador de transacciones ha deshabilitado su soporte para transacciones remotas / de red. (Excepción de HRESULT: 0x8004D024) en System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction (UInt32 propgationTokenSize, Byte [] propgationToken, IntPtr managedIdentifier, Guid & transactionIdentifier, OletxTransactionIsolationShimevelevel ...

Seguí la guía de Kbalertz para habilitar MSDTC en la PC en la que está instalada la aplicación, pero el error persiste.

Me preguntaba si esto era un problema de base de datos. Si es así, ¿cómo puedo solucionarlo?

Dan
fuente
Si las soluciones mencionadas no resuelven el problema, consulte este enlace
Shahab J

Respuestas:

127

Use esto para Windows Server 2008 r2 y Windows Server 2012 R2

  1. Haga clic en Inicio , haga clic en Ejecutar , escriba dcomcnfg y luego haga clic en Aceptar para abrir Servicios de componentes .

  2. En el árbol de la consola, haga clic para expandir Servicios de componentes , haga clic para expandir Equipos , haga clic para expandir Mi PC , haga clic para expandir Coordinador de transacciones distribuidas y luego haga clic en DTC local .

  3. Haga clic con el botón derecho en Local DTC y haga clic en Propiedades para mostrar el cuadro de diálogo Propiedades de DTC local .

  4. Haga clic en la pestaña Seguridad .

  5. Marque la casilla de verificación "Acceso a DTC de red" .

  6. Por último, marque las casillas de verificación "Permitir entrantes" y "Permitir salientes" .

  7. Haga clic en Aplicar , Aceptar .

  8. Aparecerá un mensaje sobre el reinicio del servicio.

  9. Haga clic en Aceptar y eso es todo.

Referencia: https://msdn.microsoft.com/en-us/library/dd327979.aspx

Nota: A veces, el firewall de la red en la computadora local o el servidor podría interrumpir su conexión, así que asegúrese de crear reglas para "Permitir conexiones entrantes" y "Permitir salientes" paraC:\Windows\System32\msdtc.exe

Shiv Singh
fuente
También funciona para Windows Server 2012 R2. Gracias por las claras instrucciones. ¡Nunca hubiera encontrado esto por mi cuenta!
jonazu
@jonazu ahora también he actualizado la respuesta para Windows Server 2012 R2 :)
Shiv Singh
¡Buen trabajo ShivSingh!
Super Coder
La ruta correcta msdtc.exees:c:\windows\system32\msdtc.exe
firepol
1
Parece haber un error en el que estas propiedades no se adhieren cuando se configuran a través de la interfaz de usuario, al menos en los nodos agrupados de Server 2016. La solución consiste en establecer estas propiedades manualmente en el Registro: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Más información sobre las propiedades aquí .
Paul
102

¿Incluso necesita MSDTC? La escalada que experimenta a menudo se debe a la creación de múltiples conexiones dentro de un solo TransactionScope.

Si lo necesita, debe habilitarlo como se describe en el mensaje de error. En XP:

  • Vaya a Herramientas administrativas -> Servicios de componentes
  • Expanda Servicios de componentes -> Computadoras ->
  • Haga clic derecho -> Propiedades -> pestaña MSDTC
  • Presione el botón Configuración de seguridad
Andrew Peters
fuente
2
También en el firewall de Windows, abrí el puerto 135 TCP y agregué c: \ windows \ msdtc.exe como excepción
Sameer Alibhai
20
Gracias por el comentario sobre el error causado por la creación de múltiples conexiones dentro de un solo TransactionScope. Estaba recibiendo el error y ese era exactamente el problema. No quería usar el MSDTC, así que encontré la nueva conexión errante y reutilicé una existente. ¡Gracias!
Jim McKeeth
10
Estoy en Windows 7 y 8, y solo hay una sección de "Coordinador predeterminado". ¿Dónde puedo acceder a la configuración de seguridad de la que estás hablando?
qdev76
2
1) Haga clic con el botón derecho en Local DTC y elija propiedades 2) Abra la pestaña de seguridad 3) Verifique al menos Acceso a DTC de red, Permitir clientes remotos y Permitir entrada.
Rob Sedgwick
19

Descubrí que la mejor manera de depurar es usar la herramienta de microsoft llamada DTCPing

  1. Copie el archivo tanto en el servidor (DB) como en el cliente (servidor de aplicaciones / PC cliente)
    • Iniciarlo en el servidor y en el cliente
    • En el servidor: complete el nombre de la computadora netbios del cliente e intente configurar una conexión DTC
    • Reinicie ambas aplicaciones.
    • En el cliente: complete el nombre de la computadora del servidor netbios e intente configurar una conexión DTC

He tenido problemas con las tarifas en la red de nuestra antigua empresa y tengo algunos consejos:

  • Si recibe el mensaje de error "Gethostbyname failed", significa que la computadora no puede encontrar la otra computadora por su nombre netbios . El servidor podría, por ejemplo, resolver y hacer ping al cliente, pero eso funciona a nivel de DNS. No en un nivel de búsqueda de netbios. Usar servidores WINS o cambiar el LMHOST (sucio) resolverá este problema.
  • si recibe un error "Acceso denegado", la configuración de seguridad no coincide. Debe comparar la pestaña de seguridad para msdtc y hacer que el servidor y el cliente coincidan. Otra cosa a tener en cuenta es el valor de RestrictRemoteClients . Según la versión de su sistema operativo y, lo que es más importante, el Service Pack, este valor puede ser diferente.
  • Otros problemas de conexión:
    • El cortafuegos entre el servidor y el cliente debe permitir la comunicación a través del puerto 135. Y lo que es más importante, la conexión se puede iniciar desde ambos sitios (tuve muchos problemas con la gente del cortafuegos de mi empresa porque asumieron que solo el servidor abriría una conexión en ese puerto)
    • El protocolo devuelve un puerto aleatorio al que conectarse para la comunicación de la transacción real. A la gente de firewall no le gusta eso, les gusta restringir los puertos a un cierto rango. Puede restringir la generación de puertos dinámicos RPC a un cierto rango usando las claves como se describe en Cómo configurar la asignación de puertos dinámicos RPC para trabajar con firewalls .

En mi experiencia, si el DTCPing puede configurar una conexión DTC iniciada desde el cliente e iniciada desde el servidor, sus transacciones ya no son el problema.

Davy Landman
fuente
6

También puede ver aquí cómo activar MSDTC desde services.msc del Panel de control.

En el servidor donde reside el desencadenador, debe activar el servicio MSDTC. Puede hacerlo haciendo clic en INICIO> AJUSTES> PANEL DE CONTROL> HERRAMIENTAS ADMINISTRATIVAS> SERVICIOS. Busque el servicio llamado 'Coordinador de transacciones distribuidas' y HAGA CLIC DERECHO (sobre él y seleccione)> Iniciar.

Cameron Castillo
fuente
4

MSDTC debe estar habilitado en ambos sistemas, tanto el servidor como el cliente.
Además, asegúrese de que no haya un firewall entre los sistemas que bloquee RPC.
DTCTest es una pequeña aplicación que te ayuda a solucionar cualquier otro problema.

Lars Mæhlum
fuente
Creo que esta es la nueva ubicación microsoft.com/en-us/download/details.aspx?id=30746
Air2
4

@Dan,

¿No necesito msdtc habilitado para que las transacciones funcionen?

Solo transacciones distribuidas: aquellas que involucran más de una conexión. Asegúrese doblemente de estar abriendo una única conexión dentro de la transacción y no escalará; el rendimiento también será mucho mejor.

Andrew Peters
fuente
¿No necesito msdtc habilitado para que las transacciones funcionen? De cualquier manera, hasta donde yo sé, no se están haciendo múltiples conexiones. Ya ejecuté esos pasos en la PC cliente, ¿estás diciendo que también debería hacer esos pasos en el servidor de la base de datos?
Dan
@Dan, no es necesario que habilite DTC si está utilizando transacciones de ado.net. Debe habilitar MSDTC en el servidor solo si está utilizando transacciones distribuidas
Niraj