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
:
- The Database Engine - 无
-Credentials
参数。
- 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 的包,然后失败,因为它正在覆盖数据库引擎版本。
我从未见过如此简单的脚本如此失败:
$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
:
- The Database Engine - 无
-Credentials
参数。 - 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 的包,然后失败,因为它正在覆盖数据库引擎版本。