2016-09-16 129 views
5

クリックワンインストールを使用して.netでC#wpfインストールが完了しました。すべて正常に動作します。それから私は、インストールされたプログラムの一部であり、次のコードを持っている:System.UnauthorizedAccessException:パス "..."へのアクセスが拒否されました

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

をしかし、私はこのエラーを取得する:

System.UnauthorizedAccessException: Access to the path C:\user\pc\appdata\local\apps\2.0....... is denied.

at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost) at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)

は、それがアクセス権のエラーですか私は私のコードで何かを微調整する必要がありますか?

私が困惑しているのは、ユーザーが何も問題なくそのディレクトリに一度クリックしてプログラムをインストールできるのですが、ファイルをアップロードすることができないのはなぜですか?

+0

対象となる環境はどれくらいありますか?それは企業組織または個人的な使用のためですか? –

+0

私のターゲットはもっと個人的な使い方ですが、エンタープライズでも可能です。 – user5313398

+1

アプリケーションフォルダにファイルをコピーしようとするのをやめ、ユーザーがあなたのアプリケーションを修理または再インストールするとそのフォルダを置き換えることができます。代わりに 'ApplicationData'を使用してください。 –

答えて

1

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

第2に、アプリケーションが通常はアプリケーション用にのみ読み込まれるため、アプリケーションが配備されているフォルダには書き込まないでください。 ApplicationDataまたはLocalApplicationData列挙型に書き込みたいと思うかもしれません。

+0

@jbアプリケーションがインストールされている場所にライセンスファイルをロードする必要がありますか?私はそれをどうやってできるの? – user5313398

+0

@ user5313398ユーザーが昇格した権限を持っていなければ、それはできません –

+0

しかし、なぜこれは他の多くのPCがこれを除いて動作していますか? – user5313398

1

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

あなたはおそらくそれを解決するでしょうが、テストとして(シフトを保持し、右クリックして、管理者として実行する)管理者権限でアプリケーションを試すことができますが、それを行うには理想的ではありません。あなたはより良い運を与える必要があります

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

または

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 

代わりに別のフォルダのようなものを試してみてください。サイドノートとして

- あなたは、コード内のパスを構築するのではなく、使用している場合(パスはすでに終わりに\を有していてもよい)、パスを使用することは通常方が良いの障害になりやすい

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

.Combine(..)

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

幸運!

+0

ライセンスファイルをアプリケーションのインストール先にロードする必要がありますか?私はそれをどうやってできるの? – user5313398

6

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

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

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

あなたは、私がHow do I force my .NET application to run as administrator?

+0

@VisualVicent私がClickonceを選んだのは、余分な権限設定が必要ないからです。それは私の問題を与えるこの特定のものを除いて、他の多くのPCでうまく動作します。私はあなたのリンクに従って、現在私は新しいマニフェストファイルと現在の設定を追加しましたこれはですので、これを user5313398

+0

@ user5313398:ClickOnceにはあまり慣れていませんが、ClickOnceと同じ権限で実行される可能性は非常に高いですインストーラ。それはあなたのアプリにどんな特権が必要かを誰が知っているのか、それはマイクロソフトにとって馬鹿馬鹿しいことだろうか? –

+0

@ user5313398:はい、既存の 'requestedExecutionLevel'タグを変更するだけです。 –

1

にもう少しを読むことができます:アプリケーションは常に、あなたのアプリのマニフェストファイルを変更し、requireAdministratorrequestedExecutionLevelタグのlevel属性を設定することができ、管理者権限を求めるようにするに

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

関連する問題