【发布时间】: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