OK。ここでは、Classic ASP website at IIS 7.5 in Windows Server 2008 R2をセットアップします。Webサイトのルートの下にdbcという名前のフォルダがあり、すべてのページが処理されている間、特定の情報を読み書きするために使用されるファイルがあります。
問題は、IUSR書き込みアクセス許可、IIS_IUSRS書き込みアクセス許可、またはDefaultAppPool書き込みアクセス許可を付与すると、「パス 'E:...\websiteroot\dbc\filename.txt'へのアクセスが拒否されました」を取得することです。
しかし、そのdbcフォルダーに対するすべてのユーザーに書き込みアクセスを許可すると、エラーは発生しませんが、すべてが完璧に見えます。
詳細情報:Webサイトはクラシックパイプラインモードで実行され、匿名認証が有効になっています(おそらく唯一の認証が有効になっています)。そして、IUSRアカウントとアプリケーションプールIDを使用して匿名認証を試しました。私の場合、ApplicationPoolIdentityはWebサイトの認証のIDです。ファイルI/OにはCOM +を使用します。そして、Classic ASP Server.CreateObjectからオブジェクトをインスタンス化します。COM+はネットワークサービスとして実行されます。
考え?すべての人に書き込み権限を付与したくない。何か不足していますか?
解決しよう:これが私がしたことです。
CipherDemoという名前のWebサイトは、IIS 7.5のAppPoolIdentityの下で実行されていました。IdentityIIS AppPool\CipherDemoで見つけることができます。ICRWを使用してRWアクセス許可を付与しましたそのフォルダに。
そして、実際にファイルI/Oを行っていたCOM +は、ネットワークサービスIDで実行されていました。プロセスモニターを使用してアクセス拒否エラーをトレースしていたところ、ネットワークサービスにはそのフォルダーに対する読み取りアクセス許可しかありませんでした。
ICACLS "フォルダ名"/grant:r "NT AUTHORITY\NETWORKSERVICE" :( OI)(CI)RXW/Tを使用して、そのフォルダへの書き込みアクセスを許可しました。
そしてそれを解決しました。
私はWebサイトがCipherDemo Identityとして実行されるため、これがCOM +経由でファイルにアクセスするために使用されるアカウントになると考えていました。しかし、COM +が独自のID境界で機能することを確認するのは恥ずかしいことです。
IIS 7.5(およびオプションでIIS 7)では)すべてのワーカーはアプリケーションプールIDで実行されます:ユーザー "IIS AppPool * PoolName *"。
Everyoneではなく、そのユーザーにアクセス権を付与します(ID選択ダイアログに名前を入力する必要があります。検索機能には表示されません)。
iis.net には非常に役立つページがあり、より詳細に説明されています。
また、注意:IIS7(Server 2008)の下:
icacls.exe
)。最後に、SQL ServerのID選択はアプリプールIDについても認識しません。最初にCREATE LOGIN
およびCREATE USER
を使用します。その後、GUIを使用してロールなどを付与できます。
NTFS GUIから直接入力して、アカウントを追加できます。名前はIIS APPPOOL\<<app pool name>>
の形式です。 IIS APPPOOL\DefaultAppPool
。 (これを参照してください Microsoftサポート記事 )
別の解決策:「ネットワークサービス」アカウントをアプリケーションプールユーザーとして使用して、書き込み権限を付与しています。
特定のユーザーにフォルダーの書き込み権限のみを付与する場合は、サイトの「匿名ユーザーID」を「アプリケーションプールID」ではなく「特定のユーザー」に変更する必要があります。