2010-12-07 14 views
5

Estoy intentando escribir una herramienta de línea de comandos que dará a IIS7.5 en Windows Server 2008 acceso de escritura a una carpeta en wwwroot, para que una aplicación web tenga acceso para escribir en una carpeta específica dentro de su directorio base . Anteriormente, usted haría esto asignando el grupo IIS_WPG en la carpeta que le da a ese grupo acceso de modificación.C# code para otorgar automáticamente acceso de escritura IIS a una carpeta en Windows Server 2008? Actualmente arroja la excepción

En Server 2008 estoy intentando hacer lo mismo con IIS_IUSRS, pero se está produciendo una excepción.

Aquí está el código:

private static void ManagePermissions(string directory, string account, FileSystemRights rights, AccessControlType controlType, bool addAccess) 
{ 
    DirectoryInfo directoryInfo = new DirectoryInfo(directory); 
    DirectorySecurity directorySecurity = directoryInfo.GetAccessControl(); 

    if (addAccess) 
     directorySecurity.AddAccessRule(
      new FileSystemAccessRule(account, rights, controlType)); 
    else 
     directorySecurity.RemoveAccessRule(
      new FileSystemAccessRule(account, rights, controlType)); 

    directoryInfo.SetAccessControl(directorySecurity); 
} 

La llamada a este método es el siguiente:

ManagePermissions(
        "c:\inetpub\wwwroot", 
        "MACHINENAME\IIS_IUSRS", 
        FileSystemRights.Modify, 
        AccessControlType.Allow, 
        true); 

Al ejecutar esa llamada a ManagePermissions se produce una excepción con el tipo y el mensaje siguiente:

System.Security.Principal.IdentityNotMappedException: 
    Some or all identity references could not be translated. 

He comprobado varias veces para asegurarme de que MACHINENAME \ IIS_IUSRS es un n coincidencia exacta con el usuario en el administrador de usuarios local en la máquina en la que se está ejecutando este código. Esta máquina no participa en un dominio de Windows.

Deseo saber si necesita alguna otra aclaración.

+1

Y esta aplicación de asignación de derechos se ejecuta bajo una cuenta de usuario que ya tiene acceso para proporcionar tales derechos? –

+0

Sí. Esta aplicación hace varias cosas como adminster IIS, crea nuevas carpetas y copia archivos en estas mismas rutas de directorio. –

Respuesta

4

IIS_IUSRS es un grupo integrado, por lo que no se debe hacer referencia a él con [machinename]\IIS_IUSRS, pero con BUILTIN\IIS_IUSRS. De la misma manera:

ManagePermissions( 
        "c:\inetpub\wwwroot", 
        "BUILTIN\IIS_IUSRS", 
        FileSystemRights.Modify, 
        AccessControlType.Allow, 
        true); 

Pasando a esa forma de referenciar al usuario corrigió mi código. Me da la cuenta de una manera ligeramente diferente que se hace referencia en el ejemplo:

IdentityReference user = new NTAccount(UserDomain + @"\" + UserName); 

y luego usarlo a través de un constructor diferente de modo que puedan afectar a la traducción, así, pero lo dudo:

var rule = new FileSystemAccessRule(user, ..., ..., ..., ...); 
+0

Lo probaré en los próximos días y veré cómo funciona. Había abandonado esa función de mi proyecto, ya que agregaba valor marginal y me tomaba tanto tiempo descubrirlo. –

3

Actualización: recientemente he visto un error al agregar control total al usuario IIS_IUSRS en ventanas que no están en inglés (Windows Server 2008 R2 x64 IIS7).

A pesar de que IIS_IUSRS no está traducido, 'BUILTIN' delante de él puede causar un error

tanto, ser conscientes de la utilización de "BUILTIN \ IIS_IUSRS", utilice sólo 'IIS_IUSRS' en lugar - de su trabajo tanto en Inglés y ventanas no inglesas

+0

Gracias. Esto funcionó para mí. – br4d

Cuestiones relacionadas