パスへのアクセスが拒否されました


164

私はこの質問がここで何度も尋ねられたことを知っていますが、私の問題の解決策を見つけることができません。私は.net c#のフォルダに画像を保存しようとしていますが、この例外が発生します:

Access to the path 'C:\inetpub\wwwroot\mysite\images\savehere' is denied.The error occured at mscorlib because    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode)

私は、このフォルダ(savehere)にフルコントロールを与えたnetwork serviceiis_iusrsさえへのフルコントロールを与え、everyoneそれでもこの例外を取得します。エクスプローラーとIISマネージャーを介してアクセスを許可しようとしたが、まだうまくいかない

Windows Server 2008 R2とIIS 7.5で実行しています。誰にアクセス権を与える必要がありますか?

ありがとう


アプリケーションからの相対パスを使用してみましたか?Windowsサーバーについてはよく知りませんが、 `C:`ルートパスへのアクセスが許可されていない可能性があります。
マイケルK

1
今後の読者:ファイルの権限を確認してください。
Ruskin

回答:


94

Webサイトのアプリケーションプールから、それが実行されているID(​​デフォルトではApplication Pool Identity)を確認し、適切な権限を付与する必要があります。


わかりました、ありがとう、私には5つのプールがあり、それらはすべてとしてのIDを持っApplicationPoolIdentityています。
ブルジュア

22
@Burjua- IIS APPPOOL\DefaultAppPoolユーザーを探します。IISの公式サイト(learn.iis.net/page.aspx/624/application-pool-identities)の
Oded

1
この記事で説明したように、私は追加DefaultAppPoolしてfull controlアクセス許可を与えましたが、それでも同じエラーが発生します
Burjua

2
私は手遅れであることを知っています。しかし、私は同じ問題に直面しています。OPはeveryone、フルコントロールを与えたと明確に述べていました。everyoneフルコントロールを許可する場合でも、DefaultAppPool?へのアクセスを許可する必要があります。ややこしい。
qurban

3
@stom-もちろん、それはベストプラクティスではありません。あなたはあらゆる種類の脆弱性に対してウェブサイトを開いています。ImagesWebサイトを実行しているユーザー/ IDに対するディレクトリへの読み取り/書き込み権限が必要なだけです(ホストプロバイダーに問い合わせる必要があります)。
2015年

223

パス「C:\ inetpub \ wwwroot \ mysite \ images \ savehere」へのアクセスが拒否されました

メッセージを注意深く読んでください。ディレクトリと同じ名前のファイルに保存しようとしています。これは機能しません。ファイルで満たされたディレクトリを1つの新しいファイルで上書きすることはできません。「パスへのアクセスが拒否された」とは、ファイルシステムがそれを阻止するために反撃することです。

例外メッセージは理想的ではありませんが、OSから直接送信され、それらは石にキャストされます。多くの場合、フレームワークはより適切なメッセージを生成するために追加のチェックを追加しますが、これはネットワークでのコストのかかるテストです。パフォーマンスも機能です。

「C:\ inetpub \ wwwroot \ mysite \ images \ savehere \ mumble.jpg」のような名前を使用する必要があります。パス名を確実に生成するには、Path.Combine()を検討してください。


19
@Hans Passant少し厳しい声明をありがとう。これにより、コードを調べたところ、同じエラーが発生したことがわかりました。
LosManos 2011

私にとっての問題は、ファイルが存在し、ユーザーがそれを置き換えることができなかったことでした
VinnyG

ハァッ!私はまったく同じことをしました。
jakejgordon 2013

多分、このスレッドは「私も!」から保護するためにロックする必要があります。答えます。私もですから!私の場合は、HttpPostedFileBaseオブジェクトのSaveAsメソッドがパスに加えて名前を必要とすることにイライラしていることを追加する必要があります。名前はオブジェクトの別のプロパティであるためです。もちろん、この方法で別の名前を付けることができると思います。
Ralph

1
ユニットテストでファイルを書き込もうとしているときにこのエラーが発生し(IISまたはWeb関連のものとは関係ありません)、エラーメッセージは非常にあいまいです。「\ path \ to \ fileをファイルとして開くことができません」という行の中に何故表示されていないのですか?
MarioDS 2016

22

サーバーでファイル(実際にはテンプレートからのコピーであるファイル)を作成しようとしたときに、同じ問題が発生していました。

完全なエラーメッセージは次のとおりです。

{ERROR} 08/07/2012 22:15:58 - System.UnauthorizedAccessException: Access to the path 'C:\inetpub\wwwroot\SAvE\Templates\Cover.pdf' is denied.

