Powershell을 통해 IIS APPPOOL \ * 계정에 대한 ACL 권한을 추가하려면 어떻게해야합니까?


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. AppPoolIdentities SID와 새로운 SID 객체를 생성하고 다음과 같이 NTAccount로 번역 : http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html , 당신은 할 수 있어야한다 다른 NTAccount 객체처럼 취급합니다. 실제 계정에 도메인 / 사용자 이름을 계속 전달하려면 사용자 이름이 "AweSomeAppPool"이고 도메인이 비어있는 경우 기본적으로 AppPool SID로 기본 설정되는 간단한 로직이 내장되어 있습니다.

  2. PowerShell을 사용하여 icacls.exe를 호출하고이를 사용하여 다음과 같이 원하는 권한을 부여하거나 취소하십시오 (먼저 일반적인 icacls 양식 명령 프롬프트, 파워 쉘, 차이점 확인).

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

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

두 번째 옵션을 선택하면 먼저 수동으로 테스트해야합니다.이 특정 예제를 직접 테스트 할 기회는 없었지만 작동해야합니다.


도와 주셔서 감사합니다. 그렇게하면 예외 호출이 발생합니다 AddAccessRule. "일부 또는 모든 ID 참조를 번역 할 수 없습니다." 어떤 아이디어가 있을까요?
bdukes

여기서 성취하려는 것을 이해하도록 도와주십시오. 문제는 ApplicationPoolIdentities가 "실제"NT 계정이 아니라 실제로 네트워크 서비스의 "가상 계정"표현과 비슷하다는 것입니다. 로컬 시스템 리소스 또는 네트워크 리소스에 대한 권한을 설정하지 않겠습니까? 당신의 필요에 따라, 다른 도전이 발생합니다 :-)
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: "일부 또는 모든 ID 참조를 번역 할 수 없습니다."
bdukes

입력 내용은 무엇입니까?
Haytham AbuelFutuh

Set-AclOnPath .\Website "IIS APPPOOL\website.dev"다시 시도하면 "이 워크 스테이션과 기본 도메인 간의 트러스트 관계가 실패했습니다."라는 다른 오류가 발생합니다.
bdukes

4

다음은 Windows 2012에서 IIS 사이트의 SID를 얻는 데 사용됩니다. WebAdministration powershell 모듈을 사용 하는 IIS 공급자 가 필요 하지만 이 기사에서는 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'인수와 함께 '' 호출 예외 : '일부 또는 모든 ID 참조를 번역 할 수 없습니다.'"
bdukes

@Mathias R. Jessen의 답변을 사용하여 SID를 실제 NTAccount작업 으로 변환합니다 .
bdukes

번역을 수행하기 위해 답변의 코드를 업데이트했습니다. 또한, 이것을 이용하려는 사람들을 위해 Import-Module WebAdministration, IIS 공급자로부터 IIS 드라이브를 얻기 위해 전화 하십시오.
bdukes

3

IIS 10 / Windows 10 / Server 2016부터는 WebAdministration 모듈이 더 이상 사용되지 않으며 대신 새로운 IISAdministration 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.