我有以下 PowerShell 脚本来在共享位置创建一个文件夹。共享对每个人都有完全控制权限。我已授予所有测试权限。
问题是当我手动执行时脚本工作正常。当我将它作为 SQL Server 代理服务帐户执行时,它也可以正常执行。但是,当我尝试作为 SQL Server 代理作业的一部分执行时,相同的脚本会失败。我在这里错过了什么吗?
$path = "\\server\shared\path\01222020"
New-Item -path $path -ItemType Directory -Force
Exception:
Date 1/22/2020 5:25:10 PM
Log Job History (test)
Step ID 1
Server serverA
Job Name Test
Step Name Test
Duration 00:00:01
Sql Severity 0
Sql Message ID 0
Operator Emailed
Operator Net sent
Operator Paged
Retries Attempted 0
Message
Executed as user: domain\agent_service_account. A job step received an error at
line 9 in a PowerShell script. The corresponding line is 'New-Item -path $path
-ItemType Directory '. Correct the script and reschedule the job. The error
information returned by PowerShell is: 'Invalid Path:
'\\server\shared\path\01222020'. '. Process Exit Code -1. The step failed.
从 PowerShell 作业步骤访问 UNC 路径或任何不是本地驱动器(即注册表)的“位置”时,您需要在路径前加上
Microsoft.PowerShell.Core\FileSystem::
. 这告诉 SQLPS 要使用哪个提供程序,这在普通 PowerShell 中不是必需的,但在 SQL Server 实现中是必需的。或者,您可以预先将目录更改为本地驱动器 (cd C:),然后它应该可以在不为提供程序名称添加前缀的情况下工作,但您可能希望
SQLSERVER:\SQL\SERVERNAME\INSTANCENAME
根据脚本的要求保留在默认路径中。更多信息:
https://dbatools.io/agent/
https://social.technet.microsoft.com/Forums/windowsserver/en-US/ec7f3ae8-d196-459e-b9dc-e6ed0df93004/running-powershell-from-sql-server-using-unc-paths
sql检查点,
请查看下面的链接,该链接描述了 SQL 代理使用了哪些 Powershell 模块。它是 SQLPS 还是 SqlServer,具体取决于您的 SQL Server 版本。
https://learn.microsoft.com/en-us/sql/powershell/run-windows-powershell-steps-in-sql-server-agent?view=sql-server-ver15
很可能在 SQLAgent 使用的 powershell 模块中找不到 New-Item cmdlet。
您可以使用 CmdExec 步骤创建 SQLAgent 作业,该步骤又调用 powershell.exe。
powershell.exe -ExecutionPolicy ByPass -NoProfile -File PATH_TO_YOUR_SCRIPT
有关 powershell.exe 的所有选项/参数,请参见下面的链接
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe?view=powershell-5.1