2014-09-24 18 views
6

Sto sviluppando un assembly .NET open source (WinSCP .NET assembly) che genera un'applicazione nativa (C++) e comunica con esso tramite eventi e oggetti di mapping di file.OpenEvent/OpenFileMapping non riesce con ERROR_ACCESS_DENIED

L'assieme genera l'applicazione utilizzando la classe Process, senza impostazioni speciali. L'assembly crea pochi eventi (utilizzando il EventWaitHandle) e il mapping dei file (utilizzando il PInvoked CreateFileMapping) e l'applicazione "apre" questi utilizzando lo OpenEvent e lo OpenFileMapping.

Funziona bene nella maggior parte dei casi. Ma ora sto avendo un utente che usa l'assembly da un'applicazione ASPX su Windows Server 2008 R2 a 64 bit.

Nel suo caso sia la OpenEvent e OpenFileMapping ritorno NULL e la GetLastError restituisce il ERROR_ACCESS_DENIED.

ho cercato di migliorare il codice assembly concedendo esplicitamente le autorizzazioni necessarie dell'utente corrente per gli oggetti evento e il codice dell'applicazione per richiedere solo i diritti di accesso realmente necessari (invece di originale EVENT_ALL_ACCESS) come da example on MSDN. Non ha aiutato. Quindi non mi sono nemmeno preoccupato di provare lo stesso per l'oggetto di mappatura dei file.

Il codice C# che crea l'evento è:

EventWaitHandleSecurity security = new EventWaitHandleSecurity(); 

string user = Environment.UserDomainName + "\\" + Environment.UserName; 

EventWaitHandleAccessRule rule; 
rule = 
    new EventWaitHandleAccessRule(
     user, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify, 
     AccessControlType.Allow); 
security.AddAccessRule(rule); 
rule = 
    new EventWaitHandleAccessRule(
     user, EventWaitHandleRights.ChangePermissions, AccessControlType.Deny); 
security.AddAccessRule(rule); 

new EventWaitHandle(
    false, EventResetMode.AutoReset, name, out createdNew, security); 

Il codice C++ che "apre" gli eventi è:

OpenEvent(EVENT_MODIFY_STATE, false, name); 

(Per gli altri eventi il ​​livello di accesso è SYNCHRONIZE, a seconda esigenze).

Qualcuno ha idea di ciò che provoca il "accesso negato" errore nel OpenEvent (o CreateFileMapping)?

+0

Il nome dell'oggetto è in "Global \\"? –

+0

@HarryJohnston No. Ma per coincidenza ho inviato una nuova build all'utente con prefisso 'Global' nello spazio dei nomi di recente e sto aspettando dei risultati. Anche se non mi aspetto molto da quello. Se fosse stato un problema con lo spazio dei nomi degli oggetti, avrei ricevuto "ERROR_FILE_NOT_FOUND" (o simile), non "ERROR_ACCESS_DENIED", giusto? –

+0

Dubbi che una correzione che, le app ASP.NET vengono eseguite di default con un account utente limitato. Alcuni [background qui] (http://www.iis.net/learn/manage/configuring-security/application-pool-identities). –

risposta

1

La mia ipotesi è che l'evento venga creato dall'utente anonimo o dall'utente connesso, a seconda di come è configurato il sito Web. Ma il processo secondario viene avviato con l'utente del processo di base. Questo può essere verificato usando il monitor di processo e guardando l'acl per l'handle dell'evento per vedere chi è il creatore. Quindi guarda il processo secondario per vedere chi è in esecuzione come.
Se questo è il caso, è possibile aggiornare l'acl sull'evento per includere il processo di base. Oltre a questo, potrebbe essere comunque necessario il prefisso "globale" per assicurarsi che l'evento possa essere utilizzato oltre i limiti degli utenti.

+0

Grazie. Ci proveremo. –

Problemi correlati