Domanda

Ho un servizio C ++ che fornisce una pipa denominata ai clienti con un NULL SECURITY_ATTRIBUTES come segue:

hPipe = CreateNamedPipe( lpszPipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, 0, NULL);

Esiste una dll che utilizza questa pipe per ottenere servizi.

Esiste una GUI c # che usa la dll e funziona bene.

Esiste un sito Web .net che utilizza anche questa dll (esattamente la stessa sullo stesso PC) ma viene sempre negata l'autorizzazione quando tenta di aprire la pipe.

Qualcuno sa perché questo potrebbe accadere e come risolverlo?

Qualcuno sa anche di un buon tutorial su SECURITY_ATTRIBUTES perché non ho ancora capito le informazioni msdn.

Grazie, Patrick

È stato utile?

Soluzione

L'ACL predefinito per le named pipe (ciò che si ottiene con un descrittore di sicurezza nullo) garantisce l'accesso in scrittura solo a LocalSystem, amministratori e proprietario / creatore della pipe. A meno che l'applicazione Web non sia in esecuzione con uno di quegli account (che per impostazione predefinita non sarebbe) non sarà possibile ottenere l'accesso in scrittura. (Presumo che tu stia chiedendo lettura / scrittura.)

Ci sono un paio di opzioni ...

  1. Avvia l'applicazione Web con lo stesso account del servizio che ha creato la pipe.

  2. Configura l'applicazione Web per utilizzare la rappresentazione, specificando un utente specifico con accesso in scrittura in web.config o impostandolo per utilizzare l'utente passato da IIS (e accedendo all'applicazione da un account utente con accesso in scrittura).

  3. Rappresenta manualmente un utente con accesso in scrittura per la durata dell'accesso alla pipe (ad es. con WindowsIdentity.Impersonate).

  4. Utilizza un descrittore di sicurezza non predefinito sulla pipe che garantisce l'accesso in scrittura a Everyone (o all'account specifico che esegue l'applicazione, sebbene sarebbe più complicato da configurare).

C'è un esempio di creazione di un semplice descrittore di sicurezza qui ; dovresti essere in grado di modificarlo in base alle tue esigenze.

Altri suggerimenti

Controlla il tipo di autenticazione in uso sul sito Web ASP.NET e le impostazioni di rappresentazione nel file web.config per quel sito. È probabile che il codice ASP.NET sia in esecuzione con un account a cui non è consentito creare pipe con nome sul tuo computer.

Potresti essere in grado di risolverlo concedendo più autorizzazioni all'account in uso dall'app ASP.NET o configurando tale app Web per utilizzare un account diverso (con più privilegi). Detto questo, vuoi davvero che i visitatori remoti del tuo sito web siano in grado di creare pipe con nome? Non ti parlerò, presumo che tu ci abbia pensato.

La descrizione più accessibile e completa di SECURITY_ATTRIBUTES che abbia mai visto è in questo libro di Keith Brown ... http://www.amazon.co.uk/gp/product/0201604426 .

Aggiunta della riga:

lt &; identità impersonata = " true " / >

a < & System.web gt; la sezione del file web.config consentiva l'accesso alla pipe. Non consiglierei ad altri di usarlo perché non sono sicuro delle implicazioni sulla sicurezza, ma per ora soddisfa i nostri requisiti.

Grazie sia a Eric che a Martin per avermi dato indicazioni nella giusta direzione.

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