分享方式:


在 PowerShell 中管理對 SQL Server 的驗證

根據預設,SQL Server PowerShell 元件在連接到 Database Engine 實例時會使用 Windows 驗證。 藉由定義 PowerShell 虛擬磁碟驅動器或指定 -Username-Password 參數,以使用 SQL Server 驗證 Invoke-Sqlcmd

注意

有兩個 SQL Server PowerShell 模組;SqlServerSQLPS

SqlServer 模組是要使用的目前 PowerShell 模組。

SQLPS 模組 隨附於 SQL Server 安裝中,但不再更新。

SqlServer 模組包含 SQLPS 中更新的 Cmdlet 版本,並包含新的 Cmdlet 以支援最新的 SQL 功能。

PowerShell 資源庫安裝 SqlServer 模組。

如需詳細資訊,請流覽 SQL Server PowerShell

權限

您可以在 Database Engine 實例中執行的所有動作,都是由授與用來連線到實例之驗證認證的許可權所控制。 根據預設,SQL Server 提供者和 Cmdlet 會使用執行中的 Windows 帳戶來建立 Database Engine 的 Windows 驗證連線。

若要建立 SQL Server 驗證連線,您必須提供 SQL Server 驗證登入識別碼和密碼。 使用 SQL Server 提供者時,您必須將 SQL Server 登入認證與虛擬磁碟驅動器產生關聯,然後使用變更目錄命令 (cd) 連接到該磁碟驅動器。 在 Windows PowerShell 中,安全性認證只能與虛擬磁碟驅動器相關聯。

使用虛擬磁碟驅動器的 SQL Server 驗證

若要建立與 SQL Server 驗證登入相關聯的虛擬磁碟驅動器。

  1. 建立可:

    1. 具有名稱的參數,以提供虛擬磁碟驅動器、登入標識碼,以及要與虛擬磁碟驅動器建立關聯的提供者路徑。

    2. 使用 讀取主機 提示使用者輸入密碼。

    3. 使用 new-object 來建立認證物件。

    4. 使用 new-psdrive 建立具有所提供認證的虛擬磁碟驅動器。

  2. 叫用 函式,以使用提供的認證來建立虛擬磁碟驅動器。

範例:虛擬磁碟驅動器

此範例會建立名為 sqldrive 的函式,讓您用來建立與指定的 SQL Server 驗證登入和實例相關聯的虛擬磁碟驅動器。

sqldrive 函式會提示您輸入登入的密碼,並在輸入密碼時遮罩密碼。 然後,每當您使用變更目錄命令 (cd) 連線到使用虛擬磁碟驅動器名稱的路徑時,所有作業都會使用您在建立磁碟驅動器時提供的 SQL Server 驗證登入認證來執行。

## Create a function that specifies the login and prompts for the password.

function sqldrive
{
    param( [string]$name, [string]$login = "MyLogin", [string]$root = "SQLSERVER:\SQL\MyComputer\MyInstance" )
    $pwd = read-host -AsSecureString -Prompt "Password"
    $cred = new-object System.Management.Automation.PSCredential -argumentlist $login,$pwd
    New-PSDrive $name -PSProvider SqlServer -Root $root -Credential $cred -Scope 1
}

## Use the sqldrive function to create a SQLAuth virtual drive.
sqldrive SQLAuth

## Set-Location to the virtual drive invokes the supplied authentication credentials.
sl SQLAuth:

使用 Invoke-Sqlcmd 的 SQL Server 驗證

若要搭配 SQL Server 驗證使用 Invoke-Sqlcmd。

  1. 使用 -Username 參數來指定登入標識符,並使用 -Password 參數來指定相關聯的密碼。

範例 (Invoke-Sqlcmd)

此範例會使用讀取主機 Cmdlet 來提示使用者輸入密碼,然後使用 SQL Server 驗證進行連線。

## Prompt the user for their password.
$pwd = read-host -AsSecureString -Prompt "Password"

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance" -Username "MyLogin" -Password $pwd