Не удается подключиться к SQL Server из PowerShell с учетными данными домена

У меня возникла проблема, когда я не могу подключиться к SQL Server, используя учетные данные домена. Используя учетные данные SA, он работает, и запрос выполняется, как ожидалось. Но когда я использую учетные данные домена, я получаю сообщение об ошибке.

Вот сценарий:

$SQLServer = 'server.domain.com'
$SQLDBName = 'DBname'
$username  = "DOMAIN\user"
$password  = "password"

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection

#--> With SA, it works, with DOMAIN creds, it does not

#$SqlConnection.ConnectionString = "Server=$SQLServer; Database=$SQLDBName; User ID=sa; Password=SApassword;"
$SqlConnection.ConnectionString = "Server=$SQLServer; Database=$SQLDBName; User ID=$username; Password=$password;"

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = 'select count (*) from my.table'
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]

И вот ошибка, которую я получаю при запуске скрипта:

Исключение, вызывающее «Заполнить» с аргументом (-ами) «1»: «Произошла ошибка, связанная с сетью или экземпляром, при установлении соединения с SQL Server. Сервер не найден или недоступен. Убедитесь, что имя экземпляра правильное. и что SQL Server настроен на разрешение удаленных подключений (поставщик: поставщик именованных каналов, ошибка: 40 — не удалось открыть подключение к SQL Server).

В C:\scripts\PowerShell\myscript.ps1:28 char:1
+ $SqlAdapter.Fill($DataSet)
+ ~~~~~~~~~~~~~~~~~~ ~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SqlException

Я должен отметить тот факт, что я подключаюсь к SQL Server с компьютера, который НЕ находится в домене (поэтому я не могу использовать какую-либо сквозную аутентификацию).

Любые идеи относительно того, почему я не могу подключиться с учетными данными своего домена? Я следил за другими сообщениями, которые предлагают советы по проверке соединений, брандмауэров и т. д. Все это в рабочем состоянии, и сценарий отлично работает как sa (локальный) пользователь. Только не в домене..


person Mike J    schedule 25.03.2013    source источник


Ответы (5)


Если у вас есть учетные данные SQL, используйте что-то вроде этого:

$ConnectionString = server=*serverName*;database=*databaseName*;user id=*userName*;password=*passWord*;

Если у вас есть учетные данные домена, используйте что-то вроде этого:

$ConnectionString = "server=*serverName*;database=*databaseName*;user id=*domain\username*;password=*passWord*;trusted_connection=true;"

Это работает в моей среде. Конечно, после этого вы делаете:

$Connection = New-Object System.Data.SQLClient.SQLConnection($ConnectionString)
person Thomas    schedule 03.02.2015

Вы не можете подключиться с учетными данными домена ТАКИМ ОБРАЗОМ.

Учетные данные домена присутствуют в процессе установления соединения. Учетная запись, используемая в процессе (или при использовании параметра ТОЛЬКО СЕТЬ в RUNAS), будет использоваться для подключения к SQL Server с использованием встроенной безопасности.

Конечно, поскольку ваш процесс НЕ МОЖЕТ фактически работать от имени пользователя в этом домене, поскольку ваш компьютер не находится в доверительных отношениях с этим доменом, я рекомендую вам рассмотреть возможность использования RUNAS /NETONLY.

Это запросит пароль, поэтому вам, возможно, придется написать свою собственную замену, которая вместо этого использует API CreateProcessWithLogonW.

https://stackoverflow.com/a/758805/18255

Это позволит вашему процессу использовать учетные данные домена из другого домена, которые используются только для сетевых подключений и проверены в то время, при этом все еще используя локальную учетную запись для других целей. Это МОЖЕТ вызвать проблемы с доступом к другим сетевым ресурсам, которые могут полагаться на вашу локальную (или другую доменную?) учетную запись, я не полностью проверил, как работает RUNAS /NETONLY, если вы делаете РАЗНЫЕ сетевые подключения из одного и того же процесса.

person Cade Roux    schedule 25.03.2013

Function SQL_CONN1 ($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=myPC;Database=myDB;Integrated Security=True" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet) 
$SqlConnection.Close() 
$DataSet.Tables[0]  }

SQL_CONN1 "Select * from [MyTable]"

Попробуйте $SqlConnection.ConnectionString = "Server=myPC;Database=myDB;Integrated Security=True"

person Kirt Carson    schedule 18.09.2013
comment
Integrated Security=True будет использовать учетные данные домена - person Kirt Carson; 01.03.2014

Если вы не беспокоитесь о безопасности, вы можете сделать это так (хотя и не безопасно):

#Set variables here

$connectionString="server=$s;database=$sqlDbName;user id=$userName;password=$passWord";

$sqlConnection=New-Object System.Data.SqlClient.SqlConnection($connectionString);

Он работает в SQL Server 2012. Но, опять же, не безопасен. Надеюсь, это поможет кому-то...

person w3bguy    schedule 12.05.2015

Вы не можете передать имя пользователя и пароль в виде строки.

Попробуйте что-то вроде этого -

#$cred = Get-Credential
# this will prompt for username and password, fill them in
# use this in your connection string
$secpwd = ConvertTo-SecureString $password -AsPlainText -Force

$SqlConnection.ConnectionString = 'Server=$SQLServer; Database=$SQLDBName; User ID=$username; Password=$secpwd;'
person Srikanth Venugopalan    schedule 25.03.2013
comment
Спасибо за это. К сожалению, мне нужно, чтобы он запускался автоматически, поэтому, хотя это решение может работать, оно не будет соответствовать потребностям сценария (как указывает сценарий - мне уже нужен пользователь и пароль в сценарии). - person Mike J; 25.03.2013
comment
@MikeJ - внес изменения для преобразования пароля в защищенную строку. Это работает для вас? - person Srikanth Venugopalan; 25.03.2013
comment
Эта техника не сработает. Невозможно использовать встроенную систему безопасности Windows с именем пользователя/паролем в строке подключения. - person Cade Roux; 26.03.2013