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?

bdukes
sumber

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

Mathias R. Jessen
sumber
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
}
Haytham AbuelFutuh
sumber
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])
Justin Dearing
sumber
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])
Chris Doherty
sumber
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
Kristus
sumber
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