执行xp_cmdshell'wmic时使用了哪个帐号...“java -jar ...”'

时间:2016-11-15 10:36:31

标签: java sql-server excel wmic xp-cmdshell

我有一个 jar 文件,我希望将其作为 SQL作业中的一个步骤运行。 但是,jar文件必须在 machineA 上运行,但SQL作业在 serverA 上进行计划。

为了实现这一点,在serverA的SQL作业中,我使用xp_cmdshell向终端发出wmic命令。

xp_cmdshell允许我从T-SQL脚本发出终端命令

wmic允许我发出一个终端命令来加工(在这种情况下是一个java -jar命令)

以下是我使用的命令

EXEC master..xp_cmdshell 'wmic /user:mydomain\myuser /password:mypassword /node:machineA process call create "cmd /c java -jar D:\jars\saveToSharedFolder.jar"'

saveToSharedFolder.jar 是一个java应用程序,它从数据库中提取数据并将其写入excel文件,然后将此excel文件保存到位于服务器中的共享文件夹,例如 \ serverA的\文件\ 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登录machineA,并在machineA中运行jar文件时,它成功保存\ serverA \ files \ savedData.xlsx

我还尝试授予运行nt service时获得的EXEC master..xp_cmdshell 'whoami'帐户。因为这是运行wmic帐户的帐户吗?但它仍然没有创建\ serverA \ files \ savedData.xlsx

虽然很奇怪,因为我使用mydomain\myusermypassword启动 wmic 不应该使用myuser的凭据运行jar文件,因此能够创建\ serverA \文件\ savedData.xlsx?

1 个答案:

答案 0 :(得分:0)

如果调用登录名是sysadmin角色成员,则xp_cmdshell在SQL Server服务帐户的安全上下文下运行。对于非sysadmin角色成员,xp_cmdshell在xp_cmdshell proxy account的安全上下文下运行。

不确定为什么要使用T-SQL来调用该进程。相反,请考虑使用CmdExec作业步骤类型直接执行命令。您可以在作业步骤配置(SQL Server代理服务帐户或代理)中指定进程的所需安全上下文。请参阅https://msdn.microsoft.com/en-us/library/ms190264.aspx