Эквивалентная таблица класса WMI SMS_Application в базе данных SCCM - PullRequest
0 голосов
/ 22 апреля 2020

У меня приложение AppModel в консоли System Center Configuration Manager (SCCM). Ниже приведен скриншот окна свойств приложения SCCM:

enter image description here

Мне нужно знать значение «Разрешить установку этого приложения из Установить последовательность задач приложения ..... '. Он выделен желтым цветом.

Я попытался получить его с помощью инструмента wbemtest, используя следующие сведения:

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

Надеюсь, у меня правильный класс Windows Management Instrumentation (WMI) для приложений AppModel CM.

Но вывод в инструменте 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. Следовательно, я ищу таблицу SQL БД SCCM DB, чтобы я мог запросить ее непосредственно на уровне БД. Может ли кто-нибудь помочь мне в этом отношении?

Обновление : мне также нужна таблица, которую я могу обновить, чтобы установить / сбросить логическое поле, соответствующее флажку, показанному в пользовательском интерфейсе.

1 Ответ

1 голос
/ 23 апреля 2020

Информация хранится в элементе XML SDMPackage XML в WMI. Соответствующей таблицей, используемой консолью, является fn_listApplicationCIs_List (1031) (она также присутствует в fn_listApplicationCIs (1031). В настоящий момент я не уверен, в чем именно заключается разница), где она называется SDMPackageDigest. Элемент просто называется «AutoInstall», и он присутствует, только если установлено значение true. Запросить его с помощью WQL невозможно, однако в сценарии это можно сделать, не используя запрос, а Get () для объекта SMS_Application (поскольку SDMPackage XML является ленивым свойством), а затем проанализировав 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 не должна никогда записываться в. Я не знаю, возможно ли вообще добиться такого изменения (может быть, WMI всегда лидирует и будет перезаписывать его), и, поскольку все это недокументировано, это может быть связано с тем, что изменения должны быть сделаны при задании c места или несколько мест одновременно. Если это необходимо обновить, вы должны прибегнуть к сценариям, которые могут работать со свойствами ленивых WMI. Однако я не знаю способа, который не зависит от спецификаций SCCM c dlls (это не значит, что их нет, но я не знаю, как работать с XML достаточно хорошо для этого), поэтому вам понадобится Microsoft. ConfigurationManagement.ApplicationManagement.dll из каталога bin каталога установки консоли ConfigMgr. (Я написал код, чтобы он автоматически находил его на компьютере, на котором установлена ​​консоль). Затем вы можете сделать это следующим образом (конечно, можно также обернуть в 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()

Приятно то, что эта десериализация всегда предоставляет нам свойство AutoInstall, даже если его нет в xml потому что он был написан для sccm, поэтому мы можем просто установить его в true / false, как нам захочется.

Причина, по которой нам нужен .dll, - сериализация. Десериализацию также можно выполнить с помощью простого приведения к [xml], но я не уверен, как его можно сериализовать снова. Если это можно сделать, нет необходимости во внешних библиотеках. (Однако манипулирование xml не так просто).

Если вы все равно запустите этот код на машине с консолью sccm, вы также можете пропустить часть wmi и использовать Get-CMApllication из командлетов sccm ps (также содержит SDMPackage XML), однако пока dll может При переносе на любой компьютер командлеты устанавливаются только с консоли, поэтому я написал пример без них.

...