PowerShell:使用 Get-Credential 调用 sqlcmd 不起作用

PowerShell: invoke-sqlcmd with Get-Credential doesn't work

我从未见过如此简单的脚本如此失败:

$SQLServer = "localhost"
$cred = Get-Credential
invoke-sqlcmd -ServerInstance $SQLServer -Credential $cred -Query "select @@version"

短语 -Credentials 无法识别:

Invoke-Sqlcmd : A parameter cannot be found that matches parameter name 'Credential'.

那么 Get-Credential 有什么意义呢? 我在网上看到很多例子,都是这么用的。

编辑示例: 为什么此代码适用于 -Credential?因为 -Credential 在函数内部?

function Pause ($Message="Press any key to continue..."){ 
    "" 
    Write-Host $Message 
    $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
} 

function GetCompName{ 
    $SQLServer = Read-Host "Please enter a computer name or IP" 
    CheckHost 
} 

function CheckHost{ 
    $ping = gwmi Win32_PingStatus -filter "Address='$SQLServer'" 
    if($ping.StatusCode -eq 0){$pcip=$ping.ProtocolAddress; GetCollation} 
    else{Pause "Host $SQLServer down...Press any key to continue"; GetCompName} 
} 


function GetCollation {
    #Provide Database Name 
    $DatabaseName ="master"
    #Prompt for user credentials 
    $credential = Get-Credential

    $Query = "SELECT name, collation_name FROM sys.databases;  " 

    invoke-sqlcmd -ServerInstance $SQLServer -Database $DatabaseName -Credential $credential  -Query $Query | Format-Table

}
#---------Start Main-------------- 
$SQLServer = $args[0] 
if($SQLServer){CheckHost} 
else{GetCompName}

问题可能是由于 Microsoft 有两个版本的 Invoke-Sqlcmd:

  1. The Database Engine - -Credentials 参数。
  2. The SqlServer module - -Credentials 参数 可用。

查看了您最近的几个 SO 问题 - 看起来您有 the Database Engine version of the cmdlet. The the SqlServer module is not installed by default, so you have to do it manually。 (在之前的超链接中有一个 'Note' 部分 解释了这个问题背后的一些历史

简而言之,运行下面的命令得到the SqlServer module

Install-Module -Name SqlServer -AllowClobber

确保包含 -AllowClobber 开关。这是一个愚蠢的安装程序,如果您关闭开关,它将下载 ~24MB 的包,然后失败,因为它正在覆盖数据库引擎版本。