无法连接到数据库服务器.如何使用 Powershell 和集成安全性连接到不在本地主机上的数据库



我的问题的背景

在任何时候,我都期待着穿着黑色西装和黑色太阳镜的安全人员来带我走,因为我所有的sql服务器登录尝试......

我使用并改编了iris classon的示例,通过Powershell连接到数据库。 改编的代码使用集成安全性=真">

$dataSource = my_enterprise_db_server
$database = my_db
$connectionString = "Server=$dataSource;Database=$database;Integrated Security=True;" 
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$table = new-object “System.Data.DataTable”
$query = "..."
$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText  = $query
...

热狗工作。 谢谢艾瑞斯。

我阅读了管理单元与执行 sql 命令的导入模块 sqlps 方式的对比。 我还阅读了迈克尔·索伦斯在他的回答中提供的所有链接。我可以挂载一个 sqlserver 连接 mount mydb SQLSERVER SQLSERVER:SQL ,使用 ls 或 dir,沿着对象走路径等。 我还修改了 Iris 提供的主要部分

$table = Invoke-Sqlcmd –Server $dataSource –Database $database -Query $query

此版本的 Invoke-Sqlcmd 允许我连接到"企业"数据库。 提供的所有引用的问题在于,它们希望您使用本地主机sqlexpress数据库。 我尝试使用的那一刻

Set-Location SQLSERVER:SQLmy_enterprise_db_servermy_db

或类似的结构,我收到一条以

。警告: 无法获取 SQL 服务器服务信息。尝试连接到"my_enterprise_db_server"上的 WMI 失败,出现以下错误:访问被拒绝。(HRESULT的例外:0x80070005(E_ACCESSDENIED((

我还看到提到了SQLCMDSERVER和SQLCMDDBNAME环境变量。我将这些设置为

$env:SQLCMDDBNAME = "my_db"
$env:SQLCMDSERVER = "my_enterprise_db_server"
set-location sqlserver:sql
ls

生产

MachineName                     
-----------                     
localhost   

问题

如何正确对不驻留在本地计算机上的数据库使用设置位置或新 PSDrive-Name?

我通过一条偶然的路线找到了答案。 我右键单击了sql服务器管理工作室中的数据库对象。 有一个选项可以启动Powershell。 尽管这看起来像订单 sqlps 选项,但 SSMS 为我提供了设置位置的正确方法。

选项 1.如果服务器没有实例,则在斜杠路径中的server_name后添加 DEFAULT。

Set-Location SQLSERVER:SQLserver_nameDEFAULTDatabasesdatabase_nameTablesdbo.table_name

选项 2.如果您有一台带有实例的服务器,则在斜杠路径中的server_name后设置实例名称。

Set-Location SQLSERVER:SQLserver_nameinstance_nameDatabasesdatabase_nameTablesdbo.table_name

就数据库安全性而言,我只是一个凡人。 SSMS 的许多功能都关闭了,因为我的安全设置与 dba 安全设置的配置方式有关。 我一直在 SSMS 中收到错误。 好吧,这与使用设置位置的Powershell没有什么不同。 我没有意识到由于安全策略配置与飞行员错误而相关的两条错误消息。 如果我为表设置位置,那么我只有两个拒绝访问的警告。如果我将位置设置为数据库级别,则 Powershell 会吹块一段时间,但我有我的斜杠路径设置。 如果我使用Invoke-SqlCmd,我看不到错误。 我现在看到,Powershell 中呈现安全错误的方式是我认为尝试连接到数据库的方式存在问题的原因。 现在我可以这样做:

mount rb SELSERVER SQLSERVER:SQLserver_nameDEFAULTDatabasesdatabase_nameTables
# Look at a list of tables.
ls
# Go to a traditional file system
cd F:
# Go to the Linux Style mounted file system
cd rb:
# Go to a table like a directory
cd dbo.my_table_name
# Look at the column names
ls
# Use relative navigation
cd ..dbo.my_other_table_name
ls
# Compare column names with another table using relative navigation after I have just
# listed the current directory/table that I am in.
ls ..dbo.my_table_name

那只是摇滚! 现在我需要做的就是想出一个服务器名称和数据库的数组,为我可以连接到的所有数据库创建挂载点。 像这样的数组只是乞求迭代来创建所有挂载点。

最新更新