【发布时间】:2016-06-28 17:03:10
【问题描述】:
我有一个 PowerShell 脚本 (test.ps1),它通过 Invoke-Sqlcmd 执行一个简单的 SQL 查询。该脚本位于远程文件共享服务器上。下面是脚本:
param
(
[string]$SQL_username,
[string]$SQL_password
)
Write-Host ('begin script')
$db = 'some_DB'
$server = 'some_IP'
$query = 'SELECT TOP 10 * FROM some_schema.some_table'
Invoke-Sqlcmd -Username $SQL_username -Password $SQL_password -ServerInstance $server -Database $db -Query $query -QueryTimeout 60000
Write-Host ('end script')
当我使用 Tidal 用户帐户远程访问文件共享服务器时,脚本成功执行并按预期执行。
我有一个相应的 Tidal 作业来执行这个 test.ps1 脚本。这是潮汐的工作信息:
命令
C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe
命令参数
-ExecutionPolicy bypass -File D:\some_path\test.ps1
-SQL_username "<SQL_username.1>"
-SQL_password "<SQL_password.2>"
当我通过 Tidal 运行脚本时,Tidal 中的输出屏幕显示:
开始脚本
Invoke-Sqlcmd:术语“Invoke-Sqlcmd”未被识别为名称 cmdlet、函数、脚本文件或可运行的程序...
结束脚本
因此,很明显,无论用户 Tidal 使用什么来运行脚本,用户都可以识别 Write-Host cmdlet,但无法识别 Invoke-Sqlcmd cmdlet。怎么会这样?而且,我该如何解决这个问题? (我发现 Tidal 用户是 NT AUTHORITY\SYSTEM,而不是作业的 Run 选项卡中指定的 Runtime User,与我登录远程服务器时的 Tidal 用户相同。)
【问题讨论】:
-
SQL 模块未加载到 SYSTEM 的 PowerShell 配置文件中。见jasonq.com/blog/2012/…。您可能需要将任务设置为使用用户帐户运行,因为我认为它以 SYSTEM 身份运行时可能无法访问网络。
-
我认为你是对的。我使用另一个用户帐户使用 New-PSSession 创建了一个新的 PowerShell 会话,它可以工作。
标签: powershell tidal-scheduler