如何在不启用命名管道的情况下使用invoke-sqlcmd?

use*_*104 5 sql-server powershell

我使用的脚本加载以下SQL Server 2008 R2 powershell插件

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
Run Code Online (Sandbox Code Playgroud)

然后我像这样用户调用-sql:

Invoke-Sqlcmd -Query "select * from table" -ServerInstance xyz -Database abc -username xxxxxx -password yyyyyyy
Run Code Online (Sandbox Code Playgroud)

我正在使用方法在我们的数据库上运行许多升级脚本.我很高兴在我们的dev\test环境中使用它,但后来我在生产中尝试了它,结果发现我们在服务器配置上有所不同.在我们的prod服务器上,由于安全原因(显然是蠕虫攻击)而禁用了命名管道,而我们的DBA不想启用.

这是我得到的错误,研究表明它是一个命名管道问题 - 当我启用它们时开始工作.

INFO ERROR:Invoke-Sqlcmd:与服务器成功建立连接,但在登录过程中发生错误.(提供者:共享内存提供者,错误:0 - 管道的另一端没有进程.)

有谁知道是否有某种方法来切换我的脚本,以便它不需要命名管道?或者这是invoke-sqlcmd的内置连接方法,我需要更改大头钉(如果有任何建议).

gra*_*der 1

这是一个有根据的猜测。但这里是这样的:

我认为你必须使用注册表“覆盖默认值”。

http://support.microsoft.com/kb/229929

现在,最简单的方法(IIRC)是通过你的

Control Panel / ODBC Data Source / System DSN.
Run Code Online (Sandbox Code Playgroud)

添加“Sql 服务器”。(不是本机客户端)。

最重要的按钮是“客户端配置”,您可以在其中选择命名管道或 tcp/ip。
尝试一下DSN方法,完成向导后,查看下面的注册表项

HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\Client\ConnectTo
Run Code Online (Sandbox Code Playgroud)

…………

你可以看看这个:

http://sev17.com/2012/11/05/cloning-sql-servers-to-a-test-environment/

寻找这个代码。

sqlcmd -S myCMServerInstance -d msdb -Q $query -h -1 -W |
foreach { Set-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftMSSQLServerClientConnectTo' -Name $($_ -replace 'TEST') -Value "DBMSSOCN,$_" }

}
Run Code Online (Sandbox Code Playgroud)