上篇 使用NOIDMIF来扩展 hardware inventory已经说明了很多基础知识,这里就不提了。 IDMIF文件的缺省路径在%WinDir%/system32/ccm/inventory/idmifs, 由注册表路径 HKLM/software/microsoft/SMS/Client/Configuration/Client Properties/IDMIF Directory 来控制。 IDMIF适合那些和某个计算机没什么关系的信息的记录,例如router,switch,网络打印机等。
IDMIF和NOIDMIF在很多方面都一模一样,例如同样的Start component,Start Group,Class,Start Attribute,ID,Key,Type,Value等等。但是也有一些明显的不同和特殊要求。
1. IDMIF必须有一个唯一ID和差异头部信息来提供相关信息。 NOIDMIF在被处理时,hinv agent会自动给它提供一个类似的头部信息。
2. IDMIF必须包括一个和架构同名的Group,又称顶级group,这个group至少要包括一个属性。如果顶级group的名称和架构不同名,server端的 data loader 日志 dataldr.log中会报错说没有 top level group,没有合适的key值信息来 insert database。也就是说只创建空表和视图,但是IDMIF中的class,attribute这些信息没有导入 site database.
其它:IDMIF的头部信息还可以有其它可选项,用于指定很多信息,但是不是必须的。例如: //AgentID<AgentName>,如果不写这个属性信息,hinv可能会覆盖IDMIF文件存储到site server database中的信息。Agent name使得用户可以独立的创建和修改“system”架构,其它需要修改这个架构的用户应该使用另一个agent名称。他们也可以删除和修改关联到指定agent上的对架构的修改,而不影响其它agent的修改。
//Architecture<Routers>
----这个是要新建一个架构类还是修改原有架构类。可以使用原有架构类 System,也可以自定义。
//Uniqueid<1234ABCD-5678-EFGH-9012-34567890ABCD>
---- Uniqueid 可以是任何唯一值。GUID,或者一个字符串都可以。
Start Component
Name = "Router Information"
Start Group
Name = "Router Details info"
ID = 1
Key = 1
Class = "Routers" -------- 这个Class要和上面的Architecture 这里的名称相同
Start Attribute
Name = "RouterName"
ID = 1
Type = String(50)
Storage = Specific
Value = "SHR1"
End Attribute
Start Attribute
Name = "RouterBrand"
ID = 2
Type = String(50)
Storage = Specific
Value = "Cisco"
End Attribute
Start Attribute
Name = "RouterModel"
ID = 3
Type = String(50)
Storage = Specific
Value = "2800series"
End Attribute
End Group
End Component
注意,IDMIF文件在被 hinv收集被发送给site server后,会被自动从%WinDir%/system32/ccm/inventory/idmifs 中删除。如果要对已经被inventory的信息进行修改,需要使用到下面提到的 Pragma = "SMS:ADD" , Pragma = "sms:update", Pragma = "sms:delete" 指令。
可选的头部语句还有:
//FullResync<1>
---- 用于覆盖整个架构,也就是覆盖原来同名的架构. 或者用下面的 Pragma语句
//ResyncAgent<MyAgent><1>
---- 用于指令agent来重新同步信息来覆盖所有MyAgent部分生成的数据。
//ResyncClass<PrintersName><1>
---- 这是上面说的Agent名称
还有一些语句,例如 Pragma = "SMS:ADD" , Pragma = "sms:update", Pragma = "sms:delete" 用来指定对该部分的操作。例如:如果测试时输入错误,导致data loader没有正常导入数据,那么只要在上面的 Class = “Routers” 后这一行添加一行 Pragma = "sms:delete" 即可,下次data loader就会将原来的Class,attribute等信息覆盖。如果删除顶级group, 原有的整个架构都会被删除。
注意,primary site server上hinv agent属性设置中应该勾选 collect IDMIF files. 勾选之后,客户端控制面板选项Action tab中就有了 ID MIF collection cycle。以后也可以用整个来手动触发 IDMIF的处理。
然后就是检查客户端 c:/windows/system32/ccm/logs/inventoryAgent.log中是否collect了该IDMIF文件,搜索"file collection..."。 hinv只是收集 IDMIF,然后作为附件发送给site server,它自己并不处理,这个要注意,而且不签名不加密。server端dataldr.log 搜索“CSqlSchema....”, 也就是data loader在SQL server中创建表 Routers 和视图 V_G6_Routers_data (别问我为什么是6而不是5或者7,我也不知道 :-) ),当然还有 SMS_G_Routers_Routers 这个WMI类。如果log中没有报错,就大功告成。
最后一点要注意: 这样创建出来的Router信息,并没有关联到任何计算机,所以它不属于 system resource, 在定义Collection时是看看不到的。只有创建Query时,对象类型中就会多一项:Routers。