SMS_Application WMI类在SCCM数据库中的对应表。

问题描述 投票:0回答:1

我的System Center Configuration Manager(SCCM)控制台中有一个AppModel应用程序。请看下面的SCCM应用程序的属性窗口截图。

enter image description here

我需要知道 "Allow this application to be installed from the Install Application task sequence... "复选框的值。它以黄色高亮显示。

我试着通过wbemtest工具使用下面的细节来获得它。

Namespace: root\sms\site_[siteCode] e.g. root\sms\site_lab
Query: select * from SMS_Application

我希望我已经为AppModel CM应用程序找到了正确的Windows Management Instrumentation(WMI)类。

但是在wbemtest工具中的输出结果中并没有给出任何可以反映复选框当前状态的字段。

Instance of SMS_Application
{
    ApplicabilityCondition = "";
    CategoryInstance_UniqueIDs = {};
    CI_ID = 16777532;
    CI_UniqueID = "ScopeId_6AFF9AA6-E784-4BB8-8DCF-816FCF7A7C09/Application_8e417c4c-da5d-4f1c-91af-ed63d63f9a62/3";
    CIType_ID = 10;
    CIVersion = 3;
    CreatedBy = "NTL\\administrator";
    DateCreated = "20190724122559.000000+000";
    DateLastModified = "20200422051705.000000+000";
    EULAAccepted = 2;
    EULAExists = FALSE;
    ExecutionContext = 0;
    Featured = 0;
    HasContent = TRUE;
    IsBundle = FALSE;
    IsDeployable = TRUE;
    IsDeployed = FALSE;
    IsEnabled = TRUE;
    IsExpired = FALSE;
    IsHidden = FALSE;
    IsLatest = TRUE;
    IsQuarantined = FALSE;
    IsSuperseded = FALSE;
    IsSuperseding = FALSE;
    IsUserDefined = TRUE;
    IsVersionCompatible = TRUE;
    LastModifiedBy = "NTL\\estateadministrator";
    LocalizedCategoryInstanceNames = {};
    LocalizedDescription = "";
    LocalizedDisplayName = "7-Zip 19.00 (x64 edition)";
    LocalizedInformativeURL = "";
    LocalizedPropertyLocaleID = 65535;
    LogonRequirement = 0;
    Manufacturer = "";
    ModelID = 16777500;
    ModelName = "ScopeId_6AFF9AA6-E784-4BB8-8DCF-816FCF7A7C09/Application_8e417c4c-da5d-4f1c-91af-ed63d63f9a62";
    NumberOfDependentDTs = 0;
    NumberOfDependentTS = 0;
    NumberOfDeployments = 0;
    NumberOfDeploymentTypes = 1;
    NumberOfDevicesWithApp = 0;
    NumberOfDevicesWithFailure = 0;
    NumberOfSettings = 0;
    NumberOfUsersWithApp = 0;
    NumberOfUsersWithFailure = 0;
    NumberOfUsersWithRequest = 0;
    NumberOfVirtualEnvironments = 0;
    PermittedUses = 0;
    PlatformCategoryInstance_UniqueIDs = {};
    PlatformType = 1;
    SDMPackageVersion = 3;
    SecuredScopeNames = {"Default"};
    SedoObjectVersion = "9B99BA03-D0FA-417C-8BFF-6095B88AD179";
    SoftwareVersion = "";
    SourceCIVersion = 0;
    SourceModelName = "";
    SourceSite = "LAB";
    SummarizationTime = "20200422125059.533000+***";
};

是不是WMI类没有暴露这个WMI类所支持的数据库的所有列。因此,我正在寻找SCCM DB的SQL DB表,以便直接在DB级查询。谁能在这方面帮帮我?

更新: 我还需要一个可以更新的表,来设置重设与UI上显示的复选框对应的布尔字段。

wmi sccm wmi-query
1个回答
1
投票

这些信息存储在 WMI 中一个名为 SDMPackageXML 的 XML 元素中。控制台使用的对应表是fn_listApplicationCIs_List(1031)(它也存在于fn_listApplicationCIs(1031)中,我目前不确定这里的具体区别是什么),其中它被称为SDMPackageDigest。该元素被简单地称为 "AutoInstall",并且只有在设置为true时才会出现。用WQL查询它是不可能的,但是在脚本中,它可以通过不使用查询而是在SMS_Application对象上使用Get()来完成(因为SDMPackageXML是一个懒惰的属性),然后解析XML。

然而在SQL中,可以直接查询列的XML部分,就像这样。

SELECT 
    DisplayName, 
    CI_UniqueID 
FROM 
    fn_ListApplicationCIs_List(1031) app 
WHERE
    app.isLatest = 1 
AND 
    app.SDMPackageDigest.value('declare namespace p1="http://schemas.microsoft.com/SystemCenterConfigurationManager/2009/AppMgmtDigest";(p1:AppMgmtDigest/p1:Application/p1:AutoInstall)[1]', 'nvarchar(max)') = 'true'

(isLatest是必要的,以丢弃旧版本的应用程序).也可以用这种语法在select中包含该值,只是要记住,它将对所有启用TS部署的应用程序为真,对其他应用程序为NULL。

现在关于如何更新。SCCM DB应该 从来没有 被写入。我不知道是否可以通过这种方式来实现改变(可能是WMI总是领先的,会覆盖它),而且由于这一切都没有记录在案,可能必须在特定的地方或多个地方同时进行改变。如果必须更新,你必须求助于脚本,可以与懒惰的WMI属性一起工作。然而我不知道有一种方法是不依赖于SCCM特定的dlls(并不意味着没有,但我不知道如何与XML足够好的工作),所以你将需要Microsoft.ConfigurationManagement.ApplicationManagement.dll从一个ConfigMgr控制台安装dir的bin目录。(我写的代码,所以它会自动找到它在安装控制台的计算机上)。然后你就可以这样做了(当然也可以用for包起来)。

[System.Reflection.Assembly]::LoadFrom((Join-Path (Get-Item $env:SMS_ADMIN_UI_PATH).Parent.FullName "Microsoft.ConfigurationManagement.ApplicationManagement.dll"))
$app = gwmi -computer <siteserver> -namespace root\sms\site_<sitecode> -class sms_application -filter "LocalizedDisplayName='<appname>' and isLatest = 'true'"
$app.Get()
$sdmPackageXML = [Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer]::DeserializeFromString($app.SDMPackageXML, $true)
$sdmPackageXML.AutoInstall = $true
$app.SDMPackageXML = [Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer]::SerializeToString($sdmPackageXML, $true)
$app.Put()

好的一点是,即使xml中没有AutoInstall属性,这个反序列化也会给我们提供一个AutoInstall属性,因为它是为sccm写的,所以我们可以根据自己的需要把它设置为trueefalse。

我们需要.dll的原因是序列化。反序列化也可以通过简单的投向[xml]来完成,但我不知道如何再序列化。如果能做到这一点,就不需要外部的dll了。然而xml的操作就不那么容易了)。

如果你在有sccm控制台的机器上运行这段代码,你也可以跳过wmi部分,使用sccm ps commandlets中的Get-CMApllication(也包含SDMPackageXML),但是虽然dll可以被移动到任何计算机上,cmdlet只和控制台一起安装,所以我写的示例没有它们。

© www.soinside.com 2019 - 2024. All rights reserved.