我希望能够为新网站设置 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 标识符。现在,有两种方法可以完成您要执行的操作:
使用 AppPoolIdentities SID 创建一个新的 SID 对象并将其转换为 NTAccount,如下所示:http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html,并且您应该能够像对待任何其他 NTAccount 对象一样对待它。如果您仍然希望能够为真实帐户传递域/用户名,则内置一些简单的逻辑,如果用户名是“AweSomeAppPool”且域为空,则默认为 AppPool SID,这只是一个例子。
使用 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