Powershellを介してIIS APPPOOL \ *アカウントのACL権限を追加するにはどうすればよいですか?


11

新しいWebサイトの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本物のドメインではないためだと思いますが、一種の偽アカウントの奇妙な接頭辞です。このアカウントを参照して、これを機能させるための正しい方法はありますか?

回答:


12

まず、ディレクトリパスが最初の位置引数であるため、次のようにSet-Aclを使用します。

Set-Acl $directory $acl

次に、引数を1つだけ持つユーザーオブジェクトを作成する必要があります。

$user = New-Object System.Security.Principal.NTAccount("$domain\\$username")

更新: "IIS APPPOOL \ AppPoolName"をNTAccount識別子として受け入れないようです。今、あなたがしようとしていることを達成するための2つの方法があります:

  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"

2番目のオプションを使用する場合は、最初に手動でテストしてください。これらの特定の例を自分でテストする機会はありませんでしたが、うまくいくはずです。


助けてくれてありがとう。そうすると、AddAccessRule「一部またはすべてのID参照を翻訳できませんでした。」という例外が発生します。何か考えはありますか?
bdukes

ここであなたが達成しようとしていることを私が理解できるようにしてください。問題は、ApplicationPoolIdentitiesが「実際の」NTアカウントではなく、実際にはネットワークサービスの「仮想アカウント」表現に似ていることです。ローカルシステムリソースまたはネットワークリソースにアクセス許可を設定したくないですか?必要に応じて、別の課題が発生します:-)
Mathias R. Jessen '27

ローカルシステムリソース。私が設定したローカル開発Webサイトの設定/リセット権限を合理化しようとしています。そのため、Webサイトパッケージをファイルシステムに解凍し、IISでセットアップしてから、このコマンドを実行してIISに変更のアクセス許可を付与します。または、サイトで権限の問題が発生しました。これを実行して、サイトの作成後に追加したものに変更権限があることを確認してください。
bdukes

便利なオプションがいくつか追加されました
Mathias R. Jessen '29

私は得ることができたicacls、助けてくれてありがとう私のために働いて素晴らしいです!私は、関数(上記と同じパラメータ)であることの身体になってしまったcmd /c icacls "$directory" /grant ("$domain\$username" + ':(OI)(CI)M') /t /c /q(と/t、ディレクトリに再帰的に仕事に/c何らかのエラーの後に続けるために、および/q各ファイルの抑止成功メッセージに)。
bdukes '29

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「一部またはすべてのID参照を翻訳できませんでした。」という例外が発生します。
bdukes 2012

あなたのインプットは何でしたか?
Haytham AbuelFutuh 2012

Set-AclOnPath .\Website "IIS APPPOOL\website.dev"、再試行すると、「このワークステーションとプライマリドメイン間の信頼関係に失敗しました」という別のエラーが表示されます。
bdukes 2012

4

以下は、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])

(Windows 8で)このアプローチを使用しようとしましたが、次のエラーが発生しました:「AddAccessRule'1'引数で' 'を呼び出す例外: '一部またはすべてのID参照を翻訳できませんでした。'」
bdukes

@Mathias R. Jessenの回答からのリンクを使用して、SIDを実際にNTAccount機能するものに変換します。
bdukes 2013

答えのコードを更新して翻訳を行いました。また、これを利用しようとする場合は、呼び出しImport-Module WebAdministrationてIISプロバイダーからIISドライブを取得します。
bdukes 2013

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

これは、1つの点を除いて私にとっても機能しました。これにより、他のすべての権限が削除されました。これが必要なものでない場合は、この行$acl.SetAccessRuleProtection($True, $False)をコメント化してください。最後のパラメーターはPreserveInheritanceです。これを投稿してくれてありがとう!
カーティス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.