【问题标题】:How to execute a PowerShell file from stored procedure如何从存储过程执行 PowerShell 文件
【发布时间】:2016-12-03 04:22:24
【问题描述】:

如何从存储过程中执行 PowerShell 文件?

我没有任何运气从存储过程中执行 PowerShell 文件。

exec xp_cmdshell 'powershell ""E:\PowershellScripts\todayErrorLog.ps1""'

当我运行存储过程时,我得到文件上的访问被拒绝错误。我知道 ps1 文件本身很好,因为我可以在命令行上和作为代理作业执行它。所以我认为这是给存储过程足够的权限的问题。

之前,我确保使用此脚本启用xp_cmdshell

-- To allow advanced options to be changed.  
EXEC sp_configure 'show advanced options', 1;  
GO  

-- To update the currently configured value for advanced options.  
RECONFIGURE;  
GO  

-- To enable the feature.  
EXEC sp_configure 'xp_cmdshell', 1;  
GO  

-- To update the currently configured value for this feature.  
RECONFIGURE;  
GO  

为了从存储过程执行 PowerShell 脚本文件,我还需要做什么?

这是存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[RefreshErrorQuery] 
    -- No parameters    
AS
BEGIN
    SET NOCOUNT ON;
    -- Step 1
    exec xp_cmdshell 'powershell ""E:\PowershellScripts\todayErrorLog.ps1""'

    -- Step 2: TODO: Run SSIS package
END

【问题讨论】:

  • 您是否考虑过从存储过程中执行您提到的那个 SQLAgent 作业?我从来没有尝试过直接从 proc 运行 powershell,但是我已经从 proc 中执行了代理作业,这里有很多例子和在线帮助。
  • 都是因为这个:stackoverflow.com/questions/38624228/…。一个建议是我将我的代理作业转换为存储过程,以便我的 MVC 控制器可以知道该过程何时完成。

标签: sql-server powershell stored-procedures


【解决方案1】:

您的问题是因为代理使用的帐户没有足够的权限访问该文件。

如何检查:

(1) 可以从命令行运行 PS (2) 不能在 xp_cmdshell 中运行脚本 (3) 将包含文件的文件夹更改为所有人完全控制 (4)尝试通过xp_cmdshell运行脚本

或者,对于测试,您可以将运行 SQL 代理的登录名更改为您的凭据。然后代理以“你”的身份运行,就像你在命令行上运行一样。

【讨论】:

  • 代理运行没有问题。当我尝试在存储过程中执行文件时,我遇到了问题。
  • 代理是否能够将其作为计划作业运行(而不是通过 SMS 以交互方式运行)?通过 SMS 以交互方式运行作业使用您的登录凭据,而不是代理凭据。
  • 我可以将它作为计划作业运行——根本问题是我希望能够使用 MVC 控制器方法来触发代理作业按需运行并在工作完成。有人告诉我,我需要运行存储过程而不是作业,并且存储过程异步运行作业,并且不会在完成时通知我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2012-10-10
  • 2011-01-08
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多