Freigeben über


隐藏SSMS和Visual Studio上广播的SQL Server服务器名

一、 问题描述

在某些情况下,我们可能不希望将重要的SQL Server的服务器名在一些SQL的工具中广播出来 (如图1)。本篇我们将介绍如何从SSMS(SQL Server Management)和Visual Studio中隐藏SQL Server的服务器名。

 

(图1)

 

二、解决过程及原理解释

 

为了实现上述目的,我们首先尝试了打开SQL Server 配置管理器的”HideInstance”标志,但不起作用。(参考:https://msdn.microsoft.com/cnh-zh/library/ms179327.aspx)   

之后,我们试着关闭SQL Server 浏览器服务(SQL browser)来隐藏服务器名,但仍旧没有作用。

于是,我们做了许多测试来查找服务器名的来源,最后终于可以重现这个问题的症状。经过研究,我们发现,这些工具如SSMS是通过两种机制来获取服务器名的:

一种是通过监听UDP 1434端口(即,基于SSRP的机制)。这种机制会发送包括SQL Server版本的全部数据给客户端。第二种机制是通过询问域里的Master Browser服务然后获取一个列表。这种方式只有服务器名而不包含版本或实例名的信息。获取之后列表会被排序并合并,显示在SSMS中。

在我们的问题中,由于我们的SQL Server浏览器被关闭了,获取服务器名采用的是第二种机制。更具体地说,第二种机制是通过调用NetServerEnum函数来进行的。(NetServerEnum函数能够列出对域可见的某种指定类型的所有服务器。关于NetServerEnum函数的详细说明,请参考:https://msdn.microsoft.com/en-us/library/aa370623(VS.85).aspx

当在一台服务器上安装了SQL Server,服务器首先会将自己标志为SQL Server,然后通知Master Browser。Master Browser将会缓存该信息。当NetServerEnum函数从列表中请求时,Master Browser将会返回该信息。

我发现一开始之所以不能重现这个现象,是因为在我的域中,所有的Computer Browser服务都被禁用了。因此,SSMS得不到第二个列表,而只能通过SQL浏览器使用基于SSRP的机制。

我在虚拟服务器上新建了一个域,并打开了Computer Browser服务,从而得以重现这个问题。在咨询了我们的AD和Network工作组之后,得知Master Browser的这种行为就是这样设计的,我们并不能从Master Browser的缓存中过滤SQL Server的服务器名。

隐藏服务器名的唯一做法,是通过Group Policy(组策略),将域中所有机器的Computer Browser服务关闭,并在要隐藏的SQL服务器上打开”HideInstance”标志。

然而,如果您有机器是在Workgroup而不是在域中,那么您将不能使用Group Policy,而只能手动停止这些机器上的Computer Browser服务了。这是因为,如果您有开启着Computer Browser的机器,那么他们中的一台将会被选作Master Browser并自动缓存服务器名列表。

另外请注意,禁用Computer Browser服务可能会有一些副作用,因为有些应用程序(比如,Symantec Antivirus software)可能需要使用该浏览器服务。在服务被禁用时,它们也许不能正常运作。所以您需要检查如果禁用您环境中的所有Computer Browser服务是否可行。

 

三、执行步骤

 

下面是通过Group Policy禁用Computer Browser服务的步骤:

1.  确保您正在编辑的是“Default Domain Policy(默认域策略)”

2.  展开Computer Configuration –> Windows Settings -> Security Settings -> System Services -> 在右边的面板中,找到Computer Browser服务,双击,设定这个策略,然后将其开启类型设置为Disable(禁用)。

3.  保存所有设置,退出。

4.  运行“gprpdate/force”应用新策略。

Comments

  • Anonymous
    September 21, 2012
    在SQL2000中直接有一个隐藏服务器的选项,选上就行了,但在SQL2008中找不到这个选项了,我想直接修改SQL服务器监听端口应该也可以实现隐藏服务器的目的吧?