Wie kann ich über Powershell ACL-Berechtigungen für IIS APPPOOL \ * -Konten hinzufügen?


11

Ich möchte in der Lage sein, das IIS-Konto für neue Websites so einzurichten, dass sie über Änderungsberechtigungen verfügen. Ich habe das folgende Skript:

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
}

Wenn ich es jedoch ausführe, erhalte ich folgende Fehler:

Set-Acl: Die Vertrauensstellung zwischen dieser Workstation und der primären Domäne ist fehlgeschlagen.

Ich denke, das liegt daran, dass IIS APPPOOLes sich nicht um eine echte Domain handelt, sondern um ein seltsames Präfix für eine Art gefälschten Account. Gibt es eine korrekte Möglichkeit, auf dieses Konto zu verweisen, damit dies funktioniert?

Antworten:


12

Verwenden Sie zunächst Set-Acl wie folgt, da der Verzeichnispfad das erste Positionsargument ist:

Set-Acl $directory $acl

Zweitens sollten Sie das Benutzerobjekt mit nur einem Argument erstellen:

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

UPDATE: Scheint, dass "IIS APPPOOL \ AppPoolName" nicht als NTAccount-ID akzeptiert wird. Nun gibt es zwei Möglichkeiten, um das zu erreichen, was Sie versuchen:

  1. Erstellen Sie ein neues SID-Objekt mit der AppPoolIdentities-SID und übersetzen Sie es in ein NTAccount, wie folgt: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html , und Sie sollten in der Lage sein um es wie jedes andere NTAccount-Objekt zu behandeln. Wenn Sie weiterhin Domänen- / Benutzernamen für echte Konten übergeben möchten, ist eine einfache Logik integriert, die standardmäßig die AppPool-SID verwendet, wenn der Benutzername "AweSomeAppPool" lautet und die Domäne nur als Beispiel leer ist.

  2. Verwenden Sie PowerShell, um icacls.exe aufzurufen, und verwenden Sie es, um die gewünschten Berechtigungen wie folgt zu erteilen / zu widerrufen (zuerst normale icacls-Eingabeaufforderung, dann Powershell, beachten Sie den Unterschied):

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

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

Wenn Sie sich für die zweite Option entscheiden, müssen Sie sie zuerst manuell testen. Ich hatte noch keine Gelegenheit, diese spezifischen Beispiele selbst zu testen, aber es sollte funktionieren


Danke für die Hilfe. Dabei erhalte ich eine Ausnahme mit dem Aufruf AddAccessRule: "Einige oder alle Identitätsreferenzen konnten nicht übersetzt werden." Irgendwelche Ideen, was das sein könnte?
Bdukes

Versuchen Sie mir zu helfen, zu verstehen, was Sie hier erreichen wollen. Die Sache ist, dass ApplicationPoolIdentities keine "echten" NT-Konten sind, sondern eher eine "virtuelle Konto" -Darstellung des NETWORK SERVICE. Möchten Sie keine Berechtigungen für lokale Systemressourcen oder Netzwerkressourcen festlegen? Je nach Bedarf ergibt sich eine andere Herausforderung :-)
Mathias R. Jessen

Lokale Systemressourcen. Ich versuche, das Einstellen / Zurücksetzen von Berechtigungen für von mir eingerichtete lokale Entwicklungswebsites zu optimieren. Also würde ich ein Website-Paket in das Dateisystem entpacken, es in IIS einrichten und dann diesen Befehl ausführen, um die Berechtigung zum Ändern von IIS zu erteilen. Oder führen Sie ein Berechtigungsproblem auf der Site aus und führen Sie dieses aus, um sicherzustellen, dass etwas, das ich nach dem Erstellen der Site hinzugefügt habe, über Änderungsberechtigungen verfügt.
Bdukes

Ich habe gerade einige hoffentlich nützliche Optionen für Sie hinzugefügt
Mathias R. Jessen

Ich konnte icaclsgroßartig für mich arbeiten, danke für die Hilfe! Am Ende hatte ich den Hauptteil der Funktion (dieselben Parameter wie oben) cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(mit /trekursiver Bearbeitung des Verzeichnisses, /cum nach Fehlern weiterzumachen und /qErfolgsmeldungen für jede Datei zu unterdrücken).
Bdukes

4

So etwas sollte den Trick für Sie tun. Es sollte auch in der Lage sein, IIS APPPOOl \ Anything aufzulösen ...

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
}

Ich erhalte eine Ausnahme mit dem Aufruf SetAccessRule: "Einige oder alle Identitätsreferenzen konnten nicht übersetzt werden."
Bdukes

Was waren deine Eingaben?
Haytham AbuelFutuh

Set-AclOnPath .\Website "IIS APPPOOL\website.dev"Wenn ich es jedoch erneut versuche, wird die andere Fehlermeldung angezeigt: "Die Vertrauensbeziehung zwischen dieser Workstation und der primären Domäne ist fehlgeschlagen."
Bdukes

4

Das Folgende funktioniert in Windows 2012, um eine SID für die IIS-Site abzurufen. Es ist der IIS-Anbieter erforderlich, der das WebAdministration-Powershell-Modul verwendet. In diesem Artikel wird jedoch angegeben, dass es unter Windows 2008R2 funktioniert.

$appPoolName = 'MyAppPool'
$appPoolSid = (Get-ItemProperty IIS:\AppPools\$appPool).applicationPoolSid
$identifier = New-Object System.Security.Principal.SecurityIdentifier $appPoolSid
$user = $identifier.Translate([System.Security.Principal.NTAccount])

Ich habe versucht, diesen Ansatz zu verwenden (unter Windows 8), habe jedoch den folgenden Fehler erhalten: "Ausnahme beim Aufrufen von ' AddAccessRule' mit '1' Argument (en): 'Einige oder alle Identitätsreferenzen konnten nicht übersetzt werden.'"
bdukes

Verwenden Sie den Link aus der Antwort von @Mathias R. Jessen, um die SID in eine echte NTAccountArbeit zu übersetzen .
Bdukes

Ich habe den Code in der Antwort aktualisiert, um die Übersetzung durchzuführen. Wenn Sie dies nutzen möchten, rufen Import-Module WebAdministrationSie das IIS-Laufwerk an, um das IIS-Laufwerk zu erhalten.
Bdukes

3

Ab IIS 10 / Windows 10 / Server 2016 ist das WebAdministration-Modul veraltet, und es wird erwartet, dass stattdessen das neue IISAdministration Powershell-Modul verwendet wird. So übersetzen Sie die SID des Anwendungspools mithilfe des neuen Moduls in den virtuellen Benutzer:

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

Folgendes hat in Windows 2012 für mich funktioniert, die anderen Beispiele konnten nicht funktionieren:

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

Das hat bis auf eine Sache auch bei mir funktioniert. Dadurch wurden ALLE anderen Berechtigungen entfernt. Wenn dies nicht das ist, was Sie wollen, kommentieren Sie diese Zeile aus, $acl.SetAccessRuleProtection($True, $False)da der letzte Parameter hier PreserveInheritance ist. Danke, dass du das gepostet hast!
Kurtis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.