ฉันจะเพิ่มสิทธิ์ ACL สำหรับบัญชี IIS APPPOOL \ * ผ่าน Powershell ได้อย่างไร


11

ฉันต้องการที่จะสามารถตั้งค่าบัญชี IIS สำหรับเว็บไซต์ใหม่ให้มีการแก้ไขสิทธิ์ ฉันมีสคริปต์ต่อไปนี้:

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
}

อย่างไรก็ตามเมื่อฉันเรียกใช้ฉันได้รับข้อผิดพลาดเช่นนี้:

Set-Acl: ความสัมพันธ์ที่เชื่อถือได้ระหว่างเวิร์กสเตชันนี้และโดเมนหลักล้มเหลว

ผมคิดว่านี่เป็นเพราะIIS APPPOOLไม่ได้เป็นโดเมนจริง แต่เป็นคำนำหน้าแปลกในบัญชีชนิดของปลอม มีวิธีที่ถูกต้องในการอ้างถึงบัญชีนั้นเพื่อให้ฉันสามารถทำงานได้หรือไม่

คำตอบ:


12

ก่อนอื่นให้ใช้ Set-Acl เช่นนี้เนื่องจากเส้นทางไดเรกทอรีเป็นอาร์กิวเมนต์ตำแหน่งแรก:

Set-Acl $directory $acl

ประการที่สองคุณควรสร้างวัตถุผู้ใช้ที่มีเพียงหนึ่งอาร์กิวเมนต์:

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

อัปเดต:ดูเหมือนว่าจะไม่ยอมรับ "IIS APPPOOL \ AppPoolName" เป็นตัวระบุ NTAccount ขณะนี้มีสองวิธีในการบรรลุสิ่งที่คุณพยายามทำ:

  1. สร้างวัตถุ SID ใหม่ด้วย AppPoolIdentities SID และแปลเป็น NTAccount เช่นนี้: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.htmlและคุณควรจะสามารถ การปฏิบัติเหมือนวัตถุ NTAccount อื่น ๆ หากคุณยังคงต้องการที่จะผ่านโดเมน / ชื่อผู้ใช้สำหรับบัญชีจริงสร้างขึ้นในตรรกะง่ายๆที่เริ่มต้นไปที่ AppPool SID หากชื่อผู้ใช้คือ "AweSomeAppPool" และโดเมนว่างเปล่าเป็นตัวอย่าง

  2. ใช้ PowerShell เพื่อเรียกใช้ icacls.exe และใช้เพื่อให้ / เพิกถอนการอนุญาตใด ๆ ที่คุณต้องการเช่นนี้ (พร้อมรับคำสั่งปกติแบบฟอร์ม icacls ปกติครั้งแรกจากนั้น PowerShell สังเกตเห็นความแตกต่าง):

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

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

หากคุณเลือกตัวเลือกที่สองให้แน่ใจว่าได้ทดสอบด้วยตนเองก่อนฉันไม่ได้มีโอกาสทดสอบตัวอย่างเฉพาะเหล่านี้ด้วยตนเอง แต่ควรใช้งานได้


ขอบคุณสำหรับความช่วยเหลือ ฉันได้รับการเรียกยกเว้นAddAccessRule: "ไม่สามารถแปลข้อมูลอ้างอิงบางส่วนหรือทั้งหมด" ความคิดใดที่อาจเป็น?
bdukes

พยายามช่วยฉันเข้าใจสิ่งที่คุณพยายามทำให้สำเร็จที่นี่ สิ่งที่สำคัญคือ ApplicationPoolIdentities ไม่ใช่บัญชี NT "ของจริง" พวกเขาเป็นเหมือนการแสดง "บัญชีเสมือน" ของ NETWORK SERVICE จริงๆแล้ว คุณไม่ต้องการตั้งค่าการอนุญาตในทรัพยากรระบบภายในเครื่องหรือทรัพยากรในเครือข่ายหรือไม่? ความท้าทายที่แตกต่างกันเกิดขึ้น :-)
Mathias R. Jessen

