c# - resueltos - grupos anillos y cuerpos
Permitir la conexión al servidor COM de.NET con un nivel de integridad que no coincide (2)
De acuerdo con el análisis del modelo de seguridad de Windows Vista , necesitará usar objetos compartidos, como un conducto con nombre, para ir entre los diferentes IL. Además, el objeto compartido debe tener una IL equivalente a la IL más baja que se utiliza.
Tengo un problema con una configuración de cliente-servidor basada en COM. El servidor COM está escrito en C # (.NET 4.0) y se ejecuta como un servidor local (registrado).
Dependiendo de qué aplicación se conecte al servidor, otros clientes recibirán una ejecución del servidor fallida (Excepción de HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)
El problema subyacente se explica aquí (en la sección COM es consciente de la integridad) . Tal como lo entiendo, está causado por el hecho de que una aplicación elevada crea el servidor con un nivel de integridad más alto. Cuando otra aplicación no elevada se conecta, no está permitido conectarse a la misma instancia. Lo mismo ocurre cuando una aplicación no elevada crea el proceso, luego se conecta una aplicación elevada.
Intenté implementar la solución que se describe en la página : modificar el registro para configurar un descriptor de seguridad que permita que todos los clientes se conecten. Hay un ejemplo de código en C ++, pero esto efectivamente hace lo mismo en .NET:
// Security Descriptor with NO_EXECUTE_UP
var sd = new RawSecurityDescriptor("O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)");
byte[] securityDescriptor = new Byte[sd.BinaryLength];
sd.GetBinaryForm(securityDescriptor, 0);
RegistryKey key = Registry.ClassesRoot.OpenSubKey("AppID//{APP-ID-GUID}", true);
if (key == null)
{
key = Registry.ClassesRoot.CreateSubKey("AppID//{APP-ID-GUID}");
}
using (key)
{
key.SetValue("LaunchPermission", securityDescriptor, RegistryValueKind.Binary);
}
Sin embargo, esto no tiene el efecto deseado. Cuando el segundo cliente intenta crear una instancia del objeto en cuestión, Windows intenta iniciar una instancia separada de mi servidor COM, pero el servidor evita que dos instancias se ejecuten como el mismo usuario. Teniendo en cuenta los permisos que he establecido, no esperaría que se lanzara una segunda instancia en primer lugar.
Dado que una de las aplicaciones cliente se ejecuta en Medium IL y la otra en High IL, también experimenté con variantes en la etiqueta obligatoria , como:
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;ME)
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)(ML;;NX;;;ME)(ML;;NX;;;HI)
También intenté configurar la clave de registro ROTFlags
en 0x1 (ROTFLAGS_ALLOWANYCLIENT) como se sugiere en la página, sin cambio de comportamiento.
Establecí que el valor de registro LaunchPermission se usa de alguna manera. No puedo descubrir dónde se lee con Process Monitor, pero cuando uso la herramienta dcomcnfg.exe
para establecer la misma clave, puedo forzar al servidor a fallar al cargar los permisos de inicio.
Me gustaría señalar que mi proceso de servidor no necesita elevación. ¿Cómo puedo hacer que procesos tanto elevados como no elevados sean capaces de conectarse a una única instancia de servidor?
tiene que establecer la opción de depuración en Cualquier CPU en VS.