Я хочу иметь возможность настроить учетную запись 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
не настоящий домен, а странный префикс в поддельной учетной записи. Есть ли правильный способ обратиться к этой учетной записи, чтобы я мог выполнить эту работу?
Прежде всего, используйте Set-Acl следующим образом, так как путь к каталогу является первым позиционным аргументом:
Set-Acl $directory $acl
Во-вторых, вы должны создать объект пользователя только с одним аргументом:
$user = New-Object System.Security.Principal.NTAccount("$domain\\$username")
ОБНОВИТЬ: Похоже, он не примет «IIS APPPOOL \ AppPoolName» в качестве идентификатора NTAccount. Теперь есть два способа выполнить то, что вы пытаетесь сделать:
Создайте новый объект SID с идентификатором AppPoolIdentities и преобразуйте его в NTAccount, например: http://iformattable.blogspot.com/2007/12/convert-sid-to-ntaccount-with.html, и вы сможете обращаться с ним как с любым другим объектом NTAccount. Если вы все еще хотите иметь возможность передавать домены / имена пользователей для реальных учетных записей, используйте некоторую простую логику, которая по умолчанию использует SID AppPool, если имя пользователя - «AweSomeAppPool», а домен пуст, как пример.
Используйте 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"
Если вы выберете второй вариант, обязательно сначала протестируйте их вручную, у меня не было возможности протестировать эти конкретные примеры, но он должен работать.
Следующее работает в Windows 2012, чтобы получить SID для сайта IIS. Это требует Провайдер IIS который использует модуль PowerShell WebAdministration, но Эта статья указывает, что он будет работать в 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])
Что-то вроде этого должно помочь вам. Он также должен иметь возможность разрешить 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
}
В 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
Начиная с 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])