none
使用IDMIF来扩展 hardware inventory RRS feed

  • 常规讨论

  • 上篇 使用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中的实际数据信息没有导入 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。

    2010年4月6日 2:51
    版主

全部回复

  • 总结下来, NOIDMIF和IDMIF都是文本文件,所以很容易通过脚本或者程序用创建文本文件的方式来创建MIF文件本身。尤其是 IDMIF,适合于和计算机无关的其它设备,只需要一个IDMIF,放在任何一个client上,甚至直接放在 site server上就能涵盖所有"其它设备",更加适合用脚本或者程序从一个数据源来进行处理。无论NOIDMIF,IDMIF都实际上是手工输入和维护,比较适合不经常变更的静态数据。或许会觉得手工已经做好了数据源,何苦再导入SMS/SCCM, 这就看业务需求了。以上流程其实从 SMS 2.0开始就没有大变动。

    MIF不适合处理动态数据,这需要MOF和更复杂的机制和底层基础架构,例如WMI。当然,MOF也能很好的处理静态数据。下次再说。

    2010年4月6日 3:01
    版主