我正在尝试通过C#代码更新AppModel应用程序的SDMPackageXML属性。SDMPackageXML是一个XML属性。我只需要在SDMPackageXML XML属性中更新一个名为AutoInstall的节点。下面是我的代码:
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服务器上的任何内容。有人能帮帮我吗?
发布于 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进行了反序列化,因为如果它已经加载,并且它创建了一个很好的应用程序对象来直接修改属性,那么为什么不呢?)然而,从技术上讲,这是不必要的。您可以像示例中那样进行反序列化,并且只使用序列化部分。
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。
https://stackoverflow.com/questions/61632045
复制相似问题