2

データベースのバックアップを圧縮するSQLServerエージェントジョブを実行しています。私が実行するアプリケーションは、データベースのパスを引数として受け取るC#Windowsアプリケーションです。アプリケーションフォームをコマンドプロンプトから実行すると、すべて正常に機能します。ただし、オペレーティングシステム(CmdExec)をタイプとして使用してSQL Serverジョブ内から実行すると、次のエラーが発生します。

「システムは指定されたファイルを見つけることができません」</p>

ジョブ内で、コマンドとして次のものがあります。

D:\ DatabaseBackups \ DatabaseBackupManager.exe D:\ DatabaseBackups \ SubDit \ Database.bak

DatabaseBackupsフォルダーでSQLServerエージェントアカウントに特定のディレクトリアクセス許可を設定しようとしましたが、それでも同じエラーが発生します。

グーグルはうまくいったものを何も投げず、私を夢中にさせ始めているので、誰かがこれに光を当てることができますか?

ありがとう

4

3 に答える 3

1

D:ドライブは、マップされたドライブではなく、ローカルドライブとして存在する必要があります。(私が知らないログオンしていない他のユーザーのためにそれを強制的にマップする方法がない限り)

また、権限に関しては、エージェントが実行されているアカウントに関連するものであれば何でもかまいません。

プロセスを開始していると仮定して、C#プロセスにログを記録する必要がある場合があります。プロセスが開始されていない場合は、ディレクトリまたは.NETFramework設定に関連するそのアカウントのアクセス許可である可能性があります。

また、Windowsを使用して障害を監査し、開こうとしているファイルを確認することもできます。

エージェントアカウントを管理者グループに一時的に追加して機能する場合、これは、「システムが指定されたファイルを見つけることができません」というあまり役に立たないエラーの原因であるアクセス許可を示しています。

于 2009-06-07T03:01:20.863 に答える
1

助けてくれてありがとう。私はあなたが提案したすべてを試しましたが、バックアップを圧縮するために使用していた7za.exeのC:\ Windows\System32フォルダーを探していたことがわかりました。アプリケーションが実行されているのと同じディレクトリから呼び出されているかのように、exeを参照していました。

再度、感謝します

于 2009-06-09T13:30:46.470 に答える
0

まず、.exeがSQLによって実際に検出されていることを確認します。その場合、次に行うことは、DatabaseBackupManager.exeにロジックを配置して、スレッドがそのファイルに持っているACLを収集することです(例:DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);)。ほとんどの場合、SQLはプロセスの起動時にACLをトリミングしています。その場合、そのファイルにアクセスするためにそのスレッドを偽装する必要がある場合があります。あるいは、そのプロセスに%temp%などへのr/wアクセスが許可されている場所を確認する必要があります。

于 2009-06-06T18:48:23.760 に答える