我需要我的c#程序运行cmd查询以显示所有sql服务,然后在消息框中显示它们。在这种情况下,我经常会遇到这个问题,并且每次都可能有不同的名称。
“ Wmic服务(其中的路径名(例如'%Binn \ sqlservr%')获取标题,名称)显示我需要的信息,但有多行返回。 WriteNote()方法是一种将信息写入程序中文本框的方法。
我已尽我所能在Google上找到的所有内容,但似乎无济于事。
private void DoListSQLServices()
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
//startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "Wmic service where (PathName like '%Binn\\sqlservr%') get caption, name";
process.StartInfo = startInfo;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
process.Start();
string output = process.StandardOutput.ReadToEnd();
this.WriteNote(output);
process.WaitForExit();
}
当我运行此代码时,我得到了:
Microsoft Windows [版本6.1.7601] 版权所有(c)2009 Microsoft Corporation。保留所有权利。
{项目的文件位置} \ bin \ Debug>
,然后将一个pbd文件放入调试文件夹。
我想要的是显示SQL服务的标题和名称,就像您通过cmd手动运行该命令一样。最终,用户将在其中键入一个以便程序重新启动它们,但我宁愿让程序显示列表,而不是让用户转到Windows中的“服务”并手动搜索它们。
谢谢!
答案 0 :(得分:0)
正如Noodles在评论中所提到的,最好通过.NET中的WMI支持来做到这一点。一种比较直接的方法是使用ManagementObjectSearcher
类对WMI数据执行ObjectQuery
。
创建一个新的控制台应用程序。向System.Management
程序集添加引用,并将using System.Management;
添加到program.cs
文件的顶部。
现在添加以下代码:
static void Main()
{
// Create a scope (connection to WMI)
var scope = new ManagementScope(@"\\localhost\root\cimv2");
// Create query
var query = new ObjectQuery(@"SELECT Name,Caption FROM Win32_Service WHERE PathName like '%Binn\\sqlserv%'");
// Create a search to run the query against the scope
using (var search = new ManagementObjectSearcher(scope, query))
{
// Iterate through the query results
foreach (var item in search.Get())
{
// get values, all strings in this case
string name = (string)item["Name"];
string caption = (string)item["Caption"];
Console.WriteLine("{0}\t{1}", name, caption);
}
}
}
请注意,ObjectQuery
查询语法与WMIC语法略有不同。它被称为WQL(WMI查询语言),并且在SQL上进行了严格的建模。
希望您可以轻松地将以上内容用于自己的用途。请注意您要获取的字段的实际类型。 Here's a list的Win32_Service对象的属性。