【问题标题】:PowerShell: invoke-sqlcmd with Get-Credential doesn't workPowerShell:使用 Get-Credential 调用 sqlcmd 不起作用
【发布时间】:2019-01-08 09:12:50
【问题描述】:

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

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

【问题讨论】:

  • 有一个用户名和凭据参数。如果你看这篇文章,这就是他们过去常做的事情:stackoverflow.com/questions/7154122/…
  • 这看起来很奇怪。如果您手动运行代码而不是调用脚本,那么它可以工作吗?当您运行 Get-Credential 时,您应该被提示输入新凭证对象的用户名和密码,您是否都被提示输入?
  • @HenrikStanleyMortensen,如果invoke-sqlcmdGet-Credential 在函数内,我会收到提示。这很有趣,但在功能之外它们不会被执行。还有更搞笑的-Credentials好像认不出来了

标签: sql-server powershell invoke-sqlcmd


【解决方案1】:

这个问题可能是由于微软有两个版本的Invoke-Sqlcmd

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

查看了您最近的几个 SO 问题 - 看起来您拥有 cmdlet 的 the Database Engine 版本。 the SqlServer module 默认不安装,so you have to do it manually。 (之前的超链接中有一个“注释”部分解释了这个问题背后的一些历史

简而言之,运行以下命令获取the SqlServer module

Install-Module -Name SqlServer -AllowClobber

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

【讨论】:

猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多