Comment puis-je ajouter des autorisations ACL pour les comptes IIS APPPOOL \ * via Powershell?

11

Je veux pouvoir définir le compte IIS pour que les nouveaux sites Web aient des autorisations de modification. J'ai le script suivant:

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
}

Cependant, lorsque je l'exécute, j'obtiens des erreurs comme celle-ci:

Set-Acl: la relation d'approbation entre ce poste de travail et le domaine principal a échoué.

Je pense que c'est parce que ce n'est IIS APPPOOLpas un vrai domaine, mais c'est un préfixe étrange sur un genre de faux compte. Existe-t-il une manière correcte de se référer à ce compte afin que je puisse faire ce travail?

bdukes
la source

Réponses:

12

Tout d'abord, utilisez Set-Acl comme ceci, car le chemin du répertoire est le premier argument positionnel:

Set-Acl $directory $acl

Deuxièmement, vous devez créer l'objet utilisateur avec un seul argument:

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

MISE À JOUR: Semble qu'il n'acceptera pas "IIS APPPOOL \ AppPoolName" comme identifiant NTAccount. Maintenant, il y a deux façons d'accomplir ce que vous essayez de faire:

  1. Créez un nouvel objet SID avec le SID AppPoolIdentities et traduisez-le en un NTAccount, comme ceci: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html , et vous devriez pouvoir pour le traiter comme tout autre objet NTAccount. Si vous voulez toujours pouvoir transmettre le domaine / noms d'utilisateur pour les comptes réels, construit dans une logique simple qui par défaut est le SID AppPool si le nom d'utilisateur est "AweSomeAppPool" et le domaine est vide, juste à titre d'exemple.

  2. Utilisez PowerShell pour appeler icacls.exe et utilisez-le pour accorder / révoquer les autorisations que vous souhaitez, comme ceci (première invite de commande de formulaire icacls normal, puis powershell, remarquez la différence):

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

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

Si vous optez pour la deuxième option, assurez-vous de les tester d'abord manuellement, je n'ai pas eu la chance de tester ces exemples spécifiques moi-même, mais cela devrait fonctionner

Mathias R. Jessen
la source
Merci pour l'aide. Ce faisant, je reçois une exception appelant AddAccessRule: "Certaines ou toutes les références d'identité n'ont pas pu être traduites." Des idées ce que cela pourrait être?
bdukes
Essayez de m'aider à comprendre ce que vous essayez d'accomplir ici. Le fait est que ApplicationPoolIdentities ne sont pas de "vrais" comptes NT, ils ressemblent plutôt à une représentation de "compte virtuel" du SERVICE RÉSEAU. Ne souhaitez-vous pas définir des autorisations sur les ressources système locales ou les ressources réseau? Selon votre besoin, un défi différent se pose :-)
Mathias R. Jessen
Ressources système locales. J'essaie de rationaliser la définition / réinitialisation des autorisations pour les sites de développement local que j'ai configurés. Donc, je décompressez un package de site Web dans le système de fichiers, le configurez dans IIS, puis exécutez cette commande pour donner à IIS l'autorisation de modifier. Ou, rencontrez un problème d'autorisation sur le site, exécutez-le pour vous assurer que quelque chose que j'ai ajouté après la création du site dispose d'une autorisation de modification.
bdukes
Nous venons d'ajouter quelques options, espérons-le, utiles pour vous
Mathias R. Jessen
J'ai pu icaclstravailler très bien pour moi, merci pour l'aide! Je me suis retrouvé avec le corps de la fonction (mêmes paramètres que ci-dessus) étant cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(avec /tpour travailler récursivement sur le répertoire, /cpour continuer après les erreurs et /qpour supprimer les messages de réussite pour chaque fichier).
bdukes
4

Quelque chose comme ça devrait faire l'affaire pour vous. Il devrait également pouvoir résoudre 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
la source
Je reçois une exception appelant SetAccessRule: "Certaines ou toutes les références d'identité n'ont pas pu être traduites."
bdukes
Quelles ont été vos contributions?
Haytham AbuelFutuh
Set-AclOnPath .\Website "IIS APPPOOL\website.dev", mais lorsque je réessaye, j'obtiens une erreur différente: "La relation d'approbation entre ce poste de travail et le domaine principal a échoué."
bdukes
4

Les éléments suivants fonctionnent dans Windows 2012 pour obtenir un SID pour le site IIS. Il nécessite le fournisseur IIS qui utilise le module PowerShell WebAdministration, mais cet article indique qu'il fonctionnera sur 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
la source
J'ai essayé d'utiliser cette approche (sur Windows 8), mais j'ai eu cette erreur: "Exception appelant ' AddAccessRule' avec des arguments '1': 'Certaines ou toutes les références d'identité n'ont pas pu être traduites.'"
bdukes
Utiliser le lien de la réponse de @Mathias R. Jessen pour traduire le SID en un vrai NTAccounttravail.
bdukes
J'ai mis à jour le code dans la réponse pour faire la traduction. En outre, pour ceux qui tentent de tirer parti de cela, appelez Import-Module WebAdministrationpour obtenir le lecteur IIS auprès du fournisseur IIS.
bdukes
3

Depuis IIS 10 / Windows 10 / Server 2016, le module WebAdministration est obsolète et nous devrions utiliser à la place le nouveau module IISAdministration Powershell. Voici comment obtenir le SID du pool d'applications traduit pour l'utilisateur virtuel à l'aide du nouveau module:

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
la source
2

Ce qui suit a fonctionné pour moi dans Windows 2012, n'a pas pu faire fonctionner les autres exemples:

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
Christ
la source
Cela a également fonctionné pour moi, sauf une chose. Cela a supprimé TOUTES les autres autorisations. Si ce n'est pas ce que vous voulez, commentez cette ligne $acl.SetAccessRuleProtection($True, $False)car le dernier paramètre ici est PreserveInheritance. Merci d'avoir posté ça!
Kurtis