web-dev-qa-db-ja.com

ローカル管理者アカウントでサービスのアクセスが拒否されました

ネットワーク経由でいくつかのファイルをコピーする必要があるサービスがあります。サービスはローカル管理者アカウントの1つで実行されています。

その管理者としてログインすると、ネットワークからProgram Filesの下の特定のフォルダーにファイルを手動でコピーできますが、ファイルを書き込むためのPermissionDenied例外がサービスに存在します。また、書き込み前にファイルがロックされていないことも確認できます。

エラーは次のとおりです。

パス「.../SomeAssembly.dll」へのアクセスが拒否されました。

サービスでこのようなエラーが発生するのはなぜですか?どうすれば修正できますか? (私もサービスを開発したので、アセンブリへの変更はテーブルにある可能性があります)。


更新

また、Systemで実行しようとしましたが、ネットワーク上のファイルを読み取ることができません(理由はわかりません)LocalServiceおよびNetworkServiceアカウントAFAIKには十分な権限がありませんProgramFilesに変更を加えます...そうですか?


アップデート2

Systemを使用できない理由は、そのアカウントが設計上ネットワークリソースにアクセスできないためです。これは、ローカルリソースにアクセスできないNETWORK SERVICEでも同じことが起こります。管理者アカウントの問題は、Windowsがサービスによって実行されるときにファイルコピー操作をブロックしていることのようです。

何かアイデア????

5
PedroC88

まず、この属性がNTFSアクセス許可に取って代わることがあるので、ファイルのいずれかが「読み取り専用」としてマークされているかどうかを確認します。 「よろしいですか?」というプロンプトで[はい]をクリックした後、GUIでファイルをコピーできる場合がありますが、プログラムを使用してデータを書き込もうとすると、プロンプトが表示されず、すぐに失敗します。

また、サービスおよび関連サービスが実際にあなたが思っているアカウントで実行されていることを確認します。サービスAがサービスBを呼び出してタスクを実行し、その結果をサービスAに返してタスクを終了する場合があります。また、サービスAnのみが適切な権限を持つアカウントを使用している場合、試行は失敗します(AnがBを呼び出している場合でも、Anが使用しているのと同じユーザーとして強制的に実行することはないため、B自体が次のように構成されていない場合適切なユーザーを使用すると、必要な特定のスポットにアクセスできない可能性のあるデフォルトのユーザーが使用されます)

また、可能であれば、c:\program files\SomeAssembly.dll\somefile.txtまたはC:/users/don/app/SomeAssembly.dllのようなパスとして使用しているパスでもエラーが発生する可能性があることを確認してください。

1
Kit Ramos

最後に、アプリケーションにリモートリソースから制限の少ないフォルダー(正しく呼び出した場合はApplication Data)にファイルをコピーさせてから、Systemの下で実行されているサービスを呼び出します。それらをProgram Filesにコピーします。

このアプローチの利点は、ネットワーク経由でファイルをローカルドライブにコピーするための管理者権限が必要ないことです(もちろん、ネットワークファイルに対する適切なread権限がある場合)。また、プログラムファイルへの書き込みにSystemに課せられた低い制限を利用します。

0
PedroC88