Come posso aggiungere le autorizzazioni ACL per gli account IIS APPPOOL \ * tramite Powershell?


11

Voglio essere in grado di impostare l'account IIS per i nuovi siti Web per avere autorizzazioni di modifica. Ho il seguente script:

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
}

Tuttavia, quando lo eseguo, ricevo errori come questo:

Set-Acl: relazione di trust tra questa workstation e il dominio primario non riuscita.

Penso che ciò sia dovuto al fatto che IIS APPPOOLnon è un dominio reale, ma è uno strano prefisso su un account un po 'falso. Esiste un modo corretto di fare riferimento a quell'account in modo che io possa farlo funzionare?

Risposte:


12

Prima di tutto, usa Set-Acl in questo modo, poiché il percorso della directory è il primo argomento posizionale:

Set-Acl $directory $acl

In secondo luogo, è necessario creare l'oggetto utente con un solo argomento:

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

AGGIORNAMENTO: Sembra che non accetti "IIS APPPOOL \ AppPoolName" come identificativo NTAccount. Ora, ci sono due modi per realizzare ciò che stai cercando di fare:

  1. Crea un nuovo oggetto SID con il SID AppPoolIdentities e traducilo in un account NTAcco, in questo modo: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html e dovresti essere in grado per trattarlo come qualsiasi altro oggetto NTAccount. Se vuoi comunque essere in grado di passare dominio / nomi utente per account reali, incorpora una logica semplice che viene impostata per impostazione predefinita sul SID AppPool se il nome utente è "AweSomeAppPool" e il dominio è vuoto, solo come esempio.

  2. Utilizzare PowerShell per richiamare icacls.exe e utilizzarlo per concedere / revocare qualsiasi autorizzazione si desideri, in questo modo (prima il normale prompt dei comandi del modulo icacls, quindi powershell, notare la differenza):

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

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

Se scegli la seconda opzione, assicurati di testarli prima manualmente, non ho avuto la possibilità di testare questi esempi specifici da solo, ma dovrebbe funzionare


Grazie per l'aiuto. In questo modo, ricevo un'eccezione che chiama AddAccessRule: "Alcuni o tutti i riferimenti di identità non possono essere tradotti". Qualche idea su cosa potrebbe essere?
bdukes il

Cerca di aiutarmi a capire cosa stai cercando di realizzare qui. Il fatto è che ApplicationPoolIdentities non sono account NT "reali", sono più simili a una rappresentazione "account virtuale" del SERVIZIO DI RETE. Non vuoi impostare le autorizzazioni sulle risorse di sistema locali o sulle risorse di rete? A seconda delle tue necessità, sorge una sfida diversa :-)
Mathias R. Jessen,

Risorse del sistema locale. Sto cercando di semplificare l'impostazione / il ripristino delle autorizzazioni per i siti Web di sviluppo locale che ho impostato. Quindi, decomprimerei un pacchetto di siti Web nel file system, lo imposti in IIS, quindi eseguivo questo comando per dare a IIS l'autorizzazione alla modifica. In alternativa, incappare in un problema di autorizzazione nel sito, eseguirlo per assicurarsi che qualcosa che ho aggiunto dopo la creazione del sito abbia le autorizzazioni di modifica.
bdukes il

Ho appena aggiunto alcune opzioni, si spera, utili per te
Mathias R. Jessen il

Sono stato in grado di icaclslavorare benissimo per me, grazie per l'aiuto! Ho finito con il corpo della funzione (stessi parametri di cui sopra) essendo cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(con /tper lavorare ricorsivamente sulla directory, /cper andare avanti dopo eventuali errori e /qper sopprimere i messaggi di successo per ogni file).
bdukes

4

Qualcosa del genere dovrebbe fare al caso tuo. Dovrebbe essere in grado di risolvere 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
}

Ricevo un'eccezione chiamando SetAccessRule: "Non è stato possibile tradurre alcuni o tutti i riferimenti di identità".
bdukes,

Quali sono stati i tuoi input?
Haytham AbuelFutuh,

Set-AclOnPath .\Website "IIS APPPOOL\website.dev", anche se quando lo riprovo, viene visualizzato un errore diverso, "La relazione di trust tra questa workstation e il dominio primario non è riuscita."
bdukes il

4

Di seguito funziona in Windows 2012 per ottenere un SID per il sito IIS. Richiede il provider IIS che utilizza il modulo PowerShell di amministrazione Web, ma questo articolo indica che funzionerà su 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])

Ho provato a usare questo approccio (su Windows 8), ma ho ottenuto questo errore: "Eccezione che chiama ' AddAccessRule' con '1' argomento (i): 'Alcuni o tutti i riferimenti di identità non possono essere tradotti.'"
bdukes

Utilizzando il link dalla risposta di @Mathias R. Jessen per tradurre il SID in un vero e proprio NTAccountfunzionato.
bdukes

Ho aggiornato il codice nella risposta per fare la traduzione. Inoltre, per coloro che cercano di trarne vantaggio, chiama Import-Module WebAdministrationper ottenere l'unità IIS dal provider IIS.
bdukes

3

A partire da IIS 10 / Windows 10 / Server 2016, il modulo WebAdministration è obsoleto e si prevede invece di utilizzare il nuovo modulo IISAdministration Powershell. Ecco come tradurre il SID del pool di applicazioni nell'utente virtuale utilizzando il nuovo modulo:

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

Quanto segue ha funzionato per me in Windows 2012, non è stato possibile far funzionare gli altri esempi:

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

Questo ha funzionato anche per me, tranne una cosa. Ciò ha rimosso TUTTE le altre autorizzazioni. Se questo non è ciò che desideri, commenta questa riga $acl.SetAccessRuleProtection($True, $False)poiché l'ultimo parametro qui è PreserveInheritance. Grazie per aver pubblicato questo!
Kurtis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.