Bagaimana saya bisa menambahkan izin ACL untuk akun IIS APPPOOL \ * melalui Powershell?


11

Saya ingin dapat mengatur akun IIS untuk situs web baru untuk memodifikasi izin. Saya memiliki skrip berikut:

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
}

Namun, ketika saya menjalankannya, saya mendapatkan kesalahan seperti ini:

Set-Acl: Hubungan trust antara workstation ini dan domain primer gagal.

Saya pikir ini karena IIS APPPOOLbukan domain asli, tetapi merupakan awalan aneh pada akun sejenis. Apakah ada cara yang benar untuk merujuk ke akun itu sehingga saya dapat membuat ini berfungsi?

Jawaban:


12

Pertama-tama, gunakan Set-Acl seperti ini, karena jalur direktori adalah argumen posisi pertama:

Set-Acl $directory $acl

Kedua, Anda harus membuat objek pengguna hanya dengan satu argumen:

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

UPDATE: Tampaknya ia tidak akan menerima "IIS APPPOOL \ AppPoolName" sebagai pengidentifikasi NTAccount. Sekarang, ada dua cara untuk mencapai apa yang Anda coba lakukan:

  1. Buat objek SID baru dengan SID AppPoolIdentities dan terjemahkan ke dalam NTAccount, seperti ini: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html , dan Anda harus dapat untuk memperlakukannya seperti objek NTAccount lainnya. Jika Anda masih ingin dapat meneruskan domain / nama pengguna untuk akun nyata, buat beberapa logika sederhana yang secara default adalah SID AppPool jika nama pengguna adalah "AweSomeAppPool" dan domain kosong, hanya sebagai contoh.

  2. Gunakan PowerShell untuk memanggil icacls.exe, dan gunakan itu untuk memberikan / mencabut izin apa pun yang Anda inginkan, seperti ini (icacls formulir perintah prompt pertama normal, kemudian PowerShell, perhatikan perbedaannya):

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

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

Jika Anda memilih opsi kedua, pastikan untuk mengujinya secara manual terlebih dahulu, saya belum memiliki kesempatan untuk menguji sendiri contoh-contoh spesifik ini, tetapi harus bekerja


Terima kasih untuk bantuannya. Melakukan hal itu, saya mendapatkan panggilan pengecualian AddAccessRule: "Beberapa atau semua referensi identitas tidak dapat diterjemahkan." Ada ide apa itu?
bdukes

Cobalah untuk membantu saya memahami apa yang ingin Anda capai di sini. Masalahnya, ApplicationPoolIdentities bukan "NT" Account NT, mereka lebih seperti representasi "akun virtual" dari LAYANAN JARINGAN sebenarnya. Apakah Anda tidak ingin mengatur izin pada sumber daya sistem lokal atau sumber daya jaringan? Tergantung pada kebutuhan Anda, tantangan yang berbeda muncul :-)
Mathias R. Jessen

Sumber daya sistem lokal. Saya mencoba merampingkan pengaturan / pengaturan ulang izin untuk situs web pengembangan lokal yang saya setup. Jadi, saya akan meng-unzip paket situs web ke sistem file, mengaturnya di IIS, kemudian jalankan perintah ini untuk memberikan izin modifikasi IIS. Atau, mengalami masalah izin di situs, jalankan ini untuk memastikan sesuatu yang saya tambahkan setelah situs dibuat telah mengubah izin.
bdukes

Baru saja menambahkan beberapa opsi yang semoga bermanfaat bagi Anda
Mathias R. Jessen

Saya bisa icaclsbekerja dengan baik untuk saya, terima kasih atas bantuannya! Saya berakhir dengan tubuh fungsi (parameter yang sama seperti di atas) sedang cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(dengan /tbekerja secara rekursif pada direktori, /cuntuk terus mencari kesalahan, dan /quntuk menekan pesan sukses untuk setiap file).
bdukes

4

Sesuatu seperti ini harus melakukan trik untuk Anda. Itu harus dapat menyelesaikan IIS APPPOOl \ Apa pun juga ...

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
}

Saya menerima panggilan pengecualian SetAccessRule: "Beberapa atau semua referensi identitas tidak dapat diterjemahkan."
bdukes

Apa masukan Anda?
Haytham AbuelFutuh

Set-AclOnPath .\Website "IIS APPPOOL\website.dev", meskipun ketika saya mencobanya lagi, saya mendapatkan kesalahan yang berbeda, "Hubungan kepercayaan antara workstation ini dan domain primer gagal."
bdukes

4

Berikut ini berfungsi di Windows 2012 untuk mendapatkan SID untuk situs IIS. Membutuhkan Penyedia IIS yang menggunakan modul PowerAdellration WebAdministration, tetapi artikel ini menunjukkan itu akan bekerja pada 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])

Saya mencoba menggunakan pendekatan ini (pada Windows 8), tetapi mendapatkan kesalahan ini: "Panggilan pengecualian AddAccessRule'dengan argumen' 1 ':' Beberapa atau semua referensi identitas tidak dapat diterjemahkan. '"
bdukes

Menggunakan tautan dari jawaban @Mathias R. Jessen untuk menerjemahkan SID menjadi karya nyata NTAccount.
bdukes

Saya telah memperbarui kode dalam jawaban untuk melakukan terjemahan. Juga, bagi mereka yang mencoba mengambil keuntungan dari ini, panggilan Import-Module WebAdministrationuntuk mendapatkan drive IIS dari penyedia IIS.
bdukes

3

Pada IIS 10 / Windows 10 / Server 2016, modul WebAdministration sudah usang dan kami diharapkan menggunakan modul IISAdministration Powershell yang baru. Berikut cara mendapatkan kumpulan aplikasi SID yang diterjemahkan ke pengguna virtual menggunakan modul baru:

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

Berikut ini berfungsi untuk saya di Windows 2012, tidak bisa membuat contoh lain berfungsi:

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

Ini juga bekerja untuk saya kecuali satu hal. Ini menghapus SEMUA izin lainnya. Jika ini bukan yang Anda inginkan, komentari baris ini $acl.SetAccessRuleProtection($True, $False)karena param terakhir di sini adalah PreserveInheritance. Terima kasih telah memposting ini!
Kurtis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.