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

bdu*_*kes 13 iis powershell iis-7 asp.net access-control-list

我希望能够为新网站设置 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
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,出现如下错误:

Set-Acl : 此工作站与主域之间的信任关系失败。

我认为这是因为IIS APPPOOL它不是一个真正的域,而是一个假帐户上的奇怪前缀。是否有正确的方法来引用该帐户,以便我可以完成这项工作?

Mat*_*sen 13

首先,像这样使用 Set-Acl,因为目录路径是第一个位置参数:

Set-Acl $directory $acl
Run Code Online (Sandbox Code Playgroud)

其次,您应该创建只有一个参数的用户对象:

$user = New-Object System.Security.Principal.NTAccount("$domain\\$username")
Run Code Online (Sandbox Code Playgroud)

更新:似乎它不会接受“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"

如果您选择第二个选项,请务必先手动测试它们,我自己还没有机会测试这些特定示例,但它应该可以工作


Jus*_*ing 5

以下工作在 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])
Run Code Online (Sandbox Code Playgroud)