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

Відповіді:


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 SID, якщо ім'я користувача "AweSomeAppPool", а домен порожній, як приклад.

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

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

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

Якщо ви перейдете на другий варіант, спочатку перевірте їх вручну, я не мав можливості перевірити ці конкретні приклади самостійно, але це має спрацювати


Дякую за допомогу. Роблячи це, я отримую виняток із закликом AddAccessRule: "Деякі або всі посилання на ідентифікацію неможливо перекласти". Будь-які ідеї, що це може бути?
бдук

Спробуйте допомогти мені зрозуміти, що ви намагаєтеся досягти тут. Вся справа в тому, що ApplicationPoolIdentities не є "справжніми" NT-акаунтами, вони більше схожі на "віртуальні акаунти" представлення NETWORK SERVICE. Ви не хочете встановлювати дозволи на локальні або мережеві ресурси? Залежно від вашої потреби, виникає інший виклик :-)
Mathias R. Jessen

Локальні системні ресурси. Я намагаюся упорядкувати налаштування / скидання дозволів для веб-сайтів локальної розробки, які я налаштовую. Отже, я розпакував пакет веб-сайтів у файлову систему, встановив його в IIS, а потім запустив цю команду, щоб надати IIS дозвіл на зміну. Або запустіть проблему з дозволом на сайті, запустіть це, щоб переконатися, що щось, що я додав після створення сайту, змінило дозвіл.
бдукс

Щойно додав кілька сподіваються корисних варіантів для вас
Матіас Р. Єссен

Мені вдалося icaclsчудово працювати для мене, дякую за допомогу! Нарешті, я маю частину функції (ті ж параметри, що і вище) cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q/tрекурсивною роботою в каталозі, /cпродовжувати йти після будь-яких помилок і /qпридушувати повідомлення про успіх для кожного файлу).
бдукс

4

Щось подібне повинно зробити для вас трюк. Він повинен бути в змозі вирішити IIS APPPOOl \ Усе, а також ...

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
}

Я отримую виняток із закликом SetAccessRule: "Деякі або всі посилання на посвідчення особи не можна було перекласти".
бдукс

Які ваші вклади?
Haytham AbuelFutuh

Set-AclOnPath .\Website "IIS APPPOOL\website.dev", хоча коли я повторюю його, я отримую іншу помилку: "Довірчі відносини між цією робочою станцією та основним доменом не вдалися".
бдукс

4

Далі працює в Windows 2012, щоб отримати SID для сайту IIS. Для цього потрібен постачальник IIS, який використовує модуль оболонки 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
Виклик винятку

Використовуючи посилання з відповіді @Mathias R. Jessen, щоб перетворити SID в реально працюючу NTAccount.
бдукс

Я оновив код у відповіді, щоб зробити переклад. Також для тих, хто намагається цим скористатися, зателефонуйте, Import-Module WebAdministrationщоб отримати привід IIS від постачальника послуг IIS.
бдукс

3

Станом на IIS 10 / Windows 10 / Server 2016 модуль WebAdministration застарілий, і, як очікується, замість цього буде використаний новий модуль Powershell з управлінням IISA. Ось як перевести 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. Дякуємо, що опублікували це!
Куртис
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.