Comment activer MSDTC sur SQL Server?

106

Est-ce même une question valable? J'ai une application Windows .NET qui utilise MSTDC et qui lève une exception:

System.Transactions.TransactionManagerCommunicationException: l'accès au réseau pour Distributed Transaction Manager (MSDTC) a été désactivé. Veuillez activer DTC pour l'accès réseau dans la configuration de sécurité pour MSDTC à l'aide de l'outil d'administration des services de composants ---> System.Runtime.InteropServices.COMException (0x8004D024): le gestionnaire de transactions a désactivé sa prise en charge des transactions distantes / réseau. (Exception de HRESULT: 0x8004D024) à System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction (UInt32 propgationTokenSize, Byte [] propgationToken, IntPtr managedIdentifier, Guid & transactionIdentifier, OletxTransactionIsolationLevel & isolationShransaction

J'ai suivi le guide Kbalertz pour activer MSDTC sur le PC sur lequel l'application est installée, mais l'erreur persiste.

Je me demandais si c'était un problème de base de données? Si oui, comment puis-je le résoudre?

Dan
la source
Si les solutions mentionnées ne résolvent pas le problème, consultez ce lien
Shahab J

Réponses:

127

Utilisez ceci pour Windows Server 2008 r2 et Windows Server 2012 R2

  1. Cliquez sur Démarrer , sur Exécuter , tapez dcomcnfg , puis cliquez sur OK pour ouvrir les services de composants .

  2. Dans l'arborescence de la console, cliquez pour développer Services de composants , cliquez pour développer Ordinateurs , cliquez pour développer Poste de travail , cliquez pour développer Distributed Transaction Coordinator , puis cliquez sur DTC local .

  3. Cliquez avec le bouton droit sur DTC local et cliquez sur Propriétés pour afficher la boîte de dialogue Propriétés DTC local .

  4. Cliquez sur l' onglet Sécurité .

  5. Cochez la case "Accès DTC réseau" .

  6. Enfin, cochez les cases "Autoriser les entrées" et "Autoriser les sorties" .

  7. Cliquez sur Appliquer , OK .

  8. Un message apparaîtra sur le redémarrage du service.

  9. Cliquez sur OK et c'est tout.

Référence: https://msdn.microsoft.com/en-us/library/dd327979.aspx

Remarque: Parfois, le pare-feu réseau de l'ordinateur local ou du serveur peut interrompre votre connexion. Assurez-vous donc de créer des règles pour "Autoriser les connexions entrantes" et "Autoriser les connexions sortantes" pourC:\Windows\System32\msdtc.exe

Shiv Singh
la source
Fonctionne également pour Windows Server 2012 R2. Merci pour les instructions claires. Je n'aurais jamais trouvé ça par moi-même!
jonazu
@jonazu maintenant j'ai mis à jour la réponse pour Windows Server 2012 R2 aussi :)
Shiv Singh
Bon travail ShivSingh!
Super Coder
Le chemin correct de msdtc.exeest est:c:\windows\system32\msdtc.exe
firepol
1
Il semble y avoir un bogue où ces propriétés ne collent pas lorsqu'elles sont définies via l'interface utilisateur, du moins sur les nœuds Server 2016 en cluster. La solution est de définir ces propriétés manuellement dans le Registre: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Plus d'informations sur les propriétés ici .
Paul
102

Avez-vous même besoin de MSDTC? L'escalade que vous rencontrez est souvent causée par la création de plusieurs connexions dans un seul TransactionScope.

Si vous en avez besoin, vous devez l'activer comme indiqué dans le message d'erreur. Sur XP:

  • Allez dans Outils d'administration -> Services de composants
  • Développez Services de composants -> Ordinateurs ->
  • Cliquez avec le bouton droit -> Propriétés -> onglet MSDTC
  • Appuyez sur le bouton Configuration de la sécurité
Andrew Peters
la source
2
Également dans le pare-feu Windows, j'ai ouvert le port 135 TCP et ajouté c: \ windows \ msdtc.exe à titre d'exception
Sameer Alibhai
20
Merci pour le commentaire sur l'erreur causée par la création de plusieurs connexions dans un seul TransactionScope. J'obtenais l'erreur et c'était exactement le problème. Je ne voulais pas utiliser le MSDTC, j'ai donc trouvé la nouvelle connexion errante et réutilisé une existante. Merci!
Jim McKeeth
10
Je suis sous Windows 7 et 8, et il n'y a qu'une section "Default Coordinator". Où puis-je accéder à la configuration de sécurité dont vous parlez?
qdev76
2
1) Cliquez avec le bouton droit sur Local DTC et choisissez les propriétés 2) Ouvrez l'onglet de sécurité 3) Vérifiez au moins l'accès DTC réseau, Autoriser les clients distants et Autoriser les entrées.
Rob Sedgwick
19

