无法使用域凭据从PowerShell连接到SQL Server

时间:2013-03-25 16:27:19

标签: sql-server powershell windows-security

我遇到无法使用域凭据连接到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”参数调用“Fill”的异常:“发生与网络相关或特定于实例的错误   建立与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(本地)用户一样运行。只是不在域名上..

5 个答案:

答案 0 :(得分:4)

如果您有SQL凭据,请使用以下内容:

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

如果你有Domain Credentials,请使用以下内容:

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

这适用于我的环境。当然之后你会这样做:

$Connection = New-Object System.Data.SQLClient.SQLConnection($ConnectionString)

答案 1 :(得分:3)

您无法以域名方式连接。

进行连接的进程中存在域凭据。在此过程中使用的帐户(或如果在RUNAS中使用NETWORK ONLY选项)将用于使用集成安全性建立与SQL Server的连接。

当然,因为您的进程实际上不能作为该域上的用户运行,因为您的计算机与该域没有信任关系,所以我建议您查看使用RUNAS / NETONLY。

这将提示输入密码,因此您可能需要编写自己的替代品,而不是使用CreateProcessWithLogonW API。

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

这将允许您的进程使用来自其他域的域凭据,这些域凭据仅用于网络连接并在那时进行验证,同时仍然使用本地帐户进行其他操作。这可能导致问题转移到可能依赖于您的本地(或其他域?)帐户的其他网络资源,如果您从同一进程进行不同的网络连接,我还没有完全测试RUNAS / NETONLY如何工作。

答案 2 :(得分:2)

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”

答案 3 :(得分:0)

如果您不担心安全问题,可以这样做(不安全):

#Set variables here

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

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

它适用于SQL Server 2012.但是,再次安全。希望有人帮助......

答案 4 :(得分:-1)

您无法将用户名和密码作为字符串传递。

尝试这样的事情 -

#$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;'