SMO(VS 2010、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);
}
しかし、「子式はサポートされていません」というエラーメッセージが表示されます。何が問題なのですか?