Como posso adicionar permissões de ACL para contas IIS APPPOOL \ * via Powershell?

11

Quero poder definir a conta do IIS para novos sites com permissões de modificação. Eu tenho o seguinte 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
}

No entanto, quando eu o executo, obtenho erros como este:

Set-Acl: a relação de confiança entre esta estação de trabalho e o domínio principal falhou.

Eu acho que isso ocorre porque IIS APPPOOLnão é um domínio real, mas é um prefixo estranho em uma conta meio falsa. Existe uma maneira correta de me referir a essa conta para que eu possa fazer isso funcionar?

bdukes
fonte

Respostas:

12

Primeiro, use Set-Acl assim, pois o caminho do diretório é o primeiro argumento posicional:

Set-Acl $directory $acl

Segundo, você deve criar o objeto de usuário com apenas um argumento:

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

ATUALIZAÇÃO: Parece que ele não aceita o "IIS APPPOOL \ AppPoolName" como um identificador de NTAccount. Agora, existem duas maneiras de realizar o que você está tentando fazer:

  1. Crie um novo objeto SID com o AppPoolIdentities SID e traduza-o em uma NTAccount, assim: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html e você poderá tratá-lo como qualquer outro objeto NTAccount. Se você ainda deseja passar nomes de domínio / usuário para contas reais, construa uma lógica simples que padroniza o AppPool SID se o nome de usuário for "AweSomeAppPool" e o domínio estiver vazio, apenas como exemplo.

  2. Use o PowerShell para invocar o icacls.exe e use-o para conceder / revogar as permissões que você deseja, assim (o primeiro icacls normal forma o prompt de comando e, em seguida, o PowerShell, observe a diferença):

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

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

Se você optar pela segunda opção, não deixe de testá-las manualmente primeiro, não tive a chance de testar esses exemplos específicos, mas deve funcionar

Mathias R. Jessen
fonte
Obrigado pela ajuda. Fazendo isso, recebo uma exceção chamando AddAccessRule: "Algumas ou todas as referências de identidade não puderam ser traduzidas". Alguma idéia do que possa ser?
bdukes
Tente me ajudar a entender o que você está tentando realizar aqui. O fato é que ApplicationPoolIdentities não são contas NT "reais", elas são mais como uma representação "conta virtual" do SERVIÇO DE REDE, na verdade. Você não deseja definir permissões em recursos do sistema local ou em rede? Dependendo da sua necessidade, um desafio diferente surge :-)
Mathias R. Jessen
Recursos do sistema local. Estou tentando simplificar a configuração / redefinição de permissões para sites de desenvolvimento local que eu configurei. Portanto, descompacte um pacote de site no sistema de arquivos, configure-o no IIS e execute este comando para conceder permissão de modificação do IIS. Ou, execute um problema de permissão no site, execute isso para garantir que algo que eu adicionei após a criação do site tenha permissão de modificação.
bdukes
Acabei de adicionar algumas opções úteis para você
Mathias R. Jessen
Consegui icaclstrabalhar muito bem para mim, obrigado pela ajuda! Acabei com o corpo da função (mesmos parâmetros acima) sendo cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(com /ta trabalhar recursivamente no diretório, /ccontinuar após quaisquer erros e /qsuprimir mensagens de sucesso para cada arquivo).
bdukes
4

Algo assim deve fazer o truque para você. Ele deve ser capaz de resolver o IIS APPPOOl \ Anything também ...

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
fonte
Recebo uma exceção chamando SetAccessRule: "Algumas ou todas as referências de identidade não puderam ser traduzidas".
bdukes
Quais foram as suas contribuições?
usar o seguinte código
Set-AclOnPath .\Website "IIS APPPOOL\website.dev", embora ao tentar novamente, recebo um erro diferente: "O relacionamento de confiança entre esta estação de trabalho e o domínio principal falhou".
Bdukes
4

O seguinte funciona no Windows 2012 para obter um SID para o site do IIS. Requer o provedor IIS que usa o módulo PowerShell WebAdministration, mas este artigo indica que funcionará no 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
fonte
Tentei usar essa abordagem (no Windows 8), mas recebi o erro: "Exceção ao chamar ' AddAccessRule' com '1' argumento (s): 'Algumas ou todas as referências de identidade não puderam ser traduzidas.'"
bdukes
Usando o link da resposta de @Mathias R. Jessen para traduzir o SID em um NTAccounttrabalho real .
bdukes
Atualizei o código na resposta para fazer a tradução. Além disso, para aqueles que tentam tirar proveito disso, ligue Import-Module WebAdministrationpara obter a unidade IIS do provedor IIS.
bdukes
3

No IIS 10 / Windows 10 / Server 2016, o módulo WebAdministration está obsoleto e espera-se que você use o novo módulo IISAdministration Powershell. Veja como obter o SID do pool de aplicativos convertido para o usuário virtual usando o novo 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
fonte
2

O seguinte funcionou para mim no Windows 2012, não conseguiu os outros exemplos funcionando:

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
fonte
Isso também funcionou para mim, exceto uma coisa. Isso removeu TODAS as outras permissões. Se não é o que você deseja, comente esta linha, $acl.SetAccessRuleProtection($True, $False)pois o último parâmetro aqui é PreserveInheritance. Obrigado por postar isso!
Kurtis