2016-11-15 6 views
1

私は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\myusermypasswordを使用してWMICを開始しましたので、jarファイルがMYUSERの資格情報を使用して実行し、これのことができるようにすべきではない、しかしかなり奇妙です\ serverA \ files \ savedData.xlsxを作成しますか?

答えて

0

xp_cmdshellは、呼び出し元のログインがsysadminロールのメンバである場合、SQL Serverサービスアカウントのセキュリティコンテキストで実行されます。非sysadminロールメンバーの場合、xp_cmdshellはxp_cmdshell proxy accountのセキュリティコンテキストで実行されます。

T-SQLを使用してプロセスを呼び出す理由がわかりません。代わりに、CmdExecジョブステップタイプを使用してコマンドを直接実行することを検討してください。ジョブステップ構成(SQL Serverエージェントサービスアカウントまたはプロキシ)で、プロセスの望ましいセキュリティコンテキストを指定できます。 https://msdn.microsoft.com/en-us/library/ms190264.aspxを参照してください。

+0

こんにちは@Dan Guzmanさん、ありがとうございました。 serverAのローカル管理者アカウントのプロキシを作成しようとしました。 wmicコマンドを実行するcmdexecジョブも作成しました。私はすでに、cmdexecジョブである1つのステップしか含まないテストSQLジョブでテストしました。ただし、ステップ1をt-sqlスクリプトとして、ステップ2をcmdexecとしてSQLジョブを編集しようとすると、Transact-SQLサブシステムではプロキシアカウントが許可されません。 (Microsoft SQL Server、Error:14517)**エラー – Krish

+0

@Krishでは、T-SQLの手順にプロキシアカウントを指定する必要はありません。 SSMS UIを使用している場合は、T-SQLジョブステップタイプのオプションではないはずです。 sysadminロールメンバーが所有するジョブの場合、T-SQLジョブステップはSQL Agentサービスアカウントで実行されます。非sysadmin所有ジョブの場合、T-SQLステップはジョブ所有者のセキュリティコンテキストで実行されます。 CmdExecとT-SQLのステップセキュリティコンテキストは独立しています。 –

+0

あなたは正しいです。 t-sqlスクリプトとしてstep1を使用して新しいジョブを作成し、ステップ2をcmdexecジョブとして作成すると、そのエラーは表示されませんでした。前回の仕事ではcmdexecの仕事のタイプが1ステップしかなかったからだと思った。次に、その手順をt-sqlスクリプトに変更し、step2(cmdexec)を追加しました。私はそれが不一致が始まった場所だと思う。 – Krish