Làm cách nào tôi có thể thêm quyền ACL cho tài khoản IIS APPPOOL \ * qua Powershell?


11

Tôi muốn có thể đặt tài khoản IIS cho các trang web mới để có quyền sửa đổi. Tôi có đoạn script sau:

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
}

Tuy nhiên, khi tôi chạy nó, tôi gặp lỗi như thế này:

Set-Acl: Mối quan hệ tin cậy giữa máy trạm này và miền chính không thành công.

Tôi nghĩ rằng điều này là do IIS APPPOOLkhông phải là một tên miền thực, nhưng là một tiền tố kỳ lạ trên một tài khoản giả mạo. Có cách nào chính xác để tham khảo tài khoản đó để tôi có thể thực hiện công việc này không?

Câu trả lời:


12

Trước hết, sử dụng Set-Acl như thế này, vì đường dẫn thư mục là đối số vị trí đầu tiên:

Set-Acl $directory $acl

Thứ hai, bạn nên tạo đối tượng người dùng chỉ với một đối số:

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

CẬP NHẬT: Có vẻ như nó sẽ không chấp nhận "IIS APPPOOL \ AppPoolName" làm định danh NTAccount. Bây giờ, có hai cách để thực hiện những gì bạn đang cố gắng làm:

  1. Tạo một đối tượng SID mới với AppPoolIdentities SID và dịch nó thành NTAccount, như thế này: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html , và bạn sẽ có thể để đối xử với nó như bất kỳ đối tượng NTAccount nào khác. Nếu bạn vẫn muốn có thể chuyển tên miền / tên người dùng cho tài khoản thực, hãy xây dựng một số logic đơn giản mặc định cho AppPool SID nếu tên người dùng là "AweSomeAppPool" và tên miền trống, chỉ là một ví dụ.

  2. Sử dụng PowerShell để gọi icacls.exe và sử dụng nó để cấp / thu hồi bất kỳ quyền nào bạn muốn, như thế này (dấu nhắc lệnh dạng icacls bình thường đầu tiên, sau đó powershell, nhận thấy sự khác biệt):

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

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

Nếu bạn chọn tùy chọn thứ hai, hãy chắc chắn kiểm tra chúng theo cách thủ công trước, tôi đã không có cơ hội tự kiểm tra các ví dụ cụ thể này, nhưng nó sẽ hoạt động


Cảm ơn đã giúp đỡ. Làm điều đó, tôi nhận được một cuộc gọi ngoại lệ AddAccessRule: "Không thể dịch một số hoặc tất cả các tham chiếu danh tính." Bất kỳ ý tưởng đó có thể là gì?
bdukes

Hãy cố gắng giúp tôi hiểu những gì bạn đang cố gắng thực hiện ở đây. Vấn đề là, ApplicationPoolIdentities không phải là Tài khoản NT "thực", chúng giống như một đại diện "tài khoản ảo" của DỊCH VỤ MẠNG trên thực tế. Bạn có muốn đặt quyền đối với tài nguyên hệ thống cục bộ hoặc tài nguyên được nối mạng không? Tùy thuộc vào nhu cầu của bạn, một thách thức khác sẽ xuất hiện :-)
Mathias R. Jessen

Tài nguyên hệ thống địa phương. Tôi đang cố gắng hợp lý hóa cài đặt / đặt lại quyền cho các trang web phát triển cục bộ mà tôi thiết lập. Vì vậy, tôi đã giải nén gói trang web vào hệ thống tệp, thiết lập gói đó trong IIS, sau đó chạy lệnh này để cấp quyền sửa đổi IIS. Hoặc, gặp vấn đề về quyền trong trang web, hãy chạy vấn đề này để đảm bảo một cái gì đó tôi đã thêm sau khi trang web được tạo có sửa đổi quyền.
bdukes

Chỉ cần thêm một số tùy chọn hữu ích cho bạn
Mathias R. Jessen

Tôi đã có thể icaclslàm việc tuyệt vời cho tôi, nhờ sự giúp đỡ! Tôi đã kết thúc với phần thân của hàm (cùng tham số như trên) cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q( /tđể làm việc đệ quy trên thư mục, /cđể tiếp tục theo dõi bất kỳ lỗi nào và /qđể chặn các thông báo thành công cho mỗi tệp).
bdukes

4

Một cái gì đó như thế này sẽ làm cho các mẹo cho bạn. Nó cũng có thể giải quyết IIS APPPOOl \ Mọi thứ ...

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
}

Tôi nhận được một cuộc gọi ngoại lệ SetAccessRule: "Không thể dịch một số hoặc tất cả các tham chiếu danh tính."
bdukes

Đầu vào của bạn là gì?
Haytham AbuelFutuh

Set-AclOnPath .\Website "IIS APPPOOL\website.dev", mặc dù khi tôi thử lại, tôi gặp một lỗi khác, "Mối quan hệ tin cậy giữa máy trạm này và miền chính không thành công."
bdukes

4

Các hoạt động sau đây trong Windows 2012 để lấy SID cho trang IIS. Nó yêu cầu Nhà cung cấp IIS sử dụng mô-đun powershell WebAd dùng, nhưng bài viết này cho biết nó sẽ hoạt động trên 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])

Tôi đã thử sử dụng phương pháp này (trên Windows 8), nhưng đã gặp lỗi này: "Cuộc gọi ngoại lệ ' AddAccessRule' với (1) đối số: 'Một số hoặc tất cả các tham chiếu danh tính không thể dịch được.'"
bdukes

Sử dụng liên kết từ câu trả lời của @Mathias R. Jessen để dịch SID thành một tác phẩm thực sự NTAccount.
bdukes

Tôi đã cập nhật mã trong câu trả lời để thực hiện bản dịch. Ngoài ra, đối với những người cố gắng tận dụng lợi thế này, hãy gọi Import-Module WebAdministrationđể lấy ổ IIS từ nhà cung cấp IIS.
bdukes

3

Kể từ IIS 10 / Windows 10 / Server 2016, mô-đun WebAd dùng không được chấp nhận và chúng tôi dự kiến ​​sẽ sử dụng mô-đun Powershell IISAd dùng mới thay thế. Dưới đây là cách tải nhóm ứng dụng SID được dịch sang người dùng ảo bằng mô-đun mới:

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

Những điều sau đây làm việc cho tôi trong Windows 2012, không thể có các ví dụ khác hoạt động:

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

Điều này cũng làm việc cho tôi ngoại trừ một điều. Điều này loại bỏ TẤT CẢ các quyền khác. Nếu đây không phải là điều bạn muốn, hãy bình luận dòng này $acl.SetAccessRuleProtection($True, $False)vì thông số cuối cùng ở đây là PreserveInherribution. Cảm ơn bạn đã đăng bài này!
Kurtis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.