Назад | Перейти на главную страницу

Как я могу добавить разрешения ACL для учетных записей IIS APPPOOL \ * через Powershell?

Я хочу иметь возможность настроить учетную запись IIS для новых веб-сайтов, чтобы иметь права на изменение. У меня есть такой сценарий:

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
}

Однако когда я запускаю его, я получаю такие ошибки:

Set-Acl: доверительные отношения между этой рабочей станцией и основным доменом не удалось.

Я думаю это потому что IIS APPPOOL не настоящий домен, а странный префикс в поддельной учетной записи. Есть ли правильный способ обратиться к этой учетной записи, чтобы я мог выполнить эту работу?

Прежде всего, используйте Set-Acl следующим образом, так как путь к каталогу является первым позиционным аргументом:

Set-Acl $directory $acl

Во-вторых, вы должны создать объект пользователя только с одним аргументом:

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

ОБНОВИТЬ: Похоже, он не примет «IIS APPPOOL \ AppPoolName» в качестве идентификатора NTAccount. Теперь есть два способа выполнить то, что вы пытаетесь сделать:

  1. Создайте новый объект SID с идентификатором AppPoolIdentities и преобразуйте его в NTAccount, например: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html, и вы сможете обращаться с ним как с любым другим объектом NTAccount. Если вы все еще хотите иметь возможность передавать домены / имена пользователей для реальных учетных записей, используйте некоторую простую логику, которая по умолчанию использует SID AppPool, если имя пользователя - «AweSomeAppPool», а домен пуст, как пример.

  2. Используйте PowerShell для вызова icacls.exe и используйте его для предоставления / отзыва любых разрешений, которые вы хотите, например (сначала обычная командная строка формы icacls, затем PowerShell, обратите внимание на разницу):

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

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

Если вы выберете второй вариант, обязательно сначала протестируйте их вручную, у меня не было возможности протестировать эти конкретные примеры, но он должен работать.

Следующее работает в Windows 2012, чтобы получить SID для сайта IIS. Это требует Провайдер IIS который использует модуль PowerShell WebAdministration, но Эта статья указывает, что он будет работать в 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])

Что-то вроде этого должно помочь вам. Он также должен иметь возможность разрешить 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
}

В Windows 2012 у меня работало следующее, другие примеры не работали:

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

Начиная с IIS 10 / Windows 10 / Server 2016, модуль WebAdministration устарел, и ожидается, что вместо него мы будем использовать новый модуль IISAdministration Powershell. Вот как с помощью нового модуля преобразовать SID пула приложений в виртуального пользователя:

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