在 SQL Server 代理中执行的 Powershell 脚本

cod*_*ger 5 powershell sql-server-2012 sql-server-agent

我正在尝试在 SQL Server 代理作业中使用 Powershell 下载 zip 文件。该脚本使用 PuTTY (PSCP.exe) 从 SFTP 站点下载 zip 文件。

我遇到的问题是,当作业运行时,它会连接到 SFTP 站点,并且 PuTTY 会发回有关将服务器的主机密钥存储在注册表中的提示。我不想这样做,所以我试图将echo n命令通过管道传输到 PuTTY。但这似乎不起作用。

$SrcPath = "/somedirectory/somewhere/files/"
$DstPath = "D:\Download\"
$currentDate = (Get-Date).ToString('yyyyMMdd')
$FileName = "$currentDate.zip"
$ArchivePath = "D:\Archive\"

$File = "$SrcPath$FileName"

Set-Location $DstPath

echo n | C:\"Program Files (x86)"\PuTTY\pscp -P 99999 -pw password username@{IP_ADDRESS}:$File $DstPath
# Check the file is there
If (Test-Path "$DstPath$FileName")
{
  # Unzip the contents
  C:\"Program Files"\7-Zip\7z.exe e "$DstPath$FileName"
  #Move the zip file to the archive directory
  Move-Item $DstPath$FileName $ArchivePath -force
}
Run Code Online (Sandbox Code Playgroud)

如果我打开一个命令窗口并手动执行此操作,则它可以正常工作。

例如在命令窗口中输入

C:\"Program Files (x86)"\PuTTY\pscp -P 99999 -pw password username@{IP_ADDRESS}:/somedirectory/somewhere/files/20121025.zip D:\Download\

然后n在出现提示时按,正确下载文件。

当作业通过 SQL 代理运行时,它最初会错误地抱怨主机密钥,然后指出该文件不存在。

任何人都可以指出我正确的方向吗?

Stu*_*ore 4

您的第一个问题是,出于安全原因,Putty/PSCP 希望存储每个用户的主机密钥(阻止 Fred 存储可用于欺骗 George 信任假服务器的假主机密钥)。该-batch选项不会覆盖它,因为它被视为安全过程中的缺陷。

因此,当您以交互方式运行它时就可以了,因为您可以接受帐户的密钥。当您通过 SQL 代理运行它时,它会为运行 SQL 代理服务的用户存储它。

如果您在“普通”用户帐户下运行 SQL 代理,则解决此问题的一种方法是使用该帐户交互登录,运行命令pscp并接受主机密钥。然后,这将被存储以供将来运行。

另一种选择是考虑使用另一种工具来实现 SCP 功能。就我个人而言,我是winscp ( http://winscp.net/ )的粉丝。WinSCP 允许您将主机密钥指定为连接字符串的一部分(这里是一个 PowerShell 示例 - http://winscp.net/eng/docs/library#powershell)。