如何以编程方式查询SCCM 2012应用程序是处于活动状态还是已停用状态

时间:2013-05-24 11:51:29

标签: wmi-query sccm

我们有一个与SCCM 2012集成的应用程序,并将自定义SCCM应用程序保存到SCCM。

我遇到的问题是,当SCCM管理员将应用程序设置为处于退役状态时,尝试保存我们的自定义应用程序会导致我们的应用程序无法通过保存过程。

我希望能够查询SCCM应用程序状态,以便在我们尝试保存操作之前确定给定的应用程序是处于活动状态还是已退役。

我在SMS_Application Server WMI帮助或任何其他页面中找不到对“已退役”状态的引用: http://msdn.microsoft.com/en-us/library/hh949251.aspx

我注意到有一个Restore()方法,看起来它会将Retired包的状态改回Active,但这不是我想做的。

有人可以帮我确定如何查找应用程序当前状态吗?

感谢。

1 个答案:

答案 0 :(得分:1)

SCCM 2012 PowerShell cmdlet中有一种方法似乎正在检索过期状态。这是c#代码(从SCCM服务器上的dll AppUI.PS.AppMan.dll反编译)

    private bool IsApplicationRetired(IResultObject applicaction)
    {
        IResultObject[] resultObjectArray = null;
        int integerValue = applicaction["CI_ID"].IntegerValue;
        object[] objArray = new object[] { integerValue };
        resultObjectArray = base.ExecuteQuery(string.Format(CultureInfo.InvariantCulture, "SELECT * FROM SMS_Application WHERE CI_ID = {0}", objArray));
        IResultObject[] resultObjectArray1 = resultObjectArray;
        int num = 0;
        if (num < (int)resultObjectArray1.Length)
        {
            IResultObject resultObject = resultObjectArray1[num];
            this.isApplicationRetired = resultObject["IsExpired"].BooleanValue;
        }
        if (this.isApplicationRetired)
        {
            object[] objArray1 = new object[] { integerValue };
            IResultObject instance = base.ConnectionManager.GetInstance(string.Format(CultureInfo.InvariantCulture, "SMS_Application.CI_ID={0}", objArray1));
            if (instance != null)
            {
                string stringValue = instance["ModelName"].StringValue;
                instance.Dispose();
                object[] objArray2 = new object[] { base.ConnectionManager.EscapeQueryString(stringValue, ConnectionManagerBase.EscapeQuoteType.SingleQuote) };
                resultObjectArray = base.ExecuteQuery(string.Format(CultureInfo.InvariantCulture, "SELECT CI_ID FROM SMS_Application WHERE ModelName = '{0}' AND IsLatest = 1 AND IsExpired = 0", objArray2));
                IResultObject[] resultObjectArray2 = resultObjectArray;
                int num1 = 0;
                if (num1 < (int)resultObjectArray2.Length)
                {
                    IResultObject resultObject1 = resultObjectArray2[num1];
                    if (resultObject1["CI_ID"].IntegerValue != integerValue)
                    {
                        this.isApplicationRetired = false;
                    }
                }
            }
        }
        return this.isApplicationRetired;
    }