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
)?
Il nome dell'oggetto è in "Global \\"? –
@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? –
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). –