Puis-je écouter sur un port (avec HttpListener ou un autre code .NET) sur Vista sans exiger de privilèges d'administrateur? [dupliquer]

StackOverflow https://stackoverflow.com/questions/169904

  •  05-07-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

    
            
  •              Accès HttpListener refusé                                      10 réponses                          
  •     
    

J'utilise HttpListener pour permettre à un utilisateur de configurer un proxy sur un port défini par l'utilisateur. Lorsque je lance HttpListener, je reçois une exception si l'application ne s'exécute pas sous les privilèges d'administrateur de Vista.

D'après ce que j'ai lu, il s'agit du comportement attendu - des privilèges d'administrateur sont requis pour commencer à écouter sur un port. Mais je suis sûr qu’il ya des solutions à ce problème, car j’exécute beaucoup de programmes (comme Skype) qui écoutent sur un port sans passer par un administrateur.

Existe-t-il un moyen de faire cela avec HttpListener? Sinon, puis-je effectuer d'autres appels d'API dans le code .NET pour configurer le port?

Était-ce utile?

La solution

Je n'ai jamais utilisé de HttpListener, mais d'après votre description, cela ressemble davantage à une écoute sur un port TCP normal, au lieu d'incorporer votre application dans un espace de noms d'URL de serveur (ce que HttpListener semble faire). Vous devriez pouvoir utiliser les fonctions de socket habituelles (System.Net.Sockets.TcpListener) pour ouvrir et écouter sur un port TCP sans nécessiter de privilèges d'administrateur. Je suis presque certain que Skype n'utilise pas de HttpListener.

Autres conseils

Bien que vous puissiez écrire votre propre serveur HTTP à l'aide de TCP / IP normal (c'est relativement simple), il est plus facile d'utiliser HttpListener, qui tire parti de la fonctionnalité HTTP.SYS ajoutée à Windows XP SP2.

Cependant, HTTP.SYS ajoute le concept de listes de contrôle d'accès aux URL. Ceci est en partie dû au fait que HTTP.SYS vous permet de vous connecter à des sous-espaces de noms sur le port 80. L’utilisation directe de TCP / IP évite cette exigence, mais signifie que vous ne pouvez pas vous connecter à un port déjà utilisé.

Sous Windows XP, vous pouvez utiliser le programme HttpCfg.exe pour configurer une liste de contrôle d'accès à l'URL accordant à votre compte d'utilisateur le droit de se lier à une URL particulière. C’est dans les exemples du Kit de développement Platform SDK.

Sur Windows Vista, HTTPCFG est toujours pris en charge, mais la fonctionnalité a été absorbée dans NETSH:

netsh http show urlacl

... affichera une liste des ACL d'URL existantes. Les ACL sont exprimées en SDDL.

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes

... va configurer l'espace de noms MyURI pour que DOMAIN \ User puisse écouter les demandes.

Si vous devez gérer uniquement les demandes provenant de votre propre ordinateur (généralement à des fins de test), vous pouvez écrire hôte local au lieu de * dans le préfixe.

Par exemple, au lieu de "http: // *: 9669 /" vous pouvez écrire "http: // localhost: 9669 /". Cela fonctionne bien avec HttpListener et ne nécessite pas de privilèges d’administration (au moins sur Windows 7).

Eh bien, j'ai dû faire face à quelque chose de similaire. Mon ordinateur est dans un domaine restreint, je n'ai donc pas de privilèges d'administrateur. Après quelques recherches et lectures, j'ai trouvé ce fil et les astuces netsh m'ont fait utiliser des liaisons acl temporaires pour le développement de tests. Sur mon ordinateur, ces règles existent.

Il y a cette entrée:

Exécutez 'netsh http show urlacl' (comme indiqué ci-dessus)

    [...]
        Reservierte URL            : http://+:80/Temporary_Listen_Addresses/
            Benutzer: \Jeder
                Abhören: Yes
                Delegieren: No
                SDDL: D:(A;;GX;;;WD)
    [...]

Je peux donc utiliser HttpListener en tant que non-administrateur (Jeder):

    [...]
    HttpListener l = new HttpListener();
    string prefix = "http://+:80/Temporary_Listen_Addresses/";
    l.Prefixes.Add(prefix);
    l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert"
    [...]

Cela peut aider quiconque à trouver ce fil.

Sous XP, vous deviez d'abord utiliser une ligne de commande (httpcfg) pour ouvrir le port, sinon cela ne fonctionnerait pas pour les non-administrateurs.

Voir ici - la page explique le problème, et il y a un zip pour le rendre utilisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top