TemplatesIISアプリフォルダー内に新しいフォルダーを追加しました。私の場合、非常に重要なことの1つは、そのフォルダーのIUSRユーザーに書き込み(Gravar)権限を与える必要があることです。あなたも与える必要があるかもしれませんNetwork Serviceし、ASP.NET v$.#同じ書き込み権限。

ここに画像の説明を入力してください

これを実行した後、すべてが期待どおりに機能します。


12

私はまったく同じ問題を抱えていました。

解決策は、読み取り専用のテンプレートファイルからコピーされたため、アクセスしようとしたファイルが読み取り専用であったことです。

<facepalm />


Altova AltovaXML Application Class(DCOM)がこれを行っています。私に問題を引き起こしました。
マイクD

つまり、次の行のようなものを使用している必要があります。つまり、XSLTは読み取り専用であってはなりません。'FileStream ms = new FileStream(path、FileMode.Open、FileAccess.ReadWrite);'
マイクD

1
こちらも私からの<facepalm />です。ああ、..ありがとう、readonlyも私の問題でした。
カタリンRădoi

7

ファイル名を設定せずにファイルを保存しようとすると、この問題が発生しました。

古いコード

File.WriteAllBytes(@"E:\Folder", Convert.FromBase64String(Base64String));

作業コード

File.WriteAllBytes(@"E:\Folder\"+ fileName, Convert.FromBase64String(Base64String));

6

私の問題は、読み取りアクセスのみを要求する必要があることでした。

FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);

1
ビンゴ-これもちょっと私です!投稿ありがとうございます!
paulsm4

4

トラブルシューティングを行うには、実行中のWebアプリケーションのアプリケーションプールのIDを教えてください。ネットワークサービスをIDとして新しいアプリケーションプールを作成し、作成した新しいアプリケーションプールをWebアプリケーションで使用して、エラーが続くかどうかを確認してください。


4

次のヒント、このスレッドの元の質問に対する回答ではありませんが、このWebページにたどり着く他の一部のユーザーに役立つかもしれません。

ASP.Net FileUploadコントロールを取得して、そのファイルを「隠し共有」を含むネットワークアドレスにアップロードしようとしました。

\ MyNetworkServer \ c $ \ SomeDirectoryOrOther

理解できませんでした。Visual StudioのデバッグモードでWebページを実行した場合、問題なく動作します。しかし、プロジェクトがデプロイされ、アプリケーションプールユーザーを介して実行されていた場合、このネットワークディレクトリの検索は拒否されました。

私のIISサイトが実行されているユーザーを確認し、このユーザーに " MyNetworkServer "サーバー上のこのディレクトリへの完全なアクセス許可を与えたが、何も機能しなかった。

理由(もちろん!)は、これらの隠しドライブ共有を「見る」ことができるのは管理者だけだからです。

私の解決策は、単に「通常の」共有を作成することでした

\ MyNetworkServer \ SomeDirectoryOrOther

これにより、「パスへのアクセス...が拒否されました」というエラーがなくなりました。FileUploadはコマンドを正常に実行できました

fileUpload.SaveAs(networkFilename);

これが私がしたのと同じ間違いをする他の一部のユーザーに役立つことを願っています!

大きなファイル(4Mb以上)をアップロードする場合、IIS7ではweb.configファイルを2か所で変更する必要があることにも注意してください。このリンクをクリックして、必要な作業をお読みください: ASP.Netでの大きなファイルのアップロード


4

フォルダにIIS_IUSERSフルコントロールアクセス許可を追加してください。このオプションは、フォルダーのプロパティの[セキュリティ]タブにあります。 この画像でこのオプションとユーザーを見つけてください


悪いアドバイス。注意深く考慮せずにIIS_USERSに任意に「フルコントロール」を与えることは、「ナース-チェーンソー」と言うことと道徳的に同等です;)
paulsm4

4

私はこの設定で解決しました:

IIS>アプリケーションプール> [あなたのサイト]>詳細設定...> ID>ビルトインアカウンド> LocalSystem


2
これにより、WebサイトのLocalAdmin権限が付与されます。これはセキュリティ上の問題です。
Rich-Lang

1
LocalSystemアカウントでWebサイトを実行しないでください。これまで。限目。
Mihail Shishkov

@MihailShishkovなんで?
Mohammad Hossein Ganjyar

