我遇到一个问题,无法使用域凭据连接到SQL Server。使用SA凭据可以正常工作,查询也可以按预期运行。但是当我使用域凭据时,我会收到一个错误。
这是脚本:
$SQLServer = 'server.domain.com'
$SQLDBName = 'DBname'
$username = "DOMAINuser"
$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(
+~~~~~~+类别信息:未指定:(:([],MethodInvocationException
+FullyQualifiedErrorId:SqlException
我应该指出的事实是,我正在从不在域中的计算机连接到SQL Server(因此我不能使用任何类型的身份验证直通(。
关于为什么我不能连接我的域凭据,有什么想法吗?我关注了其他帖子,这些帖子提供了检查连接、防火墙等方面的建议。这一切都在正常工作,脚本作为sa(本地(用户完美运行。只是不在域上。。
如果您有SQL凭据,请使用以下内容:
$ConnectionString = server=*serverName*;database=*databaseName*;user id=*userName*;password=*passWord*;
如果你有域凭据,请使用类似的东西:
$ConnectionString = "server=*serverName*;database=*databaseName*;user id=*domainusername*;password=*passWord*;trusted_connection=true;"
这在我的环境中有效。当然,在那之后你会做:
$Connection = New-Object System.Data.SQLClient.SQLConnection($ConnectionString)
您不能用这种方式连接域凭据。
域凭据存在于建立连接的过程中。进程中使用的帐户(或者如果使用RUNAS中的NETWORK ONLY选项(将用于使用集成安全性连接到SQL Server。
当然,由于您的计算机与该域没有信任关系,因此您的进程实际上无法作为用户在该域上运行,因此我建议您考虑使用RUNAS/NETONLY。
这将提示输入密码,因此您可能需要编写自己的替换密码,而使用CreateProcessWithLogonW API。
https://stackoverflow.com/a/758805/18255
这将允许您的进程使用来自其他域的域凭据,这些凭据仅在网络连接上使用并在那时进行验证,同时仍使用本地帐户进行其他操作。这可能会导致访问其他网络资源的问题,这些网络资源可能依赖于您的本地(或其他域?(帐户,如果您从同一进程进行不同的网络连接,我还没有完全测试RUNAS/NETONLY是如何工作的。
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">
如果你不担心安全性,你可以这样做(尽管不安全(:
#Set variables here
$connectionString="server=$s;database=$sqlDbName;user id=$userName;password=$passWord";
$sqlConnection=New-Object System.Data.SqlClient.SqlConnection($connectionString);
它适用于SQL Server 2012。但是,再次强调,并不安全。希望能帮助到别人。。。
您不能将用户名和密码作为字符串传递。
试试这样的东西-
#$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;'