2010-10-31 13 views
5

Ho un componente aggiuntivo di Internet Explorer, scritto in C#, che comunica tramite una pipe denominata WCF a un'applicazione desktop .NET. L'app desktop crea ServiceHost per netNamedPipeBinding e ogni istanza del componente aggiuntivo di IE crea un ChannelFactory per comunicare con l'app. Tutto funziona correttamente in Windows XP, ma un'eccezione viene generata dalla modalità protetta di IE in Windows 7.Come ridurre l'integrità della pipa denominata WCF

System.ServiceModel.CommunicationException: Impossibile connettersi all'endpoint "net.pipe: //localhost/MyApp.MyID". ---> System.IO.PipeException: esiste un endpoint di pipe per "\. \ Pipe ... guid ...", ma la connessione non è riuscita: accesso negato. (5, 0x5)

L'esecuzione del componente aggiuntivo in modalità protetta è uno scenario che devo supportare. La mia comprensione è che se abbasso il livello di integrità del named pipe, allora il mio add-in di IE sarà autorizzato a parlarne. La mia domanda è come farlo. Ho le cose di installazione per utilizzare WCF, e preferirei preferirlo in questo modo. Posso fare in modo che WCF crei la named pipe con il livello di integrità inferiore? Che codice scrivo per farlo accadere?

risposta

7

Non credo che ciò sia possibile.

Il problema è che l'etichetta di integrità deve essere specificata nel descrittore di sicurezza fornito quando viene creata la named pipe. Nella NetNamedPipeBinding standard, quella chiamata a CreateNamedPipe avviene all'interno del metodo privato CreatePipe() della classe WCF interna System.ServiceModel.Channels.PipeConnectionListener. Non riesco a vedere un modo per cambiare il modo in cui specifica il descrittore di sicurezza iniziale per la pipe.

Vedere this question and answer per una descrizione di ciò che è necessario ottenere.

Scrivere un elemento di collegamento del trasporto di pipe personalizzato da zero sembra essere l'unico modo per aggirare questo problema, in mancanza del quale dovremo solo aspettare che Microsoft aggiunga alcune funzionalità di attivazione in una versione futura di WCF. Se hai accesso a Microsoft Connect, potresti add your voice to the others requesting this feature.

MODIFICA: Ero troppo pessimista. Ora ho trovato un modo per farlo.

La chiave era che non è necessario specificare l'etichetta di integrità nel descrittore di sicurezza quando viene creata la pipe, ma è necessario modificare il SACL utilizzando l'handle restituito da CreateNamedPipe quando il listener è aperto - ovvero il primo handle sul lato server della pipe. Utilizzando un altro handle, il tentativo di aggiungere l'etichetta di integrità non riesce sempre, poiché il parametro flag dwOpenMode su CreateNamedPipe sovraccarica l'utilizzo di uno dei bit per indicare sia FILE_FLAG_FIRST_PIPE_INSTANCE e WRITE_OWNER. Abbiamo bisogno del secondo permesso di accesso per aggiungere l'etichetta di integrità, ma la presenza del primo causa il fallimento della chiamata su tutte le istanze tranne la prima.

L'acquisizione del primo manubrio non è un'impresa banale. WCF lo scoiattola via in un'istanza del tipo System.ServiceModel.Channels.PipeConnectionListener.PendingAccept, memorizzata in un elenco gestito dal listener della connessione pipe. Il listener di connessioni non è la stessa cosa del listener del canale (che può essere afferrato direttamente sostituendo il metodo BuildChannelListener<> di un elemento di binding) ed è molto più difficile da ottenere. Implica gli eroismi con la riflessione, per individuare il TransportManager per l'endpoint, che contiene un riferimento al listener di connessioni dell'endpoint e quindi lavora su una catena di listener di connessioni (che varia in base alla configurazione della traccia ecc.) Finché non viene trovato il listener della connessione pipe . Se siamo fortunati, il primo handle di pipe può essere trovato nell'elenco di accettazione in sospeso dell'ascoltatore (anche se qui c'è una condizione di competizione - se un client si connette prima di ottenere l'handle, sarà perso per sempre).

volta che la maniglia è disponibile, abbassando l'integrità per consentire ai clienti bassa integrità di comunicare wth il servizio è solo una questione di chiamare SetSecurityInfo sull'impugnatura per aggiungere l'etichetta integrità.

Ho intenzione di coprire questo è alcuni dettagli su my blog presto.

Problemi correlati