使用服务管理器 SDK 列出用户的所有事件

本文关键字:用户 事件 服务 管理器 SDK | 更新日期: 2023-09-27 17:50:27

我正在使用Service Manager/System Center 2012,Service Pack 1。 (版本 7.5.2905.0

我正在尝试做一些应该很简单的事情,但似乎没有关于如何实际执行查询的文档。 因此,我有一个用户对象(该用户的企业管理对象(,我想向服务管理器查询该用户是受影响用户的所有事件。

代码是:(从我找到的一个例子中(

            strIncidentSearchCriteria =
            String.Format(@"<Criteria xmlns=""http://Microsoft.EnterpriseManagement.Core.Criteria/"">
                               <Expression>                                            
                                  <SimpleExpression>
                                      <ValueExpressionLeft>
                                       <Property>$Context/Path[Relationship='WorkItem!System.WorkItemAffectedUser' TypeConstraint='System!System.Domain.User']/Property[Type='System!System.Domain.User']/UserName$</Property>
                                       </ValueExpressionLeft>
                                       <Operator>Equal</Operator>
                                      <ValueExpressionRight>
                                        <Value>" + user.FullName + @"</Value>
                                      </ValueExpressionRight>
                                  </SimpleExpression>
                               </Expression>                             
                            </Criteria>");
            EnterpriseManagementObjectCriteria emocWorkitem = new EnterpriseManagementObjectCriteria(incidentSearchCriteria, mpc, mp, emg);

这将引发异常:

The provided path ($Context/Path[Relationship='WorkItem!System.WorkItemAffectedUser' TypeConstraint='System!System.Domain.User']/Property[Type='System!System.Domain.User']/UserName$) was not valid.

参数名称:路径引用

我很确定属性字段是错误的,但似乎没有关于如何创建 XML 或如何指定属性或任何内容的文档。

如果我将搜索更改为:

    //strIncidentSearchCriteria = String.Format(@"<Criteria xmlns=""http://Microsoft.EnterpriseManagement.Core.Criteria/"">" +
    //                "<Expression>" +
    //                "<SimpleExpression>" +
    //                    "<ValueExpressionLeft>" +
    //                    "<Property>$Context/Property[Type='System.WorkItem.Incident']/Status$</Property>" +
    //                    "</ValueExpressionLeft>" +
    //                    "<Operator>NotEqual</Operator>" +
    //                    "<ValueExpressionRight>" +
    //                    "<Value>" + new Guid("2b8830b6-59f0-f574-9c2a-f4b4682f1681") + "</Value>" +  // Resolved
    //                    //Closed:"<Value>" + new Guid("bd0ae7c4-3315-2eb3-7933-82dfc482dbaf") + "</Value>" +
    //                    "</ValueExpressionRight>" +
    //                "</SimpleExpression>" +
    //                "</Expression>" +
    //            "</Criteria>");

(当然,没有注释掉(

另外,另一个问题:如果我执行上面的查询并返回所有已解决的匹配事件 - 它在能够枚举之前耗尽内存 - 显然,它是编写的,因此它将匹配的所有内容拉入列表或其他内容,然后您枚举它 - 而不是根据需要提取更多数据。 有什么办法可以拉动所有东西吗? (我最初的方法是提取所有内容,然后自己过滤 - 这是一次性的,如果需要,我可以花一个小时来忍受它。 (但是,对于长期项目,我还需要此查询,因此我确实需要知道如何查询影响给定用户的所有事件,然后查询分配的用户是 X 的所有事件,等等。 你从哪里学到这些东西??

谢谢

更新:

这个查询,失败了,我怎么让它工作。 (这是我最终试图开始工作的事情(

<Criteria xmlns="http://Microsoft.EnterpriseManagement.Core.Criteria/"> 
   <Expression>
      <And>
         <Expression>
            <SimpleExpression>
               <ValueExpressionLeft>
                  <Property>$Context/Property[Type='System.WorkItem.Incident']/Status$</Property>
               </ValueExpressionLeft>
               <Operator>NotEqual</Operator>
               <ValueExpressionRight>
                  <Value>2b8830b6-59f0-f574-9c2a-f4b4682f1681</Value>
               </ValueExpressionRight>
            </SimpleExpression>
         </Expression>
         <Expression>
            <And>
               <Expression>
                  <SimpleExpression>
                     <ValueExpressionLeft>
                        <Property>$Context/Property[Type='System.WorkItem.Incident']/Status$</Property>
                     </ValueExpressionLeft>
                     <Operator>NotEqual</Operator>
                     <ValueExpressionRight>
                        <Value>bd0ae7c4-3315-2eb3-7933-82dfc482dbaf</Value>
                     </ValueExpressionRight>
                  </SimpleExpression>
               </Expression>

          <Expression>
            <SimpleExpression>
              <ValueExpressionLeft>
                                <Property>$Context/Path[Relationship='WorkItem!System.WorkItemAssignedToUser' TypeConstraint='System!System.Domain.User']/Property[Type='System!System.Domain.User']/DisplayName$</Property>
              </ValueExpressionLeft>
                 <Operator>Like</Operator>
              <ValueExpressionRight>
                <Value>%Bill%</Value>
              </ValueExpressionRight>
            </SimpleExpression>
          </Expression>
            </And>       
      </And>
   </Expression>
</Criteria>
====

=== 更新和解决方案 =

=======

想通了,你必须告诉它事件类型的位置,所以这个查询有效:

<Criteria xmlns="http://Microsoft.EnterpriseManagement.Core.Criteria/"> 
   <Expression>
      <And>
         <Expression>
            <SimpleExpression>
               <ValueExpressionLeft>
                  <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/Status$</Property>
               </ValueExpressionLeft>
               <Operator>NotEqual</Operator>
               <ValueExpressionRight>
                  <Value>2b8830b6-59f0-f574-9c2a-f4b4682f1681</Value>
               </ValueExpressionRight>
            </SimpleExpression>
         </Expression>
         <Expression>
            <And>
               <Expression>
                  <SimpleExpression>
                     <ValueExpressionLeft>
                        <Property>$Context/Property[Type='CoreIncident!System.WorkItem.Incident']/Status$</Property>
                     </ValueExpressionLeft>
                     <Operator>NotEqual</Operator>
                     <ValueExpressionRight>
                        <Value>bd0ae7c4-3315-2eb3-7933-82dfc482dbaf</Value>
                     </ValueExpressionRight>
                  </SimpleExpression>
               </Expression>

          <Expression>
            <SimpleExpression>
              <ValueExpressionLeft>
                                <Property>$Context/Path[Relationship='WorkItem!System.WorkItemAssignedToUser' TypeConstraint='System!System.Domain.User']/Property[Type='System!System.Domain.User']/DisplayName$</Property>
              </ValueExpressionLeft>
                 <Operator>Like</Operator>
              <ValueExpressionRight>
                <Value>%Bill%</Value>
              </ValueExpressionRight>
            </SimpleExpression>
          </Expression>
            </And>       
         </Expression>
      </And>
   </Expression>
</Criteria>

使用服务管理器 SDK 列出用户的所有事件

我建议您了解类型投影... ¿为什么?因为类型投影类似于服务管理器中的视图。您注释的条件非常有效,因为您只使用一个简单的EnterpriseManagementObject并且他的属性System.WorkItem.Incident类中可用,而该类又存在于System.WorkItem.Incident.Library管理包中。代码引发的异常是正确的,因为他在事件类的基本定义中找不到该路径。

解决方案是什么?键入投影。

此路径:$Context/Path[Relationship='WorkItem!System.WorkItemAffectedUser' TypeConstraint='System!System.Domain.User']/Property[Type='System!System.Domain.User']/UserName$属于事件与受影响用户之间的关系。

因此,如果运行此查询,则可以找到此类型投影的名称:

SELECT
LT.ElementName,
LT.LTValue,
LT.MPElementId,
MP.MPName,
MP.MPFriendlyName,
MP.MPKeyToken,
MP.MPVersion
FROM 
LocalizedText LT 
INNER JOIN 
ManagementPack MP ON LT.ManagementPackId = MP.ManagementPackId
WHERE 
LT.ElementName like '%Incident.Projection%'
AND
LT.LanguageCode like '%ENU%'

您会发现正在搜索的类型投影的名称是System.WorkItem.Incident.ProjectionType,并且他位于ServiceManager.IncidentManagement.Library管理包中。

现在是时候去VS了。现在我们必须更改我们使用的对象(EnterpriseManagementObject (EnterpriseManagementObjectProjection这样:

     string strCriteria =
     String.Format(@"<Criteria xmlns=""http://Microsoft.EnterpriseManagement.Core.Criteria/"">
          <Expression>
            <SimpleExpression>
              <ValueExpressionLeft>
                <Property>$Context/Path[Relationship='WorkItem!System.WorkItemAffectedUser' TypeConstraint='System!System.Domain.User']/Property[Type='System!System.Domain.User']/UserName$</Property>
              </ValueExpressionLeft>
                 <Operator>Like</Operator>
              <ValueExpressionRight>
                <Value>%" + userName + @"%</Value>
              </ValueExpressionRight>
            </SimpleExpression>
          </Expression>
        </Criteria>");

        ManagementPack workItemMp = emg.GetManagementPack("System.WorkItem.Incident.Library", "31bf3856ad364e35", new Version("7.5.3079.0"));  // Incident MP
        ManagementPack projMp = emg.GetManagementPack("ServiceManager.IncidentManagement.Library", "31bf3856ad364e35", new Version("7.5.3079.0")); // <-- MP where Type Projection lives
        ManagementPackTypeProjection workItemRelConfigProj = emg.EntityTypes.GetTypeProjection("System.WorkItem.Incident.ProjectionType", projMp); // <-- Type Projection Name
        ObjectProjectionCriteria projCriteria = new ObjectProjectionCriteria(strCriteria, workItemRelConfigProj, projMp, emg);
        IObjectProjectionReader<EnterpriseManagementObject> reader = emg.EntityObjects.GetObjectProjectionReader<EnterpriseManagementObject>(projCriteria, ObjectQueryOptions.Default);
        if (reader != null && reader.Count > 0)
        {
            foreach (EnterpriseManagementObjectProjection obj in reader)
            {
                //TO DO
            }
        }

所以现在你的路径将完美运行,这将返回你想要的对象:-(。我希望这有所帮助。

来自智利的欢呼!