WCF wsdualhttpbinding client sans élévation

J’ai créé un service Windows (serveur) et un WPF (client) qui utilise la fonctionnalité de rappel wsdualhttpbinding de WCF. Tout ce qui se trouve entre les deux logiciels fonctionne correctement, mais le problème que je rencontre est que le client doit exécuter des privilèges élevés pour pouvoir fonctionner (ce qui est compréhensible car il doit ouvrir des ports pour pouvoir communiquer avec le serveur).

Existe-t-il un moyen de configurer le client pour qu’il fonctionne sans élévation? Ou peut-être créer une connexion permanente unique afin que le client n’ait pas besoin d’être élevé à tout moment?

Je manque d’idées et de termes de recherche sur Google.

METTRE À JOUR

J’ai trouvé une solution. S’il vous plaît, corrigez-moi s’il y a une autre meilleure pratique que je pourrais suivre!

J’ai ajouté des boutons “Activer” et “Désactiver” à l’application cliente qui exécute netsh pour ouvrir (ou fermer) et réserver un port.

Activer

Process process = new Process(); process.StartInfo = new ProcessStartInfo("netsh", @"http add urlacl url=http://+:" + PortNumber + @"/ user=DOMAIN\username"); process.StartInfo.Verb = "runas"; process.Start(); process.WaitForExit(); 

Désactiver

 Process process = new Process(); process.StartInfo = new ProcessStartInfo("netsh", "http delete urlacl url=http://+:" + PortNumber + "/"); process.StartInfo.Verb = "runas"; process.Start(); process.WaitForExit(); 

J’ai trouvé une solution. S’il vous plaît, corrigez-moi s’il y a une autre meilleure pratique que je pourrais suivre!

J’ai ajouté des boutons “Activer” et “Désactiver” à l’application cliente qui exécute netsh pour ouvrir (ou fermer) et réserver un port.

Activer

 Process process = new Process(); process.StartInfo = new ProcessStartInfo("netsh", @"http add urlacl url=http://+:" + PortNumber + @"/ user=DOMAIN\username"); process.StartInfo.Verb = "runas"; process.Start(); process.WaitForExit(); 

Désactiver

 Process process = new Process(); process.StartInfo = new ProcessStartInfo("netsh", "http delete urlacl url=http://+:" + PortNumber + "/"); process.StartInfo.Verb = "runas"; process.Start(); process.WaitForExit(); 

Malheureusement, vous ne pouvez ouvrir un port sous Windows que si vous utilisez des privilèges d’administrateur.

http://msdn.microsoft.com/en-us/library/ms740548%28v=VS.85%29.aspx

Pour utiliser un socket de type SOCK_RAW, des privilèges d’administrateur sont nécessaires. Les utilisateurs exécutant des applications Winsock utilisant des sockets bruts doivent être membres du groupe Administrateurs sur l’ordinateur local. Dans le cas contraire, les appels de sockets bruts échoueront avec un code d’erreur WSAEACCES. Sous Windows Vista et les versions ultérieures, l’access aux sockets bruts est imposé lors de la création du socket. Dans les versions antérieures de Windows, l’access aux sockets bruts était appliqué lors d’autres opérations sur les sockets.

Les sockets bruts offrent la possibilité de manipuler le transport sous-jacent, de sorte qu’ils puissent être utilisés à des fins malveillantes constituant une menace pour la sécurité. Par conséquent, seuls les membres du groupe Administrateurs peuvent créer des sockets de type SOCK_RAW sous Windows 2000 et versions ultérieures.

edit: Si vous avez access à la machine en tant qu’administrateur, vous pouvez utiliser netsh http://technet.microsoft.com/en-us/library/cc725935(v=ws.10).aspx pour autoriser certains utilisateurs à ouvrir un port.

netsh http add urlacl url = http://+:80/Uri utilisateur = DOMAINE \ Utilisateur listen = yes