IIS新しいWebサイトのアカウントに変更権限を設定できるようにしたいのですが、次のスクリプトを使用しています。
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
_
次に、引数を1つだけ持つユーザーオブジェクトを作成する必要があります。
_$user = New-Object System.Security.Principal.NTAccount("$domain\\$username")
_
UPDATE: "IIS APPPOOL\AppPoolName"をNTAccount識別子として受け入れないようです。今、あなたがしようとしていることを達成するための2つの方法があります:
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番目のオプションを使用する場合は、まず手動でテストしてください。これらの特定の例を自分でテストする機会はありませんでしたが、うまくいくはずです。
このような何かはあなたのためのトリックをする必要があります。 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で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])
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])
次は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