web-dev-qa-db-ja.com

System.UnauthorizedAccessException:パス「...」へのアクセスが拒否されました

クリック1回インストールを使用して.netでC#wpfインストールを実行しました。すべて正常に動作します。次に、インストールされたプログラムの一部である次のコードがあります:

String destinationPath = System.Windows.Forms.Application.StartupPath + "\\" + fileName;
File.Copy(path, destinationPath, true);
this.DialogResult = true;
this.Close();

しかし、私はこのエラーを受け取ります:

System.UnauthorizedAccessException:パスC:\ user\pc\appdata\local\apps\2.0 .......へのアクセスは拒否されます。

system.IO.File.InternalCopy(String sourceFileName、String destFileName、Boolean overwrite、Boolean checkHost)でSystem.IO.File.Copy(String sourceFileName、String destFileName、Boolean overwrite)

それは許可エラーですか、コードで何かを微調整する必要がありますか?

ユーザーが問題なくそのディレクトリに1回クリックするだけでプログラムをインストールできるのに、ファイルをアップロードしても機能しないのはなぜですか?

7
user5313398

アプリケーションをインストールするとき、インストーラは通常管理者権限を求めます。ユーザーが「はい」を選択すると、プログラムが実行され、通常のユーザーよりもさまざまなパスへの読み取りおよび書き込みアクセスが許可されます。インストーラーが管理者特権を要求しなかった場合は、ClickOnceが何らかの昇格された特権の下で自動的に実行されるだけの可能性があります。

代わりにローカルappdataフォルダーに書き込むことをお勧めしますが、アプリケーションとまったく同じディレクトリに書き込みたい場合は、最初に管理者権限でアプリを実行する必要があります。

アプリケーションが常に管理者権限を要求するようにするには、アプリのマニフェストファイルを変更し、requestedExecutionLevelタグのlevel属性をrequireAdministratorに設定します。

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

管理者として.NETアプリケーションを強制的に実行するにはどうすればよいですか?

8
Visual Vincent

ファイルを生成するプログラムを実行していました。宛先フォルダーは読み取り専用でした。そして、エラーでクラッシュします。フォルダプロパティを使用して読み取り専用属性を削除すると、エラーが解決しました。お役に立てれば。

2
Ziaullah Khan

Windows 8(または7)以降では、%appdata%へのアクセスはデフォルトで制限されていると思います。 ClickOnceを介してアプリをインストールすると、おそらくこのコンピューターを変更する許可を与えるように求められます-そうですか?

テストとして管理者権限でアプリを実行してみることができます(Shiftキーを押しながら、.exeを右クリックし、管理者として実行します)。

代わりに、次のような別のフォルダーを試してください。

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

または

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments )

幸運が得られるはずです。

サイドノートとして-使用するのではなく、コードでパスを構築する場合

path + "\\" + path + "\\" + filename 

これは失敗する傾向があります(パスの最後に\が既にある場合があります)。通常はPath.Combine(..)を使用することをお勧めします。

String destinationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName);

幸運を!

1
jb.

まず、データを書き込む必要がある場合は、Environment.SpecialFolder列挙。

第二に、アプリケーションは通常アプリケーションに対してのみ読み取られるため、アプリケーションがデプロイされているフォルダーには書き込まないでください。おそらく、ApplicationDataまたはLocalApplicationData列挙に書き込みたいと思うでしょう。

1
Justin Loveless