【问题标题】:Connecting to SQL Server using domain user through Invoke-Command通过 Invoke-Command 使用域用户连接到 SQL Server
【发布时间】:2019-11-28 10:33:04
【问题描述】:

我在远程服务器上有一个控制台应用程序,它使用执行进程的用户的凭据连接到 SQL 服务器。

当我使用服务帐户在服务器本身上执行控制台应用程序时,它会很好地获取凭据并成功登录到数据库。但是,为了适应我组织的自动化流程,我需要从另一个服务器上执行控制台应用程序,该服务器正在使用无权访问数据库的不同服务帐户运行。

看起来像这样:

Automation server running under Automation Service account(无法访问数据库)

通话

Application server under Application account and executes app(可以访问数据库)

为了简化这一点,我用一个简单的 Powershell 脚本替换了控制台应用程序,该脚本尝试连接到数据库。结果是一样的。

$Credential = New-Object System.Management.Automation.PSCredential $ApplicationUser, $SecurePassword

Write-Host "Running executable" -ForegroundColor Green
Invoke-Command -ComputerName $applicationServer -Credential $Credential -ScriptBlock { 
    Write-Host $(whoami)
    $SQLServer = "YourServerName"
    $SQLDBName = "YourDBName"
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Server = $ServerName; Database = $DbName; Integrated Security=true;" 
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = 'StoredProcName'
    $SqlCmd.Connection = $SqlConnection 
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd 
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet) 
    $SqlConnection.Close()
 }

上述脚本失败并显示以下错误消息 "Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'."

当我打印当前用户时,它声称它是应用程序用户,应该有权访问数据库。

似乎在调用Invoke-Command 时,一些用户的凭据已被删除,但这是我的知识变得有限的地方。

有什么配置可以让它工作吗?

我知道还有更简单的替代方案,但这是我所在组织的基础架构和安全限制。 (使用 SQL 用户将是我们不允许的非常简单的替代方法)

【问题讨论】:

  • 您可以使用 SQL Server Management Studio 访问数据库吗? Power Shell 正在使用集成安全性,它使用用户 Windows 凭据来访问数据库。数据库可能设置为允许 Windows 用户组访问数据库,而您可能不在有权访问数据库的用户组中。使用 SSMS 将更容易确定问题的原因。在 SSMS 的登录窗口中查看服务器名称和数据库实例。电源外壳应该使用相同的服务器和实例。
  • 是的,我可以使用 SSMS 访问数据库。用户肯定可以访问数据库
  • 然后确保power shell中的连接字符串与SSMS的登录窗口匹配。 $ServerName 应该是 SSMS 中的服务器/实例
  • 它们确实匹配,如果我直接在服务器上执行此操作,无需额外的跃点,它就可以正常工作。这就是为什么我说在 Invoke-Command 的上下文中运行时,部分凭据似乎被剥离了。
  • 要使 Windows 凭据正常工作,您需要在本地和远程计算机上设置 Windows 组帐户。与您的 MIS 人员交谈,了解服务器上用户组未被识别的原因。看起来这是一个组策略问题。

标签: c# sql-server entity-framework powershell windows-authentication


【解决方案1】:
string connectionString = $"Data Source=_ServerName;Initial Catalog=_DatabaseName;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;User ID=_Username;Password=_Paasword";

您好,试试这个 ConnectingString,但先用您的更改此信息
_ServerName_DatabaseName_Username_Password

【讨论】:

  • 据我所知,User IDPassword 仅适用于 SQL 用户。这是一个 Windows AD 用户。如前所述,由于公司政策,我们不允许使用 SQL 用户。我已经尝试过了,但它不起作用
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 2013-06-09
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多