2008-10-24 16 views
8

Tengo una aplicación ASP.NET. Básicamente el proceso de entrega es éste:Nant: cambio de permiso de archivo

  • Nant construye la aplicación y crea un archivo zip en el ordenador del desarrollador con los archivos de la aplicación sin carpetas y archivos de SVN inútiles. Este archivo se entrega con un script de Nant.
  • Los archivos zip y nant se copian en la computadora del cliente
  • la secuencia de comandos Nant reemplaza los archivos actuales del sitio web con el archivo contenido en el archivo zip.

Mi problema es que con este proceso tengo un error de acceso no autorizado cuando intento abrir el sitio web. Parece que los archivos deben tener un conjunto de permisos para el usuario "IIS_WPG".

No tengo la capacidad de cambiar la configuración de IIS, así que tengo que cambiar manualmente los permisos de cada archivo. Y cada vez que reemplazo los archivos, los permisos se eliminan y necesito volver a configurarlos.

así que tengo dos preguntas:

  • ¿Puedo cambiar los archivos con permisos Nant? Cómo hacerlo ?
  • ¿Es posible evitar este problema? (los desarrolladores no tienen este usuario en sus computadoras)

Respuesta

4

Debe ejecutar el programa CACLS en Windows para otorgar permisos a archivos y carpetas. Desde Nant, puedes hacer esto con la tarea EXEC.

Pruebe un bloque de etiqueta como:

<exec program="cacls"> 
    <arg value="*" /> 
    <arg value="/G IIS_WPG:F" /> 
</exec> 
+0

Solo tenga en cuenta que su sugerencia es la solución correcta pero los parámetros son ... peligrosos :). Ver mi respuesta –

7

@ Jeff Fritz Ay ... Su sugerencia es la solución correcta, pero los parámetros son peligrosos ... :).

En las computadoras dev me registré como administrador e intenté su sugerencia con cmd.

  • Sustituye todos los permisos establecidos con el fin de establecer sólo los definidos en la orden (por lo que, después de la orden, accede a los archivos como resultado un "Acceso denegado" incluso con mi usuario admin)
  • Se aplica en el directorio C: \ WINDOWS \, mientras que llamé al comando desde la carpeta wwwroot.:)

Así que, después de algunas pruebas, el comando correcto es:

cacls [full folder path] /T /E /G IIS_WPG:F 
  • /T: se aplica en la carpeta y subcarpetas especificada
  • /E: ediciones la ACL en lugar de reemplazando it :)
+1

ACTUALIZACIÓN: CACLS ahora está en desuso y se debe usar ICACLS en su lugar. Este es el caso de Windows Server 2008 R2, al menos. – JulianM

3

Terminamos escribiendo nuestra propia tarea f o esto con algo de código bastante sencillo:

[TaskName("addusertodir")] 
public class AddUserToDirectorySecurity : Task 
{ 
    [TaskAttribute("dir", Required=true)] 
    public string DirPath { get; set; } 

    [TaskAttribute("user", Required=true)] 
    public string UserName { get; set; } 

    protected override void ExecuteTask() 
    { 
     FileSystemAccessRule theRule1 = new FileSystemAccessRule(UserName, FileSystemRights.ListDirectory, AccessControlType.Allow); 
     FileSystemAccessRule theRule2 = new FileSystemAccessRule(UserName, FileSystemRights.ReadAndExecute, AccessControlType.Allow); 
     FileSystemAccessRule theRule3 = new FileSystemAccessRule(UserName, FileSystemRights.Read, AccessControlType.Allow); 

     DirectorySecurity theDirSecurity = new DirectorySecurity(); 
     theDirSecurity.AddAccessRule(theRule1); 
     theDirSecurity.AddAccessRule(theRule2); 
     theDirSecurity.AddAccessRule(theRule3); 
     Directory.SetAccessControl(DirPath, theDirSecurity); 
    } 
} 

entonces se puede escribir un guión Nant que carga la tarea personalizada y ejecuta:

<loadtasks> 
    <fileset> 
     <include name="MyTask.dll"/> 
    </fileset> 
</loadtasks> 

<addusertodir dir="MyDir" user="IIS_WPG"/> 

Obviamente, esto podría ser modificado para sus ciertas reglas o que incluso podría parametrizar esto en la tarea si así lo desea. Preferimos esto sobre el uso de la tarea ejecutiva ya que nos tiene un poco más de control sobre los permisos que se estaban aplicando.

2

CACLS ahora está en desuso. Aquí hay una versión que usa ICACLS, el reemplazo.

Supongamos que tenemos el siguiente:

  • La carpeta raíz de nuestra instalación es "c: \ inetpub \ wwwroot", y se almacena en la variable NANT ${paths.myprogram.inetpub}
  • La carpeta que queremos modificar se llama "archivos", y se almacena en ${upload.foldername}
  • El usuario que desea conceder acceso a es "IIS_UPLOAD_USER", almacenado en ${iis.upload.user}
  • El nivel de permisos que desea conceder es "M", de "modificar" permisos , almacenado en ${iis.user.permissionlevel}

Con estos supuestos, nuestra tarea es la siguiente:

<exec program="icacls"> 
    <arg value="${path::combine(paths.myprogram.inetpub, upload.foldername)}" /> 
    <arg value="/grant" /> 
    <arg value="${iis.upload.user}:${iis.user.permissionlevel}" /> 
</exec> 

Espero que esto ayude!

Cuestiones relacionadas