Информация хранится в элементе 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 может При переносе на любой компьютер командлеты устанавливаются только с консоли, поэтому я написал пример без них.