Opérations SPTI / SCSI à partir d’une application Windows 7

J’ai besoin d’aide concernant un problème de sécurité lors de la mise à jour de certains logiciels Windows pour communiquer avec un périphérique SCSI sans stockage.

Le logiciel d’origine a été écrit pour Windows XP en tant que DLL et a été discuté avec l’appareil via l’API ASPI d’Adaptec. ASPI n’avait pas vraiment de sécurité, donc toute application exécutée par un utilisateur pouvait utiliser ma DLL pour communiquer avec l’un de ces périphériques, et tout fonctionnait très bien.

Je suis en train de mettre à jour le logiciel pour qu’il fonctionne avec Windows 7 en utilisant l’API moderne SPTI (SCSI Pass-Through Interface) de Microsoft. Les choses fonctionnent bien avec SPTI sous XP, mais la sécurité de Windows 7 est beaucoup plus ssortingcte, et pour les utilisateurs normaux ou même les administrateurs, les appels SPTI renvoient une erreur indiquant des permissions insuffisantes. Si je me connecte à l’aide du compte “Administrateur” masqué, mon logiciel fonctionne correctement avec SPTI, mais ce n’est pas une option de déploiement acceptable.

Voici quelques alternatives que j’ai examinées jusqu’à présent, par ordre décroissant de réécriture du code existant:

  • Faire tourner un thread et augmenter ses privilèges pour faire semblant d’être “Administrateur” afin qu’il puisse parler avec SPTI. [Je n’ai pas pu faire fonctionner ceci avec LogonUser () / ImpersonateLoggedOnUser () / LoadUserProfile (); l’appel à LoadUserProfile () échoue et les appels SPTI échouent également avec une erreur d’permissions insuffisante.]
  • Écrire un service Windows disposant des permissions adéquates pour parler avec SPTI, puis demander à mon DLL de communiquer avec ce service.
  • Pilote de l’espace utilisateur (UMDF). Ce serait une réécriture coûteuse et je ne sais pas si UMDF supporte l’access aux périphériques SCSI.
  • Pilote du kernel (KMDF). Devrait fonctionner, mais serait une réécriture plus longue et plus coûteuse.

J’espère que la communauté ici pourra vous aider avec un peu de sagesse / expérience / idées qui permettront à mon code de parler à ce périphérique SCSI sous Windows 7, idéalement sans avoir à réécrire trop.

J’adresse ceci comme une réponse parce que c’est un peu long pour être un commentaire.

Je suppose que vous avez essayé de définir le manifeste de l’application pour qu’il nécessite une élévation lorsqu’il s’exécute? Il est important de noter que vous devez élever un processus, AFAIK vous ne pouvez pas élever un thread.

Votre suggestion de l’exécuter en tant que service, puis de communiquer avec celui-ci (un canal nommé ou WCF sont des options viables) est une bonne solution. Si vous l’exécutez en tant que système local, votre service sera plus privilégié qu’un administrateur local.