题 如何通过Powershell为IIS APPPOOL \ *帐户添加ACL权限?


我希望能够为新网站设置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 不是一个真正的域名,但在一个假的帐户上是一个奇怪的前缀。有没有正确的方法来引用该帐户,以便我可以使这项工作?


9
2017-08-19 16:32






答案:


首先,像这样使用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表单命令提示符,然后是powershell,注意区别):

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

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

如果你选择第二个选项,一定要先手动测试,我自己没有机会测试这些具体的例子,但它应该工作


9
2017-12-25 15:29



谢谢您的帮助。这样做,我得到一个异常调用 AddAccessRule:“部分或全部身份引用无法翻译。”任何想法可能是什么? - 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


像这样的东西应该为你做的伎俩。它应该能够解析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
}

4
2017-09-19 00:32



我接到一个异常电话 SetAccessRule:“部分或全部身份引用无法翻译。” - bdukes
你有什么投入? - Haytham AbuelFutuh
Set-AclOnPath .\Website "IIS APPPOOL\website.dev"虽然当我再次尝试时,我得到一个不同的错误,“这个工作站和主域之间的信任关系失败了。” - bdukes


以下适用于Windows 2012以获取IIS站点的SID。它需要 IIS提供程序 它使用WebAdministration powershell模块,但是 本文 表明它可以在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])

4
2017-08-05 16:33



我尝试使用这种方法(在Windows 8上),但得到了这个错误:“异常调用”AddAccessRule'with'1'参数:'部分或全部身份引用无法翻译。'“ - bdukes
使用@Mathias R. Jessen的答案将SID翻译成真实的 NTAccount 工作。 - bdukes
我已经更新了答案中的代码来进行翻译。此外,对于那些试图利用这一点的人,请致电 Import-Module WebAdministration 从IIS提供程序获取IIS驱动器。 - bdukes


从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
2017-12-13 20:39





以下在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

0
2017-09-07 08:51