私はSQL仕事のステップとして実行したいのjarファイルを持っています。 ただし、jarファイルはmachineAで実行する必要がありますが、SQLジョブはserverAにスケジュールされています。「WMICを... 『のjava -jar ...』」
これを可能にするために、serverAのSQLジョブでは、xp_cmdshell
を使用して、端末にwmic
コマンドを発行します。
xp_cmdshell
wmic
が(このケースでのjava -jarコマンド)以下
を機に、端末のコマンドを発行するために私を許可するT-SQLスクリプトからターミナルコマンドを発行するために私を許可するコマンドがあります私はsaveToSharedFolder.jarは、このexは保存し、データベースからデータを抽出し、Excelファイルに書き込むJavaアプリケーションです
EXEC master..xp_cmdshell 'wmic /user:mydomain\myuser /password:mypassword /node:machineA process call create "cmd /c java -jar D:\jars\saveToSharedFolder.jar"'
を使用しますcelファイルをサーバー内にある共有フォルダ(\ serverA \ files \ savedData.xlsx)にコピーします。
ファイルsavedData.xlsxが\ serverA \ filesに保存されていません。
私はファイルにjavaエラーメッセージを出力しようとしましたが、私はこれを持っています。
java.io.FileNotFoundException: \\serverA\files\savedData.xlsx (Access is denied)
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : null
at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:602)
at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1557)
at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:248)
at saveToSharedFolder.saveData(saveToSharedFolder.java:115)
at saveToSharedFolder.main(saveToSharedFolder.java:46)
... 5 more
Caused by: java.lang.NullPointerException
at java.util.zip.DeflaterOutputStream.<init>(Unknown Source)
at java.util.zip.DeflaterOutputStream.<init>(Unknown Source)
at java.util.zip.ZipOutputStream.<init>(Unknown Source)
at java.util.zip.ZipOutputStream.<init>(Unknown Source)
at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:531)
... 9 more
私はそれがフォルダのアクセス許可の問題である知っています。しかし、私は、どのアカウントを私がフォルダへの書き込み許可を与えるべきかに関してかなり迷っています。
私はWMICコマンドで使用mydomain\myuse
rとmypassword
を使用してマシンAでログインし、マシンAでjarファイルを実行しようとすると、それが正常に\サーバA \ファイルが保存されます\ savedData.xlsx
私も試してみましたEXEC master..xp_cmdshell 'whoami'
を実行すると、nt service
アカウントを取得できます。これは、アカウントを右に実行するアカウントですか?しかし、それはまだ\サーバA \ファイルを作成しません\ savedData.xlsx
それは私がmydomain\myuser
とmypassword
を使用してWMICを開始しましたので、jarファイルがMYUSERの資格情報を使用して実行し、これのことができるようにすべきではない、しかしかなり奇妙です\ serverA \ files \ savedData.xlsxを作成しますか?
こんにちは@Dan Guzmanさん、ありがとうございました。 serverAのローカル管理者アカウントのプロキシを作成しようとしました。 wmicコマンドを実行するcmdexecジョブも作成しました。私はすでに、cmdexecジョブである1つのステップしか含まないテストSQLジョブでテストしました。ただし、ステップ1をt-sqlスクリプトとして、ステップ2をcmdexecとしてSQLジョブを編集しようとすると、Transact-SQLサブシステムではプロキシアカウントが許可されません。 (Microsoft SQL Server、Error:14517)**エラー – Krish
@Krishでは、T-SQLの手順にプロキシアカウントを指定する必要はありません。 SSMS UIを使用している場合は、T-SQLジョブステップタイプのオプションではないはずです。 sysadminロールメンバーが所有するジョブの場合、T-SQLジョブステップはSQL Agentサービスアカウントで実行されます。非sysadmin所有ジョブの場合、T-SQLステップはジョブ所有者のセキュリティコンテキストで実行されます。 CmdExecとT-SQLのステップセキュリティコンテキストは独立しています。 –
あなたは正しいです。 t-sqlスクリプトとしてstep1を使用して新しいジョブを作成し、ステップ2をcmdexecジョブとして作成すると、そのエラーは表示されませんでした。前回の仕事ではcmdexecの仕事のタイプが1ステップしかなかったからだと思った。次に、その手順をt-sqlスクリプトに変更し、step2(cmdexec)を追加しました。私はそれが不一致が始まった場所だと思う。 – Krish