Esta pregunta ha surgido en uno de los cursos de campusMVP que imparto y me ha parecido interesante comentarla aquí.
Resulta que un alumno tenía un ejecutable que, entre otras cosas, necesitaba escribir una serie de registros en un inofensivo archivo de texto. Al ejecutar la aplicación en local todo iba perfectamente, pero al hacerlo cuando el .exe estaba en una unidad de red compartida o en una carpeta remota el programa, lógicamente, le rompía con un error de falta de permisos.
El motivo de que no funcione el código en estas circunstancias es que, al ejecutarlo desde la Red, el ejecutable cae bajo el conjunto de permisos "LocalIntranet" que es mucho más recortado que el conjunto normal que se aplica a los ejecutables .NET y que se llama "FullTrust".
Lo primero que se debería hacer es declarar los permisos que el código necesita para que al menos el runtime pueda saber qué necesita esos permisos antes de "petar", nada más intentar ejecutarla. De este modo si se ejeucta sin los permisos suficientes advierte antes de ello y no se limita a romper cuando la aplicación vaya a escribir a disco. Eso se consigue con este atributo aplicado al ensamblado:
<Assembly:FileIOPermission(SecurityAction.RequestMinimun, Unrestricted:=True)>
De esta forma declaras que tu ensamblado necesita permisos de acceso a disco y el runtime ya lo sabe antes de que se vaya a producir el error.
Aparte de eso se puede usar la herramienta de configuración de seguridad para elevar los permisos de la carpeta compartida en la que estén esos ejecutables. Está en Inicio·Panel de control·Herramientas Administrativas·Microsoft .NET Framework Configuration. Se puede cambiar el conjunto de permisos a aplicar a cada elemento que se pueda ejecutar en el sistema desde la interfaz gráfica.
Dado que tendremos que hacerlo en cada equipo que lo vaya a ejecutar, si lo pudiésemos automatizar desde línea de comandos mejor. Para ello se puede usar desde la línea de comandos la herramienta equivalente caspol.exe y meterla en un .bat por ejemplo, así:
CasPol.exe -m -ag 1.2 -url file://MiUnidadDeRed/MiCarpeta/* FullTrust
De esta forma indicas que se añada un nuevo conjuto de permisos a nivel de máquina (-m), para la intranet local (grupo 1.2) que otorgue permisos totales a la carpeta de red indicada en la ruta. El asterisco final se puedes sustituir para coincidir con cualquier patrón de archivo o por el nombre de un ejecutable concreto para afinar más.
Se puede ver el resultado en la herramienta gráfica de la siguiente manera (el grupo se ha creado sin nombre asociado):
Pulsa para agrandar
Para ejecutar con éxito esta herramienta necesitas permisos de administrador, claro.