Свойство приложения AppModel не обновляется в SCCM - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь обновить свойство SDMPackageXML приложения AppModel с помощью кода C#. SDMPackageXML - это свойство XML. Мне нужно обновить только один узел с именем AutoInstall в свойстве SDMPackageXML XML. Вот мой код:

                ObjectGetOptions opt = new ObjectGetOptions(null, System.TimeSpan.MaxValue, true);
                var path = new ManagementPath("SMS_Application.CI_ID=16777568");
                ManagementObject obj = new ManagementObject(scope, path, opt);
                obj.Get();
                foreach (PropertyData property in obj.Properties)
                {
                    if (property.Name == "SDMPackageXML")
                    {
                        //change the property value. Set AutoInstall to true
                        XmlDocument xml = new XmlDocument();

                        xml.LoadXml(property.Value.ToString());
                        var autoInstallTag = xml.GetElementsByTagName("AutoInstall");
                        autoInstallTag[0].InnerText = "false";
                        property.Value = xml.OuterXml;
                    }
                }
                obj.Put(); 

Проблема в том, что obj.Put(); ничего не обновляет на сервере SCCM. Может кто-то мне помочь, пожалуйста?

1 Ответ

0 голосов
/ 12 мая 2020

Так же, как я говорил о в этом ответе , основная проблема здесь в том, что Microsoft использует специальный метод для сериализации своих XML. Десериализация по-прежнему работает с использованием классов по умолчанию, но для повторной сериализации нет документации о том, как это сделать (я почти уверен, что это возможно, но я недостаточно осведомлен, чтобы это сделать). Вместо документации они предоставляют классы-оболочки для этого, которые поставляются с консолью SCCM (находится в каталоге bin папки установки консоли).

В данном случае это Microsoft.ConfigurationManagement.ApplicationManagement.dll. В отличие от PowerShell, где зависимости по одному и тому же пути кажутся загруженными, вам, похоже, также нужно ссылаться по крайней мере на Microsoft.ConfigurationManagement.ApplicationManagement.TaskSequenceInstaller.dll.

Существуют также другие библиотеки DLL с такими именами, как Microsoft.ConfigurationManagement.ApplicationManagement.MsiInstaller.dll, однако, по крайней мере, в моих тестах два указанных выше были единственными необходимыми, но если вы заметили сбой десериализации с "InvalidPropertyException" ошибок вам может понадобиться dll, соответствующая вашему типу приложения c.

С этими двумя ссылками на dll вы можете написать что-то вроде этого (обратите внимание, что я десериализовал с помощью dll, потому что почему бы и нет, если он уже загружен и он создает красивый объект приложения для непосредственного изменения свойств. Однако технически это не обязательно. Вы можете десериализовать, как в вашем примере, и использовать только часть сериализации.

ManagementObject obj = new ManagementObject(@"\\<siteserver>\root\SMS\site_<sitecode>:SMS_Application.CI_ID=<id>");
Microsoft.ConfigurationManagement.ApplicationManagement.Application app = Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer.DeserializeFromString(obj["SDMPackageXML"].ToString(), true);
app.AutoInstall = true;
obj["SDMPackageXML"] = Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer.SerializeToString(app, true);
obj.Put();

Теперь нужно помнить об одном: это может быть немного сложно ссылаться на приложения по их CI_ID, потому что, если вы обновите приложение, изменится идентификатор для действующей в настоящее время версии приложения (старый идентификатор все еще может использоваться для ссылки на более старую версию ision). Поэтому, если вы измените приложение, полученное с использованием идентификатора, а затем снова измените его с тем же идентификатором, это будет выглядеть так, как будто сработало только первое изменение. Я не знаю, является ли это проблемой для вас c (если вы просто получите все идентификаторы, измените каждое приложение только один раз, это не имеет значения), но если это так, вы можете искать приложение, используя его имя плюс isLatest = 'true' в запрос WQL, чтобы всегда получать текущий.

...