ทรัพยากรระบบท้องถิ่น ฉันพยายามปรับปรุงการตั้งค่า / รีเซ็ตสิทธิ์สำหรับเว็บไซต์พัฒนาท้องถิ่นที่ฉันตั้งค่า ดังนั้นฉันจะเปิดเครื่องรูดเว็บไซต์แพคเกจไปยังระบบไฟล์ตั้งค่าใน IIS แล้วเรียกใช้คำสั่งนี้เพื่อให้สิทธิ์การแก้ไข IIS หรือพบปัญหาการอนุญาตในไซต์เรียกใช้สิ่งนี้เพื่อให้แน่ใจว่าสิ่งที่ฉันได้เพิ่มหลังจากสร้างไซต์นั้นได้แก้ไขสิทธิ์แล้ว
bdukes

เพิ่งเพิ่มตัวเลือกที่เป็นประโยชน์สำหรับคุณหวังว่า
Mathias R. Jessen

ฉันสามารถicaclsทำงานได้ดีสำหรับฉันขอบคุณสำหรับความช่วยเหลือ! ฉันสิ้นสุดด้วยเนื้อความของฟังก์ชัน (พารามิเตอร์เดียวกันกับด้านบน) เป็นcmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(กับ/tการทำงานซ้ำในไดเรกทอรี/cเพื่อดำเนินการต่อไปหลังจากข้อผิดพลาดและ/qเพื่อระงับข้อความสำเร็จสำหรับแต่ละไฟล์)
bdukes

4

สิ่งนี้ควรทำเคล็ดลับสำหรับคุณ มันควรจะสามารถแก้ไข 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
}

ฉันได้รับการเรียกยกเว้นSetAccessRule: "ไม่สามารถแปลข้อมูลอ้างอิงบางส่วนหรือทั้งหมด"
bdukes

ปัจจัยการผลิตของคุณคืออะไร?
Haytham AbuelFutuh

Set-AclOnPath .\Website "IIS APPPOOL\website.dev"แม้ว่าเมื่อฉันลองอีกครั้งฉันได้รับข้อผิดพลาดที่แตกต่างกัน "ความสัมพันธ์ที่เชื่อถือระหว่างเวิร์กสเตชันนี้กับโดเมนหลักล้มเหลว"
bdukes

4

การทำงานต่อไปนี้ใน Windows 2012 เพื่อรับ SID สำหรับไซต์ IIS มันต้องการผู้ให้บริการ IISซึ่งใช้โมดูล PowerShell WebAdministrator แต่บทความนี้ระบุว่าจะทำงานบน 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])

ฉันพยายามใช้วิธีนี้ (บน Windows 8) แต่ได้รับข้อผิดพลาดนี้: "การเรียกข้อยกเว้น" AddAccessRule'พร้อมอาร์กิวเมนต์' 1 ':' ไม่สามารถแปลข้อมูลอ้างอิงบางส่วนหรือทั้งหมด '"
bdukes

ใช้การเชื่อมโยงจากคำตอบ @Mathias อาร์เซ่นที่จะแปล SID ลงจริงNTAccountทำงาน
bdukes

ฉันได้อัปเดตรหัสในคำตอบเพื่อทำการแปล นอกจากนี้สำหรับผู้ที่พยายามใช้ประโยชน์จากสิ่งนี้โทรImport-Module WebAdministrationไปรับไดรฟ์ IIS จากผู้ให้บริการ IIS
bdukes

3

ตั้งแต่ IIS 10 / Windows 10 / Server 2016 โมดูล WebAdministrator จะถูกคัดค้านและเราคาดว่าจะใช้โมดูล IISAdministrator Powershell ใหม่แทน ต่อไปนี้เป็นวิธีรับ SID ของกลุ่มแอปพลิเคชันที่แปลเป็นผู้ใช้เสมือนโดยใช้โมดูลใหม่:

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 ไม่สามารถทำให้ตัวอย่างอื่นทำงานได้:

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

สิ่งนี้ใช้ได้สำหรับฉันยกเว้นสิ่งหนึ่ง สิ่งนี้จะลบการอนุญาตอื่นทั้งหมด หากนี่ไม่ใช่สิ่งที่คุณต้องการแสดงความคิดเห็นบรรทัดนี้$acl.SetAccessRuleProtection($True, $False)เนื่องจากพารามิเตอร์ล่าสุดที่นี่คือ PreserveInheritance ขอบคุณสำหรับการโพสต์นี้!
Kurtis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.