1. ホーム
  2. powershell

[解決済み] Invoke-Sqlcmd エラー : リモート DB サーバを呼び出すために powershell を実行すると、ユーザ xxxx のログインに失敗しました。

2022-02-10 03:39:47

質問

私は Invoke-SqlCmd : Login failed for user 'DIR\MISAccount'. パワーシェル・スクリプトを実行したとき。powershellスクリプトは.sqlファイルを読み込み、.sqlファイルに定義されたステートメントを実行します。ローカルマシンでパワーシェルと.sqlスクリプトをテストしました(アプリとデータベースは同じボックス内にあります)、スクリプトは期待通りに動作しています。

サーバー上でスクリプトを実行すると、エラーが発生します。ここでの違いは、パワーシェルがリモートDBサーバーを呼び出す必要があることです。私は以下をチェックしました。

アプリサーバーからSSMOで接続 - 動作しました。 アプリサーバーからCMD SQLCMDで接続 - 動作しました。 DBサーバーでpowershellスクリプトを実行 - 動作確認済み

上記のテストから、問題はPowershell(アプリサーバーで実行)からリモートDBサーバーへのクレデンシャルだと思うのですが、解決の糸口が見えません。どんな助けでも非常に感謝します。

パワーシェルスクリプトはこちら

$LogTime = Get-Date -Format "MM-dd-yyyy_hh-mm-ss"
$SqlFile = "E:\User\Script_CreateTable.sql"
$OutputFile = "E:\User\CreateTable.log"
$Path = "E:\User\Password.txt"
$uid = 'sa'
$ConnectionString = "Server=WINPRD212\PROD_INC;Database=AccountMEC;"

$pwd = Get-Content $Path | ConvertTo-SecureString
$pwd.MakeReadOnly()


$creds = New-Object System.Data.SqlClient.SqlCredential($uid,$pwd)

$con = New-Object System.Data.SqlClient.SqlConnection
$con.ConnectionString = $ConnectionString
$con.Credential = $creds
$con.Open()


Invoke-SqlCmd -InputFile $SqlFile -verbose

$con.Close()

解決方法は?

以下の方法で解決しました。

$creds = New-Object System.Management.Automation.PSCredential $uid,$pwd
$Password = $creds.GetNetworkCredential().Password

Invoke-SqlCmd -InputFile $SqlFile -Username 'sa' -Password $Password -ServerInstance 'WINPRD212\PROD_INC' -Database 'AccountMEC'