Powershell "Invoke-Sqlcmd2" не подключается с учетными данными Windows - PullRequest
1 голос
/ 11 октября 2019

У меня есть скрипт, который вызывает Invoke-Sqlcmd2

$password = ConvertTo-SecureString 'xxxxxxx' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ('domain\someuser', $password)

$resultListTable = Invoke-Sqlcmd2 -Credential $cred -query $query -ServerInstance "SERVER" -Database ZZZZ -As "DataTable"

, который завершается ошибкой с сообщением об ошибке

Исключение вызывает "Open" с аргументом "0":"Не удалось войти в систему для пользователя 'домен \ someuser'."

Мой администратор БД сообщает мне, что он видит ошибку с сервера, которая выглядит следующим образом:

Логинсбой для пользователя 'domain \ someuser' Причина: Попытка использовать имя учетной записи NT с аутентификацией SQL Server.

В документации для Invoke-SqlCmd2 в (https://github.com/sqlcollaborative/Invoke-SqlCmd2/blob/master/Invoke-SqlCmd2/Public/Invoke-SqlCmd2.ps1) указано, что оба окнаи аутентификация sql поддерживаются. (Я пробовал только с учетными данными sql, и это прекрасно работает, но мне нужно использовать учетные данные Windows, которые у меня есть по деловым причинам). И я видел (где-то, не могу найти его прямо сейчас), что достаточно просто указать обратную косую черту в имени пользователя, чтобы он (предположительно объект System.Data.SqlClient.SQLConnection) выбрал аутентификацию Windows. К сожалению, я наблюдаю не такое поведение.

Есть ли что-то еще, что мне нужно сделать с вызовом, чтобы включить аутентификацию Windows?

1 Ответ

1 голос
/ 11 октября 2019

Код фактически выполняет следующие действия:

if ($Credential) {
  $CSBuilder["Trusted_Connection"] = $false
  $CSBuilder["User ID"] = $Credential.UserName
  $CSBuilder["Password"] = $Credential.GetNetworkCredential().Password
}
else {
  $CSBuilder["Integrated Security"] = $true
}

(см. исходный код )

... поэтому, в принципе, если вы предоставляете учетные данные, то предполагается, чтобыть входом в систему SQL Server, а не входом в Windows (поскольку для доверенного соединения установлено значение false).

NB По сути, вы неправильно поняли, как работает аутентификация SQL Server. Проверка подлинности Windows на SQL Server выполняется неявно на основе текущего зарегистрированного пользователя. Если в строке подключения включена встроенная / доверенная аутентификация, то SQL будет автоматически использовать контекст пользователя Windows, устанавливающего соединение, для определения личности пользователя. Вы не можете указать другого пользователя Windows. Это относится ко всем клиентам SQL Server. Если вы хотите войти в SQL под другим пользователем, вам нужно запустить скрипт powershell под этой учетной записью.

...