2
@MohammadHosseinGanjyar LocalSystemには、システムに対する管理者権限があります。そのアカウントでWebサイトを実行することにより、基本的にはシステム全体、そしておそらくサーバーが存在するローカルネットワーク全体のキーを提供します。これは、攻撃者がWebサイトを悪用する方法を見つけた場合、Webサイトとシステム全体がねじ込まれていることを意味します。それが、そもそも特権/権利とアカウントが存在する理由です。経験則として、これを覚えておいてください。ソフトウェアは、より大きな特権で実行してはいけません。たとえば、ブログサイトはD:ドライブをフォーマットする権利を必要としません
Mihail Shishkov

2

私の問題はそのようなものでした:

FileStream ms = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);

しかし、パスを使用する代わりに、File.FullNameを使用する必要があります...それが他の人を助けるかどうかはわかりませんが、このエラーが与えられた自分の経験を渡すだけです!


2
  1. 設定をビルトインアカウントからカスタムアカウントに変更し、他のサーバーのユーザー名とパスワードを入力します。

  2. 設定を(クラシックモードではなく)統合されたままにします。


1

多分それはあなたを助けるでしょう。

string tempDirectoryPath = @"C:\Users\HOPE\Desktop\Test Folder";
string zipFilePath = @"C:\Users\HOPE\Desktop\7za920.zip";
Directory.CreateDirectory(tempDirectoryPath);
ZipFile.ExtractToDirectory(zipFilePath, tempDirectoryPath);

0

ディレクトリをここに保存して仮想ディレクトリにし、コントロールパネルから読み取り/書き込み権限を付与します


ファイル名を指定して実行InetMgr.exeは、あなたのフォルダに移動savehereの下で個人用サイトそれがDefaultAppが配置されて左側になります(IISでWebアプリケーション/ Webサイト)、私はuは私が言っていました願っています
過酷なBaid

0

私が書き込もうとしていたファイルと同じ名前のディレクトリを持っていたので、人々もそれを探すことができます。


0

ローカルワークステーションで開発中にこの問題が発生しました。

iisreset呼び出しに失敗した後、マシンを再起動してこの状況を改善しました。

振り返ってみると、開いているファイルハンドルが問題を引き起こしている可能性があります。



0

同じ問題がありましたが、別の場所にファイルを保存し、ファイルをコピーして、希望する場所に貼り付けて修正しました。私は既存のファイルを置き換えるオプションを使用しましたが、それでうまくいきました。私はこれが最も効率的な方法ではないことを知っていますが、機能し、15秒未満かかります。


0

特にローカルで実行しているコードに関連して、これに多くの問題がありましたが、IISで実行する必要がある場合、このエラーがスローされていました。コードにチェックを追加し、最初の実行でアプリケーションにフォルダーを作成させると、フォルダーの承認を混乱させることなく問題が修正されることがわかりました。

フォルダを使用するメソッドを呼び出す前のこのようなもの

bool exists = System.IO.Directory.Exists("mypath");

        if (!exists)
            System.IO.Directory.CreateDirectory("mypath");

0

サブドメインにファイルをアップロードしているときにこのエラーが発生し、localhostで正常に機能する場合は、以下の手順に従ってください。

解決:

Pleskパネル

  • Pleskパネルにログインします。エラーが発生しているサブドメインを選択します。
  • [ ホスティング設定]をクリックします
  • [ 追加の書き込み/変更権限]を選択して、[ 適用]をクリックします。

CPanel

  • CPanelで利用可能なオプションについてはわかりません。しかし、ディレクトリに許可を与えると(CPanelでは777、755のような10進数でなければなりません)エラーが解決します。

詳細はこちらをご覧ください

エラーの理由:

  • FileUpload.SaveAs(Server.MapPath("~/uploads/" + *YOUR_FILENAME*))ファイルをアップロードパスに移動するためのコードであるとしましょう。
  • Server.MapPathディレクトリの物理パス(実パス)を提供します。ただし、サブドメインに物理パスにアクセスする権限がない可能性があります。

  • したがって、サブドメインに書き込み/変更権限へのアクセスを許可すると、問題が解決します。


0

プロジェクトのWebプロパティがIIS Expressに切り替わっていないかどうかを確認して、IISローカルに戻すことができます。


0

ターゲットSystem.IO.Delete(string file)が存在するファイルであることを確認してください。多分あなたのコードに間違いがある;あなたが正しいファイル名をメソッドに渡さない、またはターゲットがフォルダであるように。これらの場合、「パスへのアクセスが拒否されました」というエラーが表示されます。


-1

私は完全な権限で仮想ディレクトリを作成し、そこにffmpegソースとビデオファイルを追加しました。それで、だれでもアクセスできるので、最終的にそれは理にかなっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.