【问题标题】:Powershell script to connect to sql db with windows authentication使用 Windows 身份验证连接到 sql db 的 Powershell 脚本
【发布时间】:2016-11-05 18:21:16
【问题描述】:

使用 Windows 身份验证连接到 SQL Server 数据库的正确语法是什么?

【问题讨论】:

    标签: sql-server database powershell database-connection


    【解决方案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 添加了更多信息
      猜你喜欢
      • 2016-11-04
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2011-04-10
      • 2018-02-14
      • 2021-12-21
      相关资源
      最近更新 更多