首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未在SCCM中更新的AppModel应用程序的属性

未在SCCM中更新的AppModel应用程序的属性
EN

Stack Overflow用户
提问于 2020-05-06 17:44:45
回答 1查看 90关注 0票数 0

我正在尝试通过C#代码更新AppModel应用程序的SDMPackageXML属性。SDMPackageXML是一个XML属性。我只需要在SDMPackageXML XML属性中更新一个名为AutoInstall的节点。下面是我的代码:

代码语言:javascript
复制
                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服务器上的任何内容。有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-12 22:03:11

这里的主要问题是微软使用了一种特殊的方法来序列化他们的in this answer。反序列化仍然可以使用默认的类,但是为了再次序列化,没有关于如何(我很确定这是可能的,但我没有足够的知识来做这件事)的文档,而是文档,他们为此提供了包装器类,这些类随SCCM控制台一起提供(位于控制台的安装文件夹的bin目录中)。

在本例中,这将是Microsoft.ConfigurationManagement.ApplicationManagement.dll.与powershell不同,在powershell中,似乎也加载了同一路径中的依赖项,您似乎还必须至少引用Microsoft.ConfigurationManagement.ApplicationManagement.TaskSequenceInstaller.dll。

还有一些类似Microsoft.ConfigurationManagement.ApplicationManagement.MsiInstaller.dll的dll,但是至少在我的测试中,上面的两个是唯一需要的,但是如果您注意到反序列化失败并出现"InvalidPropertyException“错误,您可能需要与您的特定应用程序类型匹配的dll。

引用了这两个dll后,您可以编写类似这样的代码(请注意,我也使用dll进行了反序列化,因为如果它已经加载,并且它创建了一个很好的应用程序对象来直接修改属性,那么为什么不呢?)然而,从技术上讲,这是不必要的。您可以像示例中那样进行反序列化,并且只使用序列化部分。

代码语言:javascript
复制
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引用应用程序可能有点棘手,因为如果您更新应用程序,应用程序的当前有效版本的id会发生变化(旧的id仍然可以用来引用较旧的版本)。因此,如果您更改了使用该ID获取的应用程序,然后使用相同的ID将其改回,则看起来只有第一次更改有效。我不知道这对您是否有问题(如果您只获取所有in,则每个应用程序只更改一次,这无关紧要),但如果是这样的话,您可以在WQL查询中使用应用程序的名称加上isLatest = 'true'来搜索应用程序,以始终获得最新的in。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61632045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档