¿Cómo puedo agregar permisos ACL para cuentas IIS APPPOOL \ * a través de Powershell?

11

Quiero poder configurar la cuenta de IIS para que los nuevos sitios web tengan permisos de modificación. Tengo el siguiente script:

function Set-ModifyPermission ($directory, $username, $domain = 'IIS APPPOOL') {
    $inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
    $propagation = [system.security.accesscontrol.PropagationFlags]"None"
    $acl = Get-Acl $directory
    $user = New-Object System.Security.Principal.NTAccount($domain, $username )
    $accessrule = New-Object system.security.AccessControl.FileSystemAccessRule($user, "Modify", $inherit, $propagation, "Allow")
    $acl.AddAccessRule($accessrule)
    set-acl -aclobject $acl $directory
}

Sin embargo, cuando lo ejecuto, obtengo errores como este:

Set-Acl: la relación de confianza entre esta estación de trabajo y el dominio primario falló.

Creo que esto se debe a IIS APPPOOLque no es un dominio real, sino que es un prefijo extraño en una cuenta falsa. ¿Hay una manera correcta de referirme a esa cuenta para que pueda hacer que esto funcione?

bdukes
fuente

Respuestas:

12

En primer lugar, use Set-Acl de esta manera, ya que la ruta del directorio es el primer argumento posicional:

Set-Acl $directory $acl

En segundo lugar, debe crear el objeto de usuario con un solo argumento:

$user = New-Object System.Security.Principal.NTAccount("$domain\\$username")

ACTUALIZACIÓN: Parece que no aceptará "IIS APPPOOL \ AppPoolName" como un identificador de NTAccount. Ahora, hay dos formas de lograr lo que está tratando de hacer:

  1. Cree un nuevo objeto SID con el SID AppPoolIdentities y traduzca a una cuenta NTA, así: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html , y debería poder para tratarlo como cualquier otro objeto NTAccount. Si aún desea poder pasar nombres de dominio / usuario para cuentas reales, cree una lógica simple que por defecto es el SID de AppPool si el nombre de usuario es "AweSomeAppPool" y el dominio está vacío, solo como ejemplo.

  2. Use PowerShell para invocar icacls.exe, y úselo para otorgar / revocar los permisos que desee, de esta manera (primero el símbolo del sistema normal de icacls, luego PowerShell, observe la diferencia):

    icacls.exe test.txt /grant "IIS AppPool\DefaultAppPool":(OI)(CI)M

    cmd /c icacls test.txt /grant "IIS AppPool\DefaultAppPool:(OI)(CI)M"

Si opta por la segunda opción, asegúrese de probarlos manualmente primero, no he tenido la oportunidad de probar estos ejemplos específicos yo mismo, pero debería funcionar

Mathias R. Jessen
fuente
Gracias por la ayuda. Al hacerlo, recibo una excepción que dice AddAccessRule: "Algunas o todas las referencias de identidad no se pudieron traducir". ¿Alguna idea de lo que podría ser?
bdukes
Intenta ayudarme a entender lo que estás tratando de lograr aquí. La cuestión es que las ApplicationPoolIdentities no son cuentas NT "reales", en realidad son más como una representación de "cuenta virtual" del SERVICIO DE RED. ¿Desea establecer permisos en los recursos del sistema local o los recursos en red? Dependiendo de su necesidad, surge un desafío diferente :-)
Mathias R. Jessen
Recursos del sistema local. Estoy tratando de simplificar la configuración / restablecimiento de permisos para sitios web de desarrollo local que configuré. Por lo tanto, descomprimiría un paquete de sitio web en el sistema de archivos, lo configuraría en IIS y luego ejecutaría este comando para dar permiso de modificación de IIS. O bien, encuentre un problema de permisos en el sitio, ejecute esto para asegurarse de que algo que agregué después de que se creó el sitio tenga permiso de modificación.
bdukes
Acabo de agregar algunas opciones útiles para usted
Mathias R. Jessen
Pude icaclstrabajar muy bien para mí, ¡gracias por la ayuda! Terminé con el cuerpo de la función (los mismos parámetros que arriba) siendo cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(con el /ttrabajo recursivo en el directorio, /cpara continuar después de cualquier error y /qpara suprimir los mensajes de éxito para cada archivo).
bdukes
4

