Jak mogę dodać uprawnienia ACL dla kont IIS APPPOOL \ * za pomocą Powershell?

11

Chcę mieć możliwość ustawienia konta IIS dla nowych stron internetowych, aby miały uprawnienia do modyfikacji. Mam następujący skrypt:

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
}

Jednak gdy go uruchamiam, otrzymuję takie błędy:

Set-Acl: Relacja zaufania między tą stacją roboczą a domeną podstawową nie powiodła się.

Myślę, że dzieje się tak, ponieważ IIS APPPOOLnie jest to prawdziwa domena, ale dziwny prefiks na fałszywym koncie. Czy istnieje poprawny sposób na odniesienie się do tego konta, aby umożliwić mi działanie?

bdukes
źródło

Odpowiedzi:

12

Po pierwsze, użyj Set-Acl w ten sposób, ponieważ ścieżka katalogu jest pierwszym argumentem pozycyjnym:

Set-Acl $directory $acl

Po drugie, powinieneś utworzyć obiekt użytkownika z tylko jednym argumentem:

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

AKTUALIZACJA: Wydaje się, że nie zaakceptuje „IIS APPPOOL \ AppPoolName” jako identyfikatora NTAccount. Istnieją dwa sposoby osiągnięcia tego, co próbujesz zrobić:

  1. Utwórz nowy obiekt SID za pomocą identyfikatora SID AppPoolIdentities i przetłumacz go na konto NTAccount, takie jak: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html , i powinieneś być w stanie traktować to jak każdy inny obiekt NTAccount. Jeśli nadal chcesz móc przekazywać nazwy domen / użytkowników dla prawdziwych kont, wbuduj prostą logikę, która domyślnie przyjmuje wartość SID AppPool, jeśli nazwa użytkownika to „AweSomeAppPool”, a domena jest pusta, na przykład.

  2. Użyj programu PowerShell, aby wywołać icacls.exe, i użyj go do przyznania / cofnięcia dowolnych uprawnień, takich jak to (najpierw normalne wiersze polecenia icacls, a następnie PowerShell, zauważ różnicę):

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

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

Jeśli wybierzesz drugą opcję, najpierw sprawdź ją ręcznie, nie miałem okazji samodzielnie przetestować tych konkretnych przykładów, ale powinna działać

Mathias R. Jessen
źródło
Dzięki za pomoc. W ten sposób otrzymuję wyjątek wzywający AddAccessRule: „Niektórych lub wszystkich odniesień do tożsamości nie udało się przetłumaczyć”. Jakieś pomysły, co to może być?
bdukes
Pomóż mi zrozumieć, co próbujesz osiągnąć tutaj. Chodzi o to, że ApplicationPoolIdentities nie są „prawdziwymi” kontami NT, są raczej raczej reprezentacją „konta wirtualnego” usługi NETWORK SERVICE. Czy nie chcesz ustawiać uprawnień do lokalnych zasobów systemowych lub zasobów sieciowych? W zależności od potrzeb pojawia się inne wyzwanie :-)
Mathias R. Jessen
Lokalne zasoby systemowe. Usiłuję usprawnić ustawianie / resetowanie uprawnień dla lokalnych witryn programistycznych, które konfiguruję. Rozpakowałbym pakiet witryny do systemu plików, skonfigurowałem go w IIS, a następnie uruchomiłem to polecenie, aby zezwolić IIS na modyfikację. Lub napotkasz problem z uprawnieniami w witrynie, uruchom to, aby upewnić się, że coś, co dodałem po utworzeniu witryny, zmodyfikuje uprawnienia.
bdukes
Właśnie dodałem kilka miejmy nadzieję użytecznych opcji dla Ciebie
Mathias R. Jessen
Dzięki temu mogłem icaclsświetnie pracować, dzięki za pomoc! Skończyło się na tym, że treść funkcji (takie same parametry jak powyżej) jest cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(z /tpracą rekurencyjną nad katalogiem, /ckontynuowaniem błędów i /qtłumieniem komunikatów o sukcesie dla każdego pliku).
bdukes
4

Coś takiego powinno załatwić sprawę. Powinien też być w stanie rozwiązać 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
źródło
Otrzymuję wyjątek z informacją SetAccessRule: „Niektórych lub wszystkich odniesień do tożsamości nie udało się przetłumaczyć”.
bdukes
Jakie były twoje wkłady?
Haytham AbuelFutuh
Set-AclOnPath .\Website "IIS APPPOOL\website.dev", chociaż przy ponownej próbie pojawia się inny błąd: „Relacja zaufania między tą stacją roboczą a domeną podstawową nie powiodła się”.
bdukes
4

Poniższe działa w systemie Windows 2012, aby uzyskać identyfikator SID dla witryny IIS. Wymaga dostawcy usług IIS, który korzysta z modułu PowerAdministration WebAdministration, ale ten artykuł wskazuje, że będzie działał w systemie 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])
Justin Dearing
źródło
Próbowałem użyć tego podejścia (w systemie Windows 8), ale otrzymałem błąd: „Wywołanie wyjątku AddAccessRule” z argumentami „1”: „Niektórych lub wszystkich odwołań do tożsamości nie można przetłumaczyć.” ”
bdukes
Za pomocą linku z odpowiedzi @Mathiasa R. Jessena przetłumaczyłem SID na naprawdę NTAccountdziałający.
bdukes
Zaktualizowałem kod w odpowiedzi, aby wykonać tłumaczenie. Również dla tych, którzy próbują skorzystać z tego, zadzwoń, Import-Module WebAdministrationaby uzyskać dysk IIS od dostawcy IIS.
bdukes
3

Począwszy od IIS 10 / Windows 10 / Server 2016, moduł WebAdministration jest przestarzały i spodziewamy się, że użyjemy nowego modułu PowerShell administracji IIS. Oto jak przekonwertować identyfikator SID puli aplikacji na wirtualnego użytkownika za pomocą nowego modułu:

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])
Chris Doherty
źródło
2

Poniższe działało dla mnie w systemie Windows 2012, nie mogłem uruchomić innych przykładów:

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
Chrystus
źródło
To również działało dla mnie z wyjątkiem jednej rzeczy. To usunęło WSZYSTKIE inne uprawnienia. Jeśli nie tego chcesz, skomentuj ten wiersz, $acl.SetAccessRuleProtection($True, $False)ponieważ ostatnim parametrem jest PreserveInheritance. Dziękujemy za opublikowanie tego!
Kurtis