Posso ascoltare su una porta (usando HttpListener o altro codice .NET) su Vista senza richiedere i privilegi di amministratore? [duplicare]

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

  •  05-07-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

    
            
  •              Accesso a HttpListener negato                                      10 risposte                          
  •     
    

Sto usando HttpListener per consentire a un utente di impostare un proxy su una porta definita dall'utente. Quando avvio HttpListener, ottengo un'eccezione se l'applicazione non è in esecuzione con i privilegi di amministratore in Vista.

Da quanto ho letto, questo è un comportamento previsto - sono richiesti i privilegi di amministratore per iniziare l'ascolto su una porta. Ma sono sicuro che ci sono modi per aggirare questo problema, poiché eseguo molti programmi (come Skype) che ascoltano su una porta senza richiedere elevazione all'amministratore.

C'è un modo per farlo con HttpListener? In caso contrario, posso effettuare altre chiamate API nel codice .NET per configurare la porta?

È stato utile?

Soluzione

Non ho mai usato un HttpListener, ma dalla tua descrizione sembra più che tu voglia ascoltare su una normale porta TCP, invece di incorporare la tua applicazione in uno spazio dei nomi URL del server (che è quello che sembra fare HttpListener). Dovresti essere in grado di utilizzare le normali funzioni socket (System.Net.Sockets.TcpListener) per aprire e ascoltare su una porta TCP senza richiedere i privilegi di amministratore. Sono quasi certo che Skype non utilizza un HttpListener.

Altri suggerimenti

Sebbene sia possibile scrivere il proprio server HTTP utilizzando il normale TCP / IP (è relativamente semplice), è più semplice utilizzare HttpListener, che sfrutta la funzionalità HTTP.SYS aggiunta in Windows XP SP2.

Tuttavia, HTTP.SYS aggiunge il concetto di URL ACL. Ciò è in parte dovuto al fatto che HTTP.SYS consente di associarsi a spazi dei nomi secondari sulla porta 80. L'uso diretto di TCP / IP evita direttamente questo requisito, ma significa che non è possibile associare una porta già in uso.

Su Windows XP, è possibile utilizzare il programma HttpCfg.exe per impostare un URL ACL che concede al proprio account utente il diritto di associare un determinato URL. È negli esempi Platform SDK.

Su Windows Vista, HTTPCFG è ancora supportato, ma la funzionalità è stata assorbita in NETSH:

netsh http show urlacl

... mostrerà un elenco di ACL URL esistenti. Gli ACL sono espressi in SDDL.

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

... configurerà lo spazio dei nomi MyURI in modo che DOMAIN \ User possa ascoltare le richieste.

Se devi gestire le richieste solo dal tuo computer (di solito a scopo di test), puoi scrivere localhost anziché * nel prefisso.

Ad esempio, anziché " http: // *: 9669 / " puoi scrivere " http: // localhost: 9669 / " ;. Funziona bene con HttpListener e non richiede privilegi di amministratore (almeno su Windows 7).

Beh, ho dovuto fare i conti con qualcosa di simile. Il mio computer è in un dominio limitato, quindi non ho i privilegi di amministratore. Dopo alcune ricerche e letture ho trovato questa discussione e i suggerimenti di netsh mi hanno fatto usare i collegamenti acl temporanei solo per sviluppare test. Sul mio computer esiste questa regola.

C'è questa voce:

Esegui 'netsh http show urlacl' (come mostrato sopra)

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

Quindi posso usare HttpListener come non amministratore (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"
    [...]

Possa questo aiutare chiunque a trovare questa discussione.

In XP, è stato necessario utilizzare una riga di comando (httpcfg) per aprire prima la porta, altrimenti non funzionerebbe per i non amministratori.

Vedi qui - la pagina spiega il problema, e c'è un zip in basso per renderlo utilizzabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top