在 C# 中格式化 WQL 输出
Formatting a WQL Output in C#
我正在尝试构建一个查询,以列出 SCCM 中具有特定名称的所有已知计算机。
查询如下所示:
string query = string.Format("Select Name From SMS_R_System Where Name like '" + "%" + computerName + "%" + "'");
如果找到结果,它会将结果放入下拉框中。
在这些情况下我的问题,输出如下所示:
"instance of SMS_R_System{Name = "DC01";};"
当然,对于我们的用例,我们只需要 DC01
作为输出。
有什么建议吗?
ButtonEvent 的完整代码:
private void ChkBtn_Click(object sender, EventArgs e)
{
string computerName = PCDropDown.Text;
lBox.Items.Clear();
SmsNamedValuesDictionary namedValues = new SmsNamedValuesDictionary();
WqlConnectionManager connection = new WqlConnectionManager(namedValues);
// Connect to remote computer.
try
{
connection.Connect(PrimarySiteServer.ToString());
// Set the query.
string query1 = string.Format("Select Name From SMS_R_System Where Name like '" + "%" + computerName + "%" + "'");
string query2 = string.Format("Select * From SMS_UserMachineRelationship WHERE ResourceName like '" + "%" + computerName + "%" + "' AND IsActive = '1' AND Types = '1'");
// Get the query results
IResultObject queryResults = connection.QueryProcessor.ExecuteQuery(query1);
// Check for results and display in infobox
bool resultsFound = false;
foreach (IResultObject queryResult in queryResults)
{
resultsFound = true;
lBox.Items.Add("Rechner ist vorhanden");
PCDropDown.Items.Add(queryResult.ToString());
}
if (resultsFound == false)
{
lBox.Items.Add("Rechnername nicht gefunden");
}
}
catch
{
MessageBox.Show("No Connection to Config-Manager - Als ZZA ausgeführt? SCCM-Servername richtig?");
}
}
而不是像您在此处那样添加 queryResult.ToString():
PCDropDown.Items.Add(queryResult.ToString());
您需要添加正确的查询结果字段,所以在这种情况下:
PCDropDown.Items.Add(queryResult["Name"].StringValue);
还有一个简短的说明。我不知道你在为谁写这篇文章以及下一步是什么,但如果这是一个只供 SCCM 管理员使用的只读应用程序,我会考虑忽略 WMI 并通过 SQL 转到 SCCM 数据库反而。它要快得多,SQL 有更强大的查询选项,它不需要集成那些奇怪的 sccm 控制台 Dll(尽管 WMI 也不是 100% 必需的)。
如果您需要写入权限来创建设备或集合等,或者您需要使用 sccm 访问权限系统实现的角色,但是 WMI 是更好的或唯一的选择。 (在这种情况下,我宁愿真正使用那些奇怪的 dll,因为所有 MS 示例都依赖于它们,并且很难将这些教程转换为 C# 提供的普通 WMI 解决方案。
我正在尝试构建一个查询,以列出 SCCM 中具有特定名称的所有已知计算机。 查询如下所示:
string query = string.Format("Select Name From SMS_R_System Where Name like '" + "%" + computerName + "%" + "'");
如果找到结果,它会将结果放入下拉框中。
在这些情况下我的问题,输出如下所示:
"instance of SMS_R_System{Name = "DC01";};"
当然,对于我们的用例,我们只需要 DC01
作为输出。
有什么建议吗?
ButtonEvent 的完整代码:
private void ChkBtn_Click(object sender, EventArgs e)
{
string computerName = PCDropDown.Text;
lBox.Items.Clear();
SmsNamedValuesDictionary namedValues = new SmsNamedValuesDictionary();
WqlConnectionManager connection = new WqlConnectionManager(namedValues);
// Connect to remote computer.
try
{
connection.Connect(PrimarySiteServer.ToString());
// Set the query.
string query1 = string.Format("Select Name From SMS_R_System Where Name like '" + "%" + computerName + "%" + "'");
string query2 = string.Format("Select * From SMS_UserMachineRelationship WHERE ResourceName like '" + "%" + computerName + "%" + "' AND IsActive = '1' AND Types = '1'");
// Get the query results
IResultObject queryResults = connection.QueryProcessor.ExecuteQuery(query1);
// Check for results and display in infobox
bool resultsFound = false;
foreach (IResultObject queryResult in queryResults)
{
resultsFound = true;
lBox.Items.Add("Rechner ist vorhanden");
PCDropDown.Items.Add(queryResult.ToString());
}
if (resultsFound == false)
{
lBox.Items.Add("Rechnername nicht gefunden");
}
}
catch
{
MessageBox.Show("No Connection to Config-Manager - Als ZZA ausgeführt? SCCM-Servername richtig?");
}
}
而不是像您在此处那样添加 queryResult.ToString():
PCDropDown.Items.Add(queryResult.ToString());
您需要添加正确的查询结果字段,所以在这种情况下:
PCDropDown.Items.Add(queryResult["Name"].StringValue);
还有一个简短的说明。我不知道你在为谁写这篇文章以及下一步是什么,但如果这是一个只供 SCCM 管理员使用的只读应用程序,我会考虑忽略 WMI 并通过 SQL 转到 SCCM 数据库反而。它要快得多,SQL 有更强大的查询选项,它不需要集成那些奇怪的 sccm 控制台 Dll(尽管 WMI 也不是 100% 必需的)。
如果您需要写入权限来创建设备或集合等,或者您需要使用 sccm 访问权限系统实现的角色,但是 WMI 是更好的或唯一的选择。 (在这种情况下,我宁愿真正使用那些奇怪的 dll,因为所有 MS 示例都依赖于它们,并且很难将这些教程转换为 C# 提供的普通 WMI 解决方案。