J'ai trouvé que la meilleure façon de déboguer est d'utiliser l'outil Microsoft appelé DTCPing

  1. Copiez le fichier à la fois sur le serveur (DB) et le client (serveur d'application / ordinateur client)
    • Démarrez-le sur le serveur et le client
    • Sur le serveur: remplissez le nom de l'ordinateur client netbios et essayez de configurer une connexion DTC
    • Redémarrez les deux applications.
    • Au niveau du client: remplissez le nom de l'ordinateur netbios du serveur et essayez de configurer une connexion DTC

J'ai eu des problèmes de tarifs dans notre ancien réseau d'entreprise et j'ai quelques conseils:

  • si vous obtenez le message d'erreur «Gethostbyname failed», cela signifie que l'ordinateur ne peut pas trouver l'autre ordinateur par son nom netbios . Le serveur pourrait par exemple résoudre et envoyer un ping au client, mais cela fonctionne au niveau DNS. Pas au niveau de la recherche netbios. L'utilisation de serveurs WINS ou la modification du LMHOST (sale) résoudra ce problème.
  • si vous obtenez une erreur «Accès refusé», les paramètres de sécurité ne correspondent pas. Vous devez comparer l'onglet de sécurité pour le msdtc et faire correspondre le serveur et le client. Une autre chose à examiner est la valeur RestrictRemoteClients . En fonction de la version de votre système d'exploitation et surtout du Service Pack, cette valeur peut être différente.
  • Autres problèmes de connexion:
    • Le pare-feu entre le serveur et le client doit permettre la communication via le port 135. Et plus important encore, la connexion peut être initiée à partir des deux sites (j'ai eu beaucoup de problèmes avec les pare-feu de mon entreprise car ils supposaient que seul le serveur ouvrirait une connexion sur ce port)
    • Le protocole renvoie un port aléatoire auquel se connecter pour la communication de transaction réelle. Les pare-feu n'aiment pas ça, ils aiment restreindre les ports à une certaine plage. Vous pouvez limiter la génération de port dynamique RPC à une certaine plage à l'aide des clés, comme décrit dans Comment configurer l'allocation de port dynamique RPC pour fonctionner avec les pare-feu .

D'après mon expérience, si le DTCPing est capable de configurer une connexion DTC initiée à partir du client et initiée à partir du serveur, vos transactions ne sont plus le problème.

Davy Landman
la source
6

Vous pouvez également voir ici comment activer MSDTC à partir des services.msc du Panneau de configuration.

Sur le serveur sur lequel réside le déclencheur, vous devez activer le service MSDTC. Vous pouvez cela en cliquant sur DÉMARRER> PARAMÈTRES> PANNEAU DE CONTRÔLE> OUTILS ADMINISTRATIFS> SERVICES. Trouvez le service appelé 'Distributed Transaction Coordinator' et cliquez avec le bouton droit (dessus et sélectionnez)> Démarrer.

Cameron Castillo
la source
4

MSDTC doit être activé sur les deux systèmes, serveur et client.
Assurez-vous également qu'il n'y a pas de pare-feu entre les systèmes qui bloque RPC.
DTCTest est une belle application litt qui vous aide à résoudre tout autre problème.

Lars Mæhlum
la source
Je pense que c'est le nouvel emplacement microsoft.com/en-us/download/details.aspx?id=30746
Air2
4

@Dan,

N'ai-je pas besoin que msdtc soit activé pour que les transactions fonctionnent?

Uniquement les transactions distribuées - Celles qui impliquent plus d'une connexion unique. Assurez-vous doublement que vous n'ouvrez qu'une seule connexion au sein de la transaction et cela n'augmentera pas - les performances seront également bien meilleures.

Andrew Peters
la source
N'ai-je pas besoin que msdtc soit activé pour que les transactions fonctionnent? Quoi qu'il en soit, plusieurs connexions ne sont pas établies pour autant que je sache. J'ai déjà exécuté ces étapes sur le PC client, dites-vous que je devrais également faire ces étapes sur le serveur de base de données?
Dan
@Dan, vous n'êtes pas obligé d'activer DTC si vous utilisez des transactions ado.net. Vous devez activer MSDTC sur le serveur uniquement si vous utilisez des transactions distribuées
Niraj