Algo como esto debería hacerte el truco. También debería ser capaz de resolver IIS APPPOOl \ Anything ...

function Set-AclOnPath
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string] $Path,

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string] $DomainAccount
    )

    #Put whatever permission you want here
    $permission = $DomainAccount,"ReadAndExecute","Allow"
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission

    $acl = Get-Acl $Path
    $acl.SetAccessRule($accessRule)
    $acl | Set-Acl $Path
}
Haytham AbuelFutuh
fuente
Recibo una excepción que dice SetAccessRule: "Algunas o todas las referencias de identidad no se pudieron traducir".
bdukes
¿Cuáles fueron sus aportes?
Haytham AbuelFutuh
Set-AclOnPath .\Website "IIS APPPOOL\website.dev", aunque cuando lo intento de nuevo, aparece un error diferente: "La relación de confianza entre esta estación de trabajo y el dominio principal falló".
bdukes
4

Lo siguiente funciona en Windows 2012 para obtener un SID para el sitio IIS. Requiere el proveedor IIS que utiliza el módulo PowerShell de WebAdministration, pero este artículo indica que funcionará en Windows 2008R2.

$appPoolName = 'MyAppPool'
$appPoolSid = (Get-ItemProperty IIS:\AppPools\$appPool).applicationPoolSid
$identifier = New-Object System.Security.Principal.SecurityIdentifier $appPoolSid
$user = $identifier.Translate([System.Security.Principal.NTAccount])
Justin Dearing
fuente
Traté de usar este enfoque (en Windows 8), pero obtuve este error: "Excepción llamando ' AddAccessRule' con '1' argumento (s): 'Algunas o todas las referencias de identidad no se pudieron traducir'".
bdukes
Usando el enlace de la respuesta de @Mathias R. Jessen para traducir el SID en un NTAccounttrabajo real .
bdukes
He actualizado el código en la respuesta para hacer la traducción. Además, para aquellos que intentan aprovechar esto, llame Import-Module WebAdministrationpara obtener la unidad IIS del proveedor de IIS.
bdukes
3

A partir de IIS 10 / Windows 10 / Server 2016, el módulo de WebAdministration está en desuso y se espera que usemos el nuevo módulo IISAdministration Powershell. A continuación, se explica cómo traducir el SID del grupo de aplicaciones al usuario virtual mediante el nuevo módulo:

Import-Module IISAdministration
$manager = Get-IISServerManager
$appPoolName = 'MyAppPool'
$appPoolSid = $manager.ApplicationPools["$appPoolName"].RawAttributes['applicationPoolSid']
$identifier = New-Object System.Security.Principal.SecurityIdentifier $appPoolSid
$user = $identifier.Translate([System.Security.Principal.NTAccount])
Chris Doherty
fuente
2

Lo siguiente funcionó para mí en Windows 2012, no pude hacer funcionar los otros ejemplos:

Import-Module WebAdministration

$appPoolName='MyAppPool'
$folderDirectory='C:\MyWebFolder'

$appPoolSid = (Get-ItemProperty IIS:\AppPools\$appPoolName).applicationPoolSid

Write-Output "App Pool User $appPoolSid"

$identifier = New-Object System.Security.Principal.SecurityIdentifier $appPoolSid
$user = $identifier.Translate([System.Security.Principal.NTAccount])

Write-Output "Translated User $user.Value"

$acl = Get-Acl $folderDirectory
$acl.SetAccessRuleProtection($True, $False)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($user,”FullControl”, ContainerInherit, ObjectInherit”, None”, Allow”)
$acl.AddAccessRule($rule)
$acl | set-acl -path $folderDirectory
Cristo
fuente
Esto también funcionó para mí, excepto una cosa. Esto eliminó TODOS los demás permisos. Si esto no es lo que desea, comente esta línea $acl.SetAccessRuleProtection($True, $False)ya que el último parámetro aquí es PreserveInheritance. ¡Gracias por publicar esto!
Kurtis