4

我有一个问题,我无法使用域凭据连接到 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(本地)用户身份完美运行。只是不在域上..

4

5 回答 5

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)
于 2015-02-03T18:47:44.863 回答
3

您无法以这种方式连接域凭据。

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

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

这将提示输入密码,因此您可能必须编写自己的替换它,它使用 CreateProcessWithLogonW API 代替。

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

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

于 2013-03-25T16:36:15.017 回答
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"

于 2013-09-18T12:52:58.007 回答
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 中工作。但是,同样不安全。希望对某人有所帮助...

于 2015-05-12T18:37:52.480 回答
-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;'
于 2013-03-25T16:39:28.057 回答