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

如何通过 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不是一个真正的域名,而是一个类似假账户的奇怪前缀。有没有正确的方式来引用该账户,以便我可以让它工作?

答案1

首先,像这样使用 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"

如果你选择第二种方法,请务必先手动测试它们,我还没有机会亲自测试这些具体的例子,但它应该可以工作

答案2

在 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])

答案3

类似这样的方法应该可以帮到你。它应该也能解决 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

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

相关内容