我希望SQL Server权限符合我在连接字符串中指定的ID,而不是那些碰巧运行PowerShell脚本的人(通常是我)。
例如,我有一个名为"MyTable"的表,我可以更新它,但"testdrestricted"不能。
我以"testdrestricted"登录到Microsoft SQL Server Management Studio并运行以下查询
select MyField
from MyTable
where ID = 2
,我看到它返回"4"。我现在尝试更新:
update MyTable
set MyField = 5
where ID = 2
如所料,我得到以下失败结果:
Msg 229, Level 14, State 5, Line 1
The UPDATE permission was denied on the object 'MyTable', database 'mydb', schema 'dbo'.
接下来我运行下面的UpdateProblem。ps1 PowerShell脚本:
$ConnectionString = "Server=MyServerMSSQL2012;Database=mydb;User Id= TestIDRestricted;Password=secretpasswd;"
$ConnectionString = $ConnectionString + "Trusted_Connection = yes;Persist Security Info=False"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $ConnectionString
$sqlConnection.Open()
$sqlCommand = $sqlConnection.CreateCommand()
$updateSQL ="update MyTable set MyField = 5 where ID = 2"
$sqlCommand.CommandText = $updateSQL
write-host $updateSQL
#following command should fail
$sqlCommand.ExecuteNonQuery()
$sqlConnection.close()
我预计此更新将失败,因为我没有在连接字符串中指定集成安全性。但是,当我登录回Microsoft SQL Server管理工作室为"testdrestricted"并再次运行以下查询
select MyField
from MyTable
where ID = 2
我看到它返回"5"。所以更新成功了,即使我预期它会失败。据我所知,它成功的原因是因为SQL权限是基于使用集成安全性的我的ID,而不是与我在连接字符串中使用的ID相关联的安全性。
我如何让脚本使用与我在连接字符串中指定的ID关联的权限,而不是使用我的ID的权限,似乎与集成的安全性一起遵循?
您正在设置Trusted_Connection为TRUE;这几乎肯定意味着您正在使用当前用户的凭据进行连接,而不是使用连接字符串中指定的凭据。试一试:
$ConnectionString = "Server=MyServerMSSQL2012;Database=mydb;User Id= TestIDRestricted;Password=secretpasswd;"
$ConnectionString = $ConnectionString + "Trusted_Connection = no;Persist Security Info=False"
你可以直接注释掉第二行:
$ConnectionString = "Server=MyServerMSSQL2012;Database=mydb;User Id= TestIDRestricted;Password=secretpasswd;"
' $ConnectionString = $ConnectionString + "Trusted_Connection = yes;Persist Security Info=False"