Powershell aracılığıyla IIS APPPOOL \ * hesapları için ACL izinlerini nasıl ekleyebilirim?


11

Yeni web sitelerinin değişiklik izinlerine sahip olacak IIS hesabını ayarlamak istiyorum. Aşağıdaki komut dosyası var:

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
}

Ancak, çalıştırdığımda, böyle hatalar alıyorum:

Set-Acl: Bu iş istasyonu ile birincil etki alanı arasındaki güven ilişkisi başarısız oldu.

Bunun IIS APPPOOLgerçek bir etki alanı olmadığı, ancak sahte bir hesapta garip bir önek olduğunu düşünüyorum . Bu işi yapabilmem için bu hesaba başvurmanın doğru bir yolu var mı?

Yanıtlar:


12

Her şeyden önce, dizin yolu ilk konum bağımsız değişkeni olduğu için Set-Acl kullanın:

Set-Acl $directory $acl

İkinci olarak, kullanıcı nesnesini yalnızca bir argümanla oluşturmalısınız:

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

GÜNCELLEME: "IIS APPPOOL \ AppPoolName" işlevini NTAccount tanımlayıcısı olarak kabul etmeyecek gibi görünüyor. Şimdi, yapmaya çalıştığınız şeyi başarmanın iki yolu var:

  1. AppPoolIdentities SID ile yeni bir SID nesnesi oluşturun ve bunu aşağıdaki gibi bir NTAccount'a çevirin: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html ve bunu yapabilmeniz gerekir başka bir NTAccount nesnesi gibi davranmak için. Hala gerçek hesaplar için etki alanı / kullanıcı adlarını iletmek istiyorsanız, kullanıcı adı "AweSomeAppPool" ise ve etki alanı boşsa, örnek olarak AppPool SID varsayılanını oluşturan bazı basit bir mantık oluşturmuştur.

  2. İcacls.exe'yi çağırmak için PowerShell'i kullanın ve bu şekilde istediğiniz izinleri vermek / iptal etmek için kullanın (ilk normal icacls komut istemini, ardından powershell'i fark edin):

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

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

İkinci seçenek için giderseniz, önce bunları manuel olarak test ettiğinizden emin olun, bu belirli örnekleri kendim test etme şansım olmadı, ancak işe yaramalı


Yardım için teşekkürler. Bunu yaptığımda, AddAccessRule"Kimlik referanslarının bazıları veya tümü çevrilemedi" diyen bir istisna alıyorum . Bunun ne olabileceğine dair bir fikrin var mı?
bdukes

Burada neyi başarmaya çalıştığınızı anlamama yardım etmeye çalışın. Mesele şu ki, ApplicationPoolIdentities "gerçek" NT Hesapları değil, aslında NETWORK SERVICE'in "sanal hesap" temsili gibidir. Yerel sistem kaynakları veya ağa bağlı kaynaklar için izin ayarlamıyor musunuz? İhtiyacınıza bağlı olarak farklı bir zorluk ortaya çıkıyor :-)
Mathias R. Jessen

Yerel sistem kaynakları. Kurduğum yerel geliştirme web siteleri için ayar / sıfırlama izinlerini düzene koymaya çalışıyorum. Bu nedenle, bir web sitesi paketini dosya sistemine çıkartır, IIS'de kurarım, ardından IIS'ye izin vermek için bu komutu çalıştırırdım. Veya sitede bir izin sorunuyla karşılaşın, site oluşturulduktan sonra eklediğim bir şeyin izin değiştirdiğinden emin olmak için bunu çalıştırın.
bdukes

Sizin için bazı yararlı seçenekler ekledim
Mathias R. Jessen

Benim icaclsiçin harika çalışabildim , yardımın için teşekkürler! Ben fonksiyonun gövdesi (yukarıdaki ile aynı parametreler) cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q( /tdizinde özyinelemeli olarak çalışmak, /cherhangi bir hatadan sonra devam /qetmek ve her dosya için başarı mesajlarını bastırmak ) ile sona erdi .
bdukes

4

Böyle bir şey sizin için hile yapmalıdır. IIS APPPOOl \ Anything'i de çözebilmelidir ...

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"Kimlik referanslarının bazıları veya tümü çevrilemedi" diyen bir istisna alıyorum .
bdukes

Girdileriniz nelerdi?
Haytham AbuelFutuh

Set-AclOnPath .\Website "IIS APPPOOL\website.dev"Yine de denediğimde, "Bu iş istasyonu ile birincil etki alanı arasındaki güven ilişkisi başarısız oldu."
bdukes

4

IIS sitesi için bir SID almak üzere Windows 2012'de aşağıdakiler çalışır. WebAdministration powershell modülünü kullanan IIS Sağlayıcısı gerektirir , ancak bu makale Windows 2008R2 üzerinde çalışacağını gösterir.

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

Bu yaklaşımı kullanmaya çalıştım (Windows 8'de), ancak şu hatayı aldım: AddAccessRule'' 1 'argümanıyla' istisna çağırma ' :' Bazı veya tüm kimlik referansları çevrilemedi. '"
bdukes

@Mathias R. Jessen'in bağlantısını kullanarak SID'yi gerçek bir NTAccountişe çevirmek için cevapladı .
bdukes

Çeviriyi yapmak için yanıttaki kodu güncelledim. Ayrıca, bundan yararlanmaya çalışanlar Import-Module WebAdministrationiçin, IIS sürücüsünü IIS sağlayıcısından almak için arayın .
bdukes

3

IIS 10 / Windows 10 / Server 2016'dan itibaren WebAdministration modülü kullanımdan kaldırıldı ve bunun yerine yeni IISAdministration Powershell modülünü kullanmamız bekleniyor. Uygulama modülü SID'sinin yeni modülü kullanarak sanal kullanıcıya çevrilmesini sağlamak için:

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'de aşağıdakiler benim için çalıştı, diğer örnekleri çalıştıramadı:

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

Bu benim için bir şey dışında da işe yaradı. Bu, diğer TÜM izinleri kaldırdı. İstediğiniz bu değilse, bu satırı $acl.SetAccessRuleProtection($True, $False), burada son parametre PreserveInheritance olduğu için yorumlayın . Bunu gönderdiğiniz için teşekkürler!
Kurtis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.