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

11

Я хочу иметь возможность настроить учетную запись 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это не настоящий домен, а странный префикс для своего рода фальшивого аккаунта. Есть ли правильный способ обратиться к этой учетной записи, чтобы я мог сделать эту работу?

bdukes
источник

Ответы:

12

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

Set-Acl $directory $acl

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

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

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

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

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

Матиас Р. Ессен
источник
Спасибо за помощь. Делая это, я получаю исключение, вызывающее AddAccessRule: «Некоторые или все идентификационные ссылки не могут быть переведены». Есть идеи, что это может быть?
Bdukes
Постарайся помочь мне понять, чего ты здесь пытаешься достичь. Дело в том, что ApplicationPoolIdentities не являются «настоящими» учетными записями NT, они фактически больше похожи на представление «виртуальной учетной записи» NETWORK SERVICE. Вы не хотите устанавливать разрешения для локальных системных ресурсов или сетевых ресурсов? В зависимости от ваших потребностей, возникает другая проблема :-)
Матиас Р. Йессен,
Локальные системные ресурсы. Я пытаюсь упростить настройку / сброс разрешений для локальных сайтов разработки, которые я настраиваю. Поэтому я распаковываю пакет веб-сайта в файловую систему, настраиваю его в IIS, а затем запускаю эту команду, чтобы дать разрешение на изменение IIS. Или, столкнувшись с проблемой разрешений на сайте, запустите это, чтобы убедиться, что то, что я добавил после создания сайта, имеет разрешение на изменение.
bdukes
Просто добавил несколько, надеюсь, полезных вариантов для вас
Матиас Р. Йессен
Я смог icaclsотлично поработать, спасибо за помощь! Я закончил с тем, что тело функции (те же параметры, что и выше) было cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q( /tчтобы рекурсивно работать с каталогом, /cпродолжать работать после любых ошибок и /qподавлять сообщения об успехе для каждого файла).
bdukes
4

Нечто подобное должно помочь вам. Это должно быть в состоянии разрешить 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
источник
Я получаю исключение, вызывающее SetAccessRule: «Некоторые или все ссылки на идентификаторы не могут быть переведены».
bdukes
Какие у вас были входные данные?
Haytham AbuelFutuh
Set-AclOnPath .\Website "IIS APPPOOL\website.dev"хотя при повторной попытке я получаю другую ошибку: «Не удалось установить доверительные отношения между этой рабочей станцией и основным доменом».
bdukes
4

Следующее работает в 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])
Джастин Даринг
источник
Я пытался использовать этот подход (в Windows 8), но получил эту ошибку: «Вызов исключения AddAccessRule» с аргументом «1»: «Некоторые или все ссылки на идентификаторы не могут быть переведены.»
bdukes
Используя ссылку из ответа @Mathias R. Jessen, чтобы перевести SID в реальную работу NTAccount.
bdukes
Я обновил код в ответе, чтобы сделать перевод. Кроме того, для тех, кто пытается воспользоваться этим, позвоните, Import-Module WebAdministrationчтобы получить диск IIS от поставщика IIS.
bdukes
3

Начиная с 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])
Крис Доэрти
источник
2

Следующее работает для меня в 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
Христос
источник
Это также работало для меня кроме одной вещи. Это удалило ВСЕ другие разрешения. Если это не то, что вам нужно, закомментируйте эту строку, так $acl.SetAccessRuleProtection($True, $False)как последний параметр здесь - PreserveInheritance. Спасибо за публикацию этого!
Куртис