使用 Windows 身份验证连接到 sql db 的 Powershell 脚本
Posted
技术标签:
【中文标题】使用 Windows 身份验证连接到 sql db 的 Powershell 脚本【英文标题】:Powershell script to connect to sql db with windows authentication 【发布时间】:2016-11-05 18:21:16 【问题描述】:使用 Windows 身份验证连接到 SQL Server 数据库的正确语法是什么?
【问题讨论】:
【参考方案1】:https://technet.microsoft.com/en-us/magazine/hh855069.aspx 上的 Technet 文章详细介绍了如何使用 PowerShell 连接到 SQL Server 数据库。它还包括一个您可以在脚本中使用的示例函数:
function Get-DatabaseData
[CmdletBinding()]
param (
[string]$connectionString,
[string]$query,
[switch]$isSQLServer
)
if ($isSQLServer)
Write-Verbose 'in SQL Server mode'
$connection = New-Object-TypeName System.Data.SqlClient.SqlConnection
else
Write-Verbose 'in OleDB mode'
$connection = New-Object-TypeName System.Data.OleDb.OleDbConnection
$connection.ConnectionString = $connectionString
$command = $connection.CreateCommand()
$command.CommandText = $query
if ($isSQLServer)
$adapter = New-Object-TypeName System.Data.SqlClient.SqlDataAdapter $command
else
$adapter = New-Object-TypeName System.Data.OleDb.OleDbDataAdapter $command
$dataset = New-Object-TypeName System.Data.DataSet
$adapter.Fill($dataset)
$dataset.Tables[0]
function Invoke-DatabaseQuery
[CmdletBinding()]
param (
[string]$connectionString,
[string]$query,
[switch]$isSQLServer
)
if ($isSQLServer)
Write-Verbose 'in SQL Server mode'
$connection = New-Object-TypeName System.Data.SqlClient.SqlConnection
else
Write-Verbose 'in OleDB mode'
$connection = New-Object-TypeName System.Data.OleDb.OleDbConnection
$connection.ConnectionString = $connectionString
$command = $connection.CreateCommand()
$command.CommandText = $query
$connection.Open()
$command.ExecuteNonQuery()
$connection.close()
在上面来自 Technet 文章的脚本中,您只需要提供 3 个参数:连接字符串(您将使用 Trusted Connection=True 来实现集成安全性)、要运行的查询和数据库类型(SQL Server或 OleDB)。
【讨论】:
好文章!但是我花了一点时间来了解如何正确地从 Get-DatabaseData 返回值,以便继续使用这些数据。我在方法末尾的编辑:$dataset = New-Object -TypeName System.Data.DataSet
$null = $adapter.Fill($dataset)
$connection.Close()
return Write-Output $dataset -NoEnumerate
【参考方案2】:
一个普通的 SQL 身份验证连接字符串看起来像
ConnectionString 'Server=$server;Database=$databaseName;UID=$DOMAIN\USER;PWD=$password'
上述和 Windows 身份验证之间的唯一主要区别是打开集成安全性
集成安全=true;
因此,Windows 身份验证连接字符串将读取
ConnectionString 'Server=$server;Database=$databaseName;UID=$DOMAIN\USER;PWD=$password;Integrated Security=true;'
请注意,如果您的服务器是
localhost
,则为UID
指定域是可选的,因此您可以简单地将UID
指定为UID=sa;
在下面找到可以适应您的用例的完整代码示例。
function global:SelectAllUsers()
Read-Query -ConnectionString 'Server=localhost;Database=Ulysses;UID=EMEA\XJ193;PWD=somepassword;Integrated Security=true;' `
-Query "SELECT * FROM Users" `
-Action
echo "I can take an action here"
function Read-Query
param (
[Parameter(Mandatory=$true)]
[string]$ConnectionString,
[Parameter(Mandatory=$true)]
[string]$Query,
[Parameter(Mandatory=$true)]
[scriptblock]$Action
)
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $ConnectionString
$SqlConnection.Open()
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $Query
$SqlCmd.Connection = $SqlConnection
$reader = $SqlCmd.ExecuteReader()
while ($reader.Read())
$x = $null
$x = @
for ($i = 0; $i -lt $reader.FieldCount; ++$i)
$x.add($reader.GetName($i), $reader[$i])
Invoke-Command -ScriptBlock $action -ArgumentList $x
$SqlConnection.Close()
SelectAllUsers
【讨论】:
【参考方案3】:此外,您还可以恢复到函数Invoke-Sqlcmd2,它会为您自动执行所有这些操作。我们使用它取得了巨大的成功,它让生活变得更加轻松。
CmdLet Invoke-SqlCmd2
带有参数Credential
,使用 Windows 身份验证时可以省略。
.PARAMETER Credential
Specifies A PSCredential for SQL Server Authentication connection to an instance of the Database Engine.
If -Credential is not specified, Invoke-Sqlcmd attempts a Windows Authentication connection using the Windows account running the PowerShell session.
【讨论】:
这似乎无法回答问题。 @TylerH 添加了更多信息以上是关于使用 Windows 身份验证连接到 sql db 的 Powershell 脚本的主要内容,如果未能解决你的问题,请参考以下文章
在IIS7中通过PHP连接到SQL SERVER 2008(使用Windows身份验证)?
如何使用 Windows 身份验证通过 sqlalchemy 连接到 SQL Server?
尝试使用繁琐的连接和 Windows 身份验证连接到 SQL 服务器?