AppModel应用程序的属性在SCCM中没有得到更新。

问题描述 投票:0回答:1

我正在尝试更新 SDMPackageXML 属性。SDMPackageXML 是一个XML属性。我只需要更新一个名为--------的节点。AutoInstallSDMPackageXML 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服务器上没有任何更新。谁能帮帮我好吗?

c# sccm
1个回答
0
投票

因此,类似于我所说的 在这个答案中 这里的主要问题是微软使用一种特殊的方法来序列化他们的XML。反序列化仍然可以使用默认的类,但要再次序列化,没有任何文档说明如何进行(我很确定这是可能的,但我没有足够的知识去做),而不是文档,他们提供了包装类,这是与SCCM控制台一起提供的(位于控制台的安装文件夹的bin目录下)。

在这种情况下,这将是Microsoft.ConfigurationManagement.ApplicationManagement.dll。不像在 powershell 中,同一路径中的依赖关系似乎也会被加载,你似乎也必须至少引用 Microsoft.ConfigurationManagement.ApplicationManagement.TaskSequenceInstaller.dll。

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

有了这两个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来引用应用程序可能会有点麻烦,因为如果你更新了应用程序,当前有效版本的应用程序的id就会改变(旧的id仍然可以用来引用旧的版本)。因此,如果你改变了使用ID得到的应用程序,然后用相同的ID把它改回来,它看起来就会像只有第一次的改变有效。我不知道这对你来说是否有问题(如果你只是得到所有的ID,然后只改变每个应用程序一次,这应该没有问题),但如果有问题,你可以使用他们的名字和搜索应用程序。isLatest = 'true' 在WQL查询中,总是得到当前的一个。

© www.soinside.com 2019 - 2024. All rights reserved.