如何使用 WMI 读取和写入Configuration Manager站点控制文件
在 Configuration Manager 中,使用 Windows Management Instrumentation (WMI) 使用 SMS_SiteControlFile
类方法写入站点控制文件。
使用 WMI 写入站点控制文件时,使用会话句柄来标识应用程序。 这用于管理文件的并发更新。
完成对站点控制文件的写入后,必须提交更改。
SMS_SiteControlFile 具有以下方法来管理对站点控制文件的更改。
方法 | 说明 |
---|---|
CommitSCF |
将更改应用到 Configuration Manager 数据库。 |
RefreshSCF |
使用来自 Configuration Manager 数据库的任何最新更改刷新站点控制文件的内存中副本。 |
GetSessionHandle |
获取站点控制文件和会话句柄的内存中副本。 将会话句柄置于传递给所有IWbemServices 方法的 对象中IWbemContext 。 |
ReleaseSessionHandle |
释放站点控制文件的内存中副本以及与会话句柄关联的任何资源。 |
警告
在使用 SMS 提供程序类修改站点配置之前,应具有管理站点配置的经验。 通过更改一些可配置项,可能会对站点造成极大的伤害。 应格外小心,或完全避免使用 SMS_SCI_FileDefinition
和 SMS_SCI_SiteDefinition
类。 这些类管理站点控制文件本身。 如果不小心,则可以使站点无用。
写入站点控制文件
设置与 SMS 提供程序的连接。 有关详细信息,请参阅 SMS 提供程序基础知识。
创建一个
SWbemNameValue
值集来保存上下文数据。从
SMS_SiteControlFile
类GetSessionHandle
获取会话句柄。将会话句柄添加到上下文数据。
SMS_SiteControlFile
调用 对象RefreshSCF
以获取站点控制文件的最新副本。 在调用中使用上下文数据。使用上下文数据查询要更新的站点控制文件资源。
使用上下文数据更新资源。
使用
SMS_SiteControlFile
objectCommitSCF
方法提交对站点控制文件的更改。SMS_SiteControlFile
调用 对象ReleaseSessionHandle
方法以释放会话句柄。
示例
以下 VBScript 示例访问站点控制文件的客户端代理组件,并创建虚拟属性、属性列表和多字符串列表。 然后,它会删除所做的更新。 该示例演示如何设置会话句柄、获取站点控制文件、查询站点控制文件、进行更新并提交对站点控制文件的更改。
在此示例中,属性 LocaleID
硬编码为英语 (美国) 。 如果需要非美国区域设置。安装,可以从 SMS_Identification 服务器 WMI 类LocaleID
属性获取它。
有关调用示例代码的信息,请参阅调用Configuration Manager代码片段。
Sub ReadWriteScf(connection, siteCode)
Dim context
Dim query
Dim resource
Dim resources
Dim inParams
Set context = CreateObject("WbemScripting.SWbemNamedValueSet")
' Add the standard SMS context qualifiers to the context object.
context.Add "LocaleID", "MS\1033"
context.Add "MachineName", "MyMachine"
context.Add "ApplicationName", "MyApp"
' Add the session handle.
context.Add "SessionHandle", _
connection.ExecMethod("SMS_SiteControlFile", "GetSessionHandle").SessionHandle
' Load site control file.
Set inParams = connection.Get("SMS_SiteControlFile").Methods_("RefreshSCF").InParameters.SpawnInstance_
InParams.SiteCode = siteCode
connection.ExecMethod "SMS_SiteControlFile", "RefreshSCF", inParams, , context
' Query for the client agent component.
query = "SELECT * FROM SMS_SCI_ClientComp " & _
"WHERE ClientComponentName = 'Client Agent' " & _
"AND SiteCode = '" & siteCode & "'"
Set resources = connection.ExecQuery(query, , , context)
For each resource in resources
' Embedded property.
WScript.Echo "Embedded property"
Wscript.Echo "-----------------"
Dim value
Dim value1
Dim value2
Call WriteScfEmbeddedProperty(connection,context,resource,"Test2",20,"Hello","World")
If GetScfEmbeddedProperty(resource,"Test2",value,value1,value2) = True Then
Wscript.Echo "Value: " + CStr(value)
WScript.Echo "Value1: " + value1
WScript.Echo "Value2: " + value2
End If
WScript.Echo
dim n,l
dim updatedProps
Dim scfProp
n = 0
' Remove the property.
For l = 0 To UBound (resource.Props)
' Copy each element except the one to delete.
If resource.Props(l).PropertyName <> "Test2" Then
Dim embeddedProperty
Set embeddedProperty = connection.Get("SMS_EmbeddedProperty").Spawninstance_()
If l = 0 Then
' Create an array to copy to.
updatedProps = array(embeddedProperty)
Redim updatedProps(Ubound(resource.Props)-1)
End If
' Copy the element.
embeddedProperty.PropertyName = resource.Props(l).PropertyName
embeddedProperty.Value = resource.Props(l).value
embeddedProperty.Value1 = resource.Props(l).value1
embeddedProperty.Value2 = resource.Props(l).value2
Set updatedProps(n) = embeddedProperty
n = n + 1
End If
Next
' Update
resource.Props = updatedProps
resource.Put_, context
WScript.Echo
' Check that the property has been deleted.
If GetScfEmbeddedProperty(resource,"Test2",value,value1,value2) = True Then
WScript.Echo "Property found"
Else
WScript.Echo "Property not found"
End If
WScript.Echo
' Embedded property list.
WScript.Echo "Embedded property list"
WScript.Echo "----------------------"
Dim values
values = Array("Tiger","Wolf")
Call WriteScfEmbeddedPropertyList(connection,context,resource,"Animals",values)
Dim retrievedValues
If GetScfEmbeddedPropertyList(resource,"Animals",retrievedValues) = True Then
Dim i,c
Dim updatedValues
c = 0
' Display the list and remove the property Tiger.
updatedValues = Array(UBound(retrievedValues)-1)
For i = 0 To UBound (retrievedValues)
Wscript.Echo retrievedValues(i)
If retrievedValues(i) <> "Tiger" Then
updatedValues(c) = retrievedValues(i)
c = c + 1
End If
Next
WScript.Echo
' Update the property list.
Call WriteScfEmbeddedPropertyList(connection,context,resource,"Animals",updatedValues)
' Get the property list and display.
Call GetScfEmbeddedPropertyList(resource,"Animals",retrievedValues)
For i = 0 To UBound (retrievedValues)
Wscript.Echo retrievedValues(i)
Next
Else
WScript.Echo "Not found"
End If
WScript.Echo
' RegMultiString list.
WScript.Echo "Embedded RegMultiString list"
WScript.Echo "----------------------------"
Dim valueStrings
valueStrings= Array("Lisa","Julie")
' Write the RegMultiString list.
Call WriteScfRegMultiStringList(connection,context,resource,"Names2",valueStrings)
Dim retrievedValueStrings
' Get the RegMultiString list.
If GetScfRegMultiStringList(resource,"Names2",retrievedValueStrings) = True Then
Dim updatedValueStrings
c = 0
updatedValueStrings = Array(Ubound(retrievedValueStrings)-1)
For i = 0 To UBound (retrievedValueStrings)
Wscript.Echo retrievedValueStrings(i)
if retrievedValueStrings(i) <> "Lisa" Then
updatedValueStrings(c) = retrievedValueStrings(i)
End If
Next
Call WriteScfRegMultiStringList(connection,context,resource,"Names",updatedValueStrings)
WScript.Echo
Call GetScfRegMultiStringList(resource,"Names",retrievedValueStrings)
For i = 0 To UBound (retrievedValueStrings)
Wscript.Echo retrievedValueStrings(i)
Next
Else
WScript.Echo "Not found"
End If
Next
' Commit the changes.
Set inParams = connection.Get("SMS_SiteControlFile").Methods_("CommitSCF").InParameters.SpawnInstance_
inParams.SiteCode = siteCode
connection.ExecMethod "SMS_SiteControlFile", "CommitSCF", inParams, , context
' Release the session handle.
Set inParams = connection.Get("SMS_SiteControlFile").Methods_("ReleaseSessionHandle").InParameters.SpawnInstance_
inParams.SessionHandle = context.Item("SessionHandle")
connection.ExecMethod "SMS_SiteControlFile", "ReleaseSessionHandle", inParams
End Sub
示例方法具有以下参数:
参数 | 类型 | 说明 |
---|---|---|
connection |
- SWbemServices | 与 SMS 提供程序的有效连接。 |
siteCode |
- String |
Configuration Manager站点的站点代码。 |
编译代码
此 C# 示例需要:
命名空间
System
System.Collections.Generic
System.Collections
System.Text
Microsoft。ConfigurationManagement.ManagementProvider
Microsoft。ConfigurationManagement.ManagementProvider.WqlQueryEngine
Assembly
microsoft.configurationmanagement.managementprovider
adminui.wqlqueryengine
可靠编程
有关错误处理的详细信息,请参阅关于Configuration Manager错误。
.NET Framework 安全性
有关保护Configuration Manager应用程序的详细信息,请参阅Configuration Manager基于角色的管理。
另请参阅
Windows Management Instrumentation
关于Configuration Manager站点控制文件
如何读取Configuration Manager站点控件文件嵌入属性列表