如何通过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它不是真实域名,而是假冒账户上的一个奇怪的前缀。有没有正确的方法来引用该帐户,以便我可以进行此工作?

Answers:


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对象一样对待它。如果您仍然希望能够为真实帐户传递域/用户名,则以一些简单的逻辑为内置实例,该逻辑默认为AppPool SID(如果用户名为“ AweSomeAppPool”且域为空),例如。

  2. 使用PowerShell调用icacls.exe,并使用它来授予/撤消您想要的任何权限,如下所示(首先是普通的icacls form命令提示符,然后是powershell,注意区别):

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

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

如果您选择第二种方法,请务必先手动进行测试,但我自己没有机会测试这些具体示例,但是应该可以


谢谢您的帮助。这样做,我得到一个异常调用AddAccessRule:“某些或所有身份引用无法翻译。” 任何想法可能是什么?
bdukes

尝试帮助我了解您在这里想要完成的工作。事实是,ApplicationPoolIdentities不是“真实” NT帐户,它们实际上更像是网络服务的“虚拟帐户”表示形式。您是否要在本地系统资源或网络资源上设置权限?根据您的需要,会出现不同的挑战:-)
Mathias R. Jessen

本地系统资源。我正在尝试简化设置的本地开发网站的设置/重置权限。因此,我将网站程序包解压缩到文件系统,在IIS中进行设置,然后运行此命令以授予IIS修改权限。或者,在站点中遇到权限问题,请运行此命令以确保在创建站点后我添加的内容具有修改权限。
bdukes 2011年

刚刚为您添加了一些希望有用的选项
Mathias R. Jessen

icacls感谢我的帮助,我能够为自己做得很好!最后,我得到了函数的主体(与上面的参数相同)cmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q/t用于在目录上递归工作,/c以继续处理任何错误,并/q抑制每个文件的成功消息)。
bdukes 2011年

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:“某些或所有标识引用无法翻译。”
bdukes 2012年

您输入了什么?
Haytham AbuelFutuh 2012年

Set-AclOnPath .\Website "IIS APPPOOL\website.dev",但是当我再次尝试时,出现另一个错误,“此工作站与主域之间的信任关系失败。”
bdukes 2012年

4

以下内容在Windows 2012中适用于获取IIS站点的SID。它需要使用WebAdministration powershell模块的IIS Provider,但是本文指出它将在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'参数调用' '的异常:'某些或所有身份引用无法翻译。'”
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.