我遇到无法使用域凭据连接到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(本地)用户一样运行。只是不在域名上..
答案 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;'