Question

Mon application utilise un petit serveur Web au serveur quelques fichiers et une interface Web pour l'administration à distance. En ce moment, l'utilisateur doit utiliser netsh pour enregistrer l'URI comme si

netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris

Ce qui est pas drôle pour l'utilisateur moyen. Je voudrais que le programme pour pouvoir écouter sur un port spécifié par l'utilisateur de mon programme sans l'utilisateur final besoin d'utiliser l'invite de commande. Y at-il de toute façon d'y arriver à court d'utiliser simplement Process.Start et commande en cours d'exécution me invite?

Était-ce utile?

La solution

J'ai écrit ce pour élever perms et ajouter des entrées http ACL à netsh .

Les utilisateurs se vous êtes invité à modifier leur système haut, mais il vaut mieux que rien. Vous pouvez le faire en réponse à une AddressAccessDeniedException

public static class NetAclChecker
{
    public static void AddAddress(string address)
    {
        AddAddress(address, Environment.UserDomainName, Environment.UserName);
    }

    public static void AddAddress(string address, string domain, string user)
    {
        string args = string.Format(@"http add urlacl url={0} user={1}\{2}", address, domain, user);

        ProcessStartInfo psi = new ProcessStartInfo("netsh", args);
        psi.Verb = "runas";
        psi.CreateNoWindow = true;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = true;

        Process.Start(psi).WaitForExit();
    }
}

Autres conseils

Si vous utilisez un HttpListener, vous devez utiliser httpconfig.exe ou netsh pour configurer votre HttpListener, parce que:

A. AFAIK Il n'y a pas API pour le faire à partir de C #, seuls les outils de ligne de commande

B. Par défaut, seul système ou le groupe Administrateurs local peuvent écouter http préfixes

Alors ... si votre application est en cours d'exécution sous le compte de l'utilisateur, vous devez accorder explicitement l'accès (à l'aide httpcfg.exe ou netsh) parce que votre HTTPHandler utilise les HTTP.sys pour partager des ports avec le serveur Web en cours d'exécution (afin que vous puissiez héberger votre propre application web sur le port 80 alors que IIS est en cours d'exécution sur le port 80 également).

Une meilleure solution pourrait être d'utiliser un serveur Web intégré réel pour écouter sur le port dont vous avez besoin. Cela ne fonctionnera pas si une autre application (par exemple IIS) utilise déjà le port, mais étant donné que cela ne PAS utiliser le HTTP.sys pour le port de partage, il n'y a aucune restriction de sécurité sur ce compte utilisateur ouvre / écoute sur le port . Parce que vous voulez que l'utilisateur de spécifier leur propre port, il semble acceptable de courir sur un autre port en plus le port 80.

Mon entreprise fabrique un produit commercial appelé le serveur Web Neokernel ( http://www.neokernel.com ) qui exécute ASP.NET et vous permet de démarrer / arrêter le programme serveur et définir des configurations; vous pouvez intégrer et distribuer cette assemblée avec l'application.

Il y a aussi le code source Cassini que vous pouvez modifier et intégrer, il est gratuit, mais a quelques inconvénients comme aucun support d'enregistrement ou SSL.

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