代码之家  ›  专栏  ›  技术社区  ›  Mark J Miller

SMO ManagedComputer.ServiceInstances为空

  •  1
  • Mark J Miller  · 技术社区  · 15 年前

    我正在尝试使用SMO(VS2010,SQL Server 2008)连接到SQL Server并查看服务器协议配置。我可以连接并列出服务和clientprotocols以及运行mssqlserver服务的帐户。但是,serverInstances集合为空。目标服务器上的唯一实例是默认实例(mssqlserver),不应该在集合中吗?如何获取它的实例以便检查serverprotocols集合?下面是我使用的代码:

        class Program
    {
        static void Main(string[] args)
        {
            //machine hosting installed sql server instance
            ManagedComputer host = new ManagedComputer("fully-qualified.host.name");
    
    
            if (host.ServerInstances.Count != 0)
            {
                //why is this 0? Is it because only the DEFAULT instance exists?
                Console.WriteLine("/////////////// INSTANCES ////////////////");
                foreach (ServerInstance inst in host.ServerInstances)
                {
                    Console.WriteLine(inst.Name);
                }
            }
    
            Console.WriteLine("/////////////// SERVICES ////////////////");
            // enumerate sql services (looking for MSSSQLSERVER)
            foreach (Service svc in host.Services)
            {
                Console.WriteLine(svc.Name);
            }
    
            Console.WriteLine("/////////////// DETAILS ////////////////");
    
            // get name of MSSQLSERVER instance from user (pick from list above)
            Service mssqlserver = host.Services["MSSQLSERVER"];
    
            // print service account: .\{account} == "local account", "LocalSystem", "NetworkService", {domain}\{account} == "domain account"
            Console.WriteLine("Service Account: {0}", mssqlserver.ServiceAccount);
    
            // get client protocols
            foreach (ClientProtocol cp in host.ClientProtocols)
            {
                Console.WriteLine("{0} {1} ({2})", cp.Order, cp.DisplayName, cp.IsEnabled ? "Enabled" : "Disabled");
            }
    
        }
    }
    

    我也试过:

                Urn u = new Urn("ManagedComputer[@Name='fully-qualified.host.name']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']");
            ServerProtocol tcp = host.GetSmoObject(u) as ServerProtocol;
            if (tcp != null)
            {
                Console.WriteLine("{0}", tcp.DisplayName);
            }
    

    但我收到一条错误信息:“不支持子表达式”。有什么问题吗?

    2 回复  |  直到 12 年前
        1
  •  2
  •   oddbear    12 年前

    要在服务器实例列表中获取结果,需要显式设置:

    host.ConnectionSettings.ProviderArchitecture = ProviderArchitecture.Use64bit;

    host.ConnectionSettings.ProviderArchitecture = ProviderArchitecture.Use32bit;

        2
  •  0
  •   Mark J Miller    15 年前

    所以我一直没有找到答案,但我想出了一个解决办法。

                ManagedComputer host = new ManagedComputer(hostName);
    
            Server server = new Server();
            Console.WriteLine("TcpEnabled: {0}", server.TcpEnabled);
    

    这使我得到了我需要的,我更希望能够枚举服务器协议,但这将允许我验证非常最小。