Exécuter en tant qu'administrateur et Marshal.GetActiveObject

Aujourd'hui, en examinant un problème sur l'application d'un client, je suis tombé sur quelque chose de bien étrange.

L'application tente de se connecter à AutoCAD en utilisant Marshal.GetActiveObject de façon à récupérer le nom du document actif comme je l'avais expliqué dans cet article. Mais il semblerait que l'application ne fonctionne pas sur certaines machines.

Je compile donc l'application dans Visual Studio et je la lance en mode Debug pour la tester. Et là pas moyen de détecter AutoCAD, alors que ce dernier est bien en cours d'exécution. J'ai une exception COM CO_E_CLASSSTRING (0x800401F3). Une petite recherche sur Google m'amène alors sur ce fil de discussion. Comme mon Visual Studio s'exécute en tant qu'administrateur, je me suis dit que j'avais le même problème. Et effectivement, en le lançant sans élévation de privilèges, l'application se connecte normalement à AutoCAD.

Donc si vous avez une application qui communique avec AutoCAD en out-of-process qui ne fonctionne pas, vérifiez que vous ne l'exécutez pas en tant qu'administrateur. Vous pouvez pour cela utiliser le gestionnaire de tâches. Dans l'onglet Détails, cliquez avec le bouton droit de la souris sur les entêtes de colonne :

Le menu contextuel des colonnes

Sélectionnez la colonne Virtualisation du contrôle de compte utilisateur. Cette colonne peut prendre 3 valeurs :

  • Désactivé ;
  • Non autorisé ;
  • Activé.

Si c'est la valeur Non autorisé qui est affichée, c'est que votre programme fonctionne en tant qu'administrateur.

Vous pouvez utiliser également Process Explorer. La colonne Integrity va afficher Niveau obligatoire élevé si l'application a été lancée en tant qu'administrateur.

Mise à jour du 07/04/2016 : il semblerait que c'est suite à une modification effectuée par Microsoft à partir de Windows Vista pour des raisons de sécurité. Sur les versions récentes de Windows, si une application s'exécute avec un niveau d'intégrité supérieur à moyen et si le contrôle de compte utilisateur (UAC) est activé, le moteur d'exécution COM ignore la configuration spécifique à un utilisateur et ne consulte que la configuration globale.

Dans le cas d'AutoCAD et d'Inventor, cela empêche la récupération du serveur COM. Ce qui est un peu étrange d'ailleurs, car il semblerait que le serveur COM est bien enregistré dans HKLM, pour AutoCAD au moins. C'est peut être parce que la configuration HKCU masque la HKLM dans HKEY_CLASSES_ROOT.

Pour ce qui est de l'UAC, il faut savoir que positionner le curseur tout en bas dans les paramètres de contrôle de compte utilisateur ne désactive pas l'UAC dans Windows 10 (dans le 7 ça marche, mais je ne sais pas pour 8 & 8.1). Pour le désactiver réellement, il faut mettre à 0 la valeur HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA dans la base de registre et redémarrer. Je vous déconseille cependant de désactiver ce système pour des raisons de sécurité.

Etiquettes:

Ajouter un commentaire