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?

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


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
}

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])

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])

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.