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

9

Eu quero ser capaz de definir a conta do IIS para novos sites para ter 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 o executo, recebo erros como este:

Set-Acl : The trust relationship between this workstation and the primary domain failed.

Acho que isso é porque IIS APPPOOL não é um domínio real, mas é um prefixo estranho em uma conta do tipo falsa. Existe uma maneira correta de se referir a essa conta para que eu possa fazer isso funcionar?

    
por bdukes 19.08.2011 / 18:32

5 respostas

9

Primeiro de tudo, use o Set-Acl como este, já que o caminho do diretório é o primeiro argumento posicional:

Set-Acl $directory $acl

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

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

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

  1. Crie um novo objeto SID com o SID AppPoolIdentities e traduza-o em uma NTAccount, assim: link , e você deve ser capaz de tratá-lo como qualquer outro objeto NTAccount. Se você ainda deseja passar nomes de domínio / usuários para contas reais, embutido em alguma lógica simples que usa como padrão o AppPool SID se o nome de usuário for "AweSomeAppPool" e o domínio estiver vazio, apenas como um exemplo.

  2. Use o PowerShell para invocar o icacls.exe e usá-lo para conceder / revogar quaisquer permissões desejadas, como esta (primeiro prompt de comando normal do formulário icacls e, em seguida, 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ê escolher a segunda opção, não deixe de testá-los manualmente primeiro, eu mesmo não tive a chance de testar esses exemplos específicos, mas deve funcionar

    
por 25.12.2011 / 16:29
4

Algo como isso deve fazer o truque para você. Deve ser capaz de resolver o IIS APPPOOl \ Anything bem ...

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
}
    
por 19.09.2012 / 02:32
4

O seguinte funciona no Windows 2012 para obter um SID para o site do IIS. Ele requer o Provedor do 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])
    
por 05.08.2013 / 18:33
2

A partir do IIS 10 / Windows 10 / Server 2016, o módulo WebAdministration está obsoleto e é esperado que usemos o novo módulo Powershell IISAdministration. Veja como obter o SID do pool de aplicativos traduzido 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])
    
por 13.12.2017 / 21:39
0

O seguinte funcionou para mim no Windows 2012, não consegui fazer os outros exemplos funcionarem:

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
    
por 07.09.2016 / 10:51