当执行xp_cmdshell'wmic …“java -jar …时使用了哪个帐户'
我有一个jar文件,我想作为SQL作业中的一个步骤运行。 但是,jar文件必须在machineA上运行,但SQL作业在serverA上安排 。
为了使这成为可能,在serverA的SQL作业中,我使用xp_cmdshell
向terminal发出wmic
命令。
xp_cmdshell
允许我从T-SQL脚本发出terminal命令
wmic
允许我发出一个terminal命令来encryption(在这个例子中是一个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 \ files \ savedData.xlsx 。
文件savedData.xlsx不保存在\ serverA \文件中。
当我尝试输出到文件的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
我知道这是一个文件夹权限问题 。 但是,我很遗憾应该给文件夹写入许可。
当我尝试在machineA中使用在wmic命令中使用的mydomain\myuse
r和mypassword
login并在machineA中运行jar文件时,它成功保存\ serverA \ files \ savedData.xlsx
我也尝试授予我运行EXEC master..xp_cmdshell 'whoami'
时得到的nt service
帐户。 因为那是运行wmic账号的账号吗? 但它仍然不会创build\ serverA \ files \ savedData.xlsx
这很奇怪,因为我使用mydomain\myuser
启动了wmic , mypassword
不应该使用myuser的凭据运行jar文件,因此能够创build\ serverA \ files \ savedData.xlsx?
如果调用的login名是sysadminangular色成员,则xp_cmdshell在SQL Server服务帐户的安全上下文下运行。 对于非系统pipe理员angular色成员,xp_cmdshell在xp_cmdshell代理帐户的安全上下文下运行。
不知道你为什么使用T-SQL来调用这个过程。 而应考虑使用CmdExec作业步骤types来直接执行该命令。 您可以在作业步骤configuration(SQL Server代理服务帐户或代理)中指定所需的安全上下文。 请参阅https://msdn.microsoft.com/en-us/library/ms190264.aspx 。