手动成功时,从存储过程运行exe文件失败

时间:2013-01-04 15:57:02

标签: sql-server security stored-procedures batch-file

我使用SQL Server 2008.目前我正在处理一个存储过程,它需要(除其他外)打印文件。

问题:我在sp中创建的文本文件需要打印为横向。我使用DOSPrinter.exe程序,这是一个universel打印机驱动程序,它从命令行向(默认)打印机提示添加一个文件。

我使用xp_cmdshell来做到这一点。我猜xp_cmdshell有足够的权限。我使用它来执行一些文件复制操作,在我对使用过的目录设置安全性后,它可以很好地工作。

我给DOSPrinter提供了与打印设备相同的权利。

但是,在命令窗口中手动键入命令(C:\ temp \ DOSPrinter" C:\ temp \ test.txt")时,该文件将出现在打印提示中。 当我在bat文件中放入相同的命令,并从cmd窗口手动调用bat文件时,该文件将被发送到打印提示。

当我尝试将命令放在存储过程中时:

    SET @bcpCommand = 'C:\temp\DOSPrinter.exe C:\temp\test.txt'
    EXEC master..xp_cmdshell @bcpCommand

文件未发送到打印提示。如果我试图从sp调用bat文件,打印提示中再没有文件。我有点绝望。

也许有人可以帮我提一些关于如何继续的想法?

谢谢,

jan_solo

3 个答案:

答案 0 :(得分:0)

确保已启用该功能:

exec sp_configure ‘show advanced options’, 1
go
reconfigure
go
exec sp_configure ‘xp_cmdshell’, 1
go
reconfigure
go

如果是,您可以发布命令发送给您的输出吗?如果您尝试运行dir *.*会怎样?

答案 1 :(得分:0)

您是否尝试在SSMS窗口而不是命令窗口中运行命令?我不认为问题是存储过程本身。我认为问题是SQL Server访问可执行文件和/或文件。

现在,这个dum问题。您是否在运行SSMS的同一台计算机上运行SQL Server?如果没有,问题很简单。该命令位于本地计算机上,但它不在服务器计算机上。

如果您在同一台计算机上运行并且您知道xp_cmdshell正在运行,则问题会变得更加困难。它可能是权限问题的委派。可能是运行SQL Server代理的用户没有查看临时文件的权限。或者可能还有其他原因。

祝你好运。

答案 2 :(得分:0)

我有一个周末考虑它,答案实际上比我预期的更简单......

重点是通用打印机驱动程序将文本文档发送到默认打印机,正如我所指出的那样。 XP_cmdshell在不同的用户下执行,然后是我登录的用户。

我唯一需要做的就是在打印文件之前添加一个带XP_cmdshell的默认打印机:

    SET @bcpCommand = 'rundll32 printui.dll,PrintUIEntry /y /q /n "My_Printer"'
    EXEC master..xp_cmdshell @bcpCommand

    SET @bcpCommand = 'C:\temp\DOSPrinter.exe C:\temp\test.txt'
    EXEC master..xp_cmdshell @bcpCommand

当我运行存储过程时,文件确实出现在打印提示中。

每个人,无论如何都要感谢答案: - )