web-dev-qa-db-ja.com

SQL Serverエージェント内で実行されるPowerShellスクリプト

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
}
_

コマンドウィンドウを開いて手動で実行すると、問題なく動作します。

例えばコマンドウィンドウでこれを入力する

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

プロンプトが表示されたらnを押すと、ファイルが正しくダウンロードされます。

ジョブがSQLエージェントを介して実行されると、最初にホストキーに関するエラーが表示され、次にファイルが存在しないことが示されます。

誰かが私を正しい方向に向けることができますか?

5
codingbadger

最初の問題は、セキュリティ上の理由からPuTTY/PSCPが各ユーザーのホストキーを保存することです(Fredが偽のサーバーキーを保存して、Georgeが偽のサーバーを信頼するのに使用されるのを防ぐ)。 -batchオプションは、セキュリティプロセスの欠陥と見なされているため、これを上書きしません。

したがって、アカウントのキーを受け入れることができるので、インタラクティブに実行すると問題ありません。 SQL Agentを介して実行する場合、SQL Agentサービスを実行するユーザーのためにそれを保存する必要があります。

「通常の」ユーザーアカウントでSQLエージェントを実行している場合、これを回避する1つの方法は、そのアカウントで対話的にログインし、pscpコマンドを実行してホストキーを受け入れることです。これは、将来の実行のために保存されます。

もう1つのオプションは、SCP機能用の別のツールの使用を検討することです。個人的に私はこのためにwinscp( http://winscp.net/ )のファンです。 WinSCPを使用すると、接続文字列の一部としてホストキーを指定できます(PowerShellの例- http://winscp.net/eng/docs/library#powershell )。

4
Stuart Moore

Pscpに here のようにインタラクティブプロンプトを無効にする-batchスイッチがあるようです。

次のようなものを試してください:

C:\"Program Files (x86)"\PuTTY\pscp -P 99999 -pw password username@{IP_ADDRESS}:$File $DstPath -batch
0
wBob