Так же, как я говорил о в этом ответе , основная проблема здесь в том, что 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, чтобы всегда получать текущий.