ネットワーク経由でいくつかのファイルをコピーする必要があるサービスがあります。サービスはローカル管理者アカウントの1つで実行されています。
その管理者としてログインすると、ネットワークからProgram Files
の下の特定のフォルダーにファイルを手動でコピーできますが、ファイルを書き込むためのPermissionDenied例外がサービスに存在します。また、書き込み前にファイルがロックされていないことも確認できます。
エラーは次のとおりです。
パス「.../SomeAssembly.dll」へのアクセスが拒否されました。
サービスでこのようなエラーが発生するのはなぜですか?どうすれば修正できますか? (私もサービスを開発したので、アセンブリへの変更はテーブルにある可能性があります)。
また、System
で実行しようとしましたが、ネットワーク上のファイルを読み取ることができません(理由はわかりません)LocalService
およびNetworkService
アカウントAFAIKには十分な権限がありませんProgramFilesに変更を加えます...そうですか?
System
を使用できない理由は、そのアカウントが設計上ネットワークリソースにアクセスできないためです。これは、ローカルリソースにアクセスできないNETWORK SERVICE
でも同じことが起こります。管理者アカウントの問題は、Windowsがサービスによって実行されるときにファイルコピー操作をブロックしていることのようです。
何かアイデア????
まず、この属性がNTFSアクセス許可に取って代わることがあるので、ファイルのいずれかが「読み取り専用」としてマークされているかどうかを確認します。 「よろしいですか?」というプロンプトで[はい]をクリックした後、GUIでファイルをコピーできる場合がありますが、プログラムを使用してデータを書き込もうとすると、プロンプトが表示されず、すぐに失敗します。
また、サービスおよび関連サービスが実際にあなたが思っているアカウントで実行されていることを確認します。サービスAがサービスBを呼び出してタスクを実行し、その結果をサービスAに返してタスクを終了する場合があります。また、サービスAnのみが適切な権限を持つアカウントを使用している場合、試行は失敗します(AnがBを呼び出している場合でも、Anが使用しているのと同じユーザーとして強制的に実行することはないため、B自体が次のように構成されていない場合適切なユーザーを使用すると、必要な特定のスポットにアクセスできない可能性のあるデフォルトのユーザーが使用されます)
また、可能であれば、c:\program files\SomeAssembly.dll\somefile.txt
またはC:/users/don/app/SomeAssembly.dll
のようなパスとして使用しているパスでもエラーが発生する可能性があることを確認してください。
最後に、アプリケーションにリモートリソースから制限の少ないフォルダー(正しく呼び出した場合はApplication Data
)にファイルをコピーさせてから、System
の下で実行されているサービスを呼び出します。それらをProgram Files
にコピーします。
このアプローチの利点は、ネットワーク経由でファイルをローカルドライブにコピーするための管理者権限が必要ないことです(もちろん、ネットワークファイルに対する適切なread
権限がある場合)。また、プログラムファイルへの書き込みにSystem
に課せられた低い制限を利用します。