none
Чтение ключа реестра RRS feed

  • Вопрос

  • в наличии вот такой ключик:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Inventory]

    "Inv"="1234"

     

    вот таким "способом" пытаюсь его внести:

     

    #pragma namespace("\\\\.\\root\\CIMV2")

    instance of __Win32Provider as $PropProv
    {
     Name = "RegPropProv";
     Clsid = "{72967901-68EC-11d0-B729-00AA0062CBB7}";
    };

    instance of __PropertyProviderRegistration
    {
     Provider = $PropProv;
     SupportsPut = TRUE;
     SupportsGet = TRUE;
    };


    #pragma namespace("\\\\.\\root\\CIMV2")

    [DYNPROPS]
    class RegistryData
    {
     [key] string KeyName="";
     string  Inv;
    };

    [DYNPROPS]
    instance of RegistryData
    {
     KeyName="Inventory Number";
     [PropertyContext("local|HKEY_LOCAL_MACHINE\\SOFTWARE\\Invetory|Inv"),
      Dynamic, Provider("RegPropProv")] Inv;

    };

    #pragma namespace("\\\\.\\root\\CIMV2\\SMS")

     [SMS_Report(TRUE),
     SMS_Group_Name("Registry Data"),
     SMS_Class_ID("MICROSOFT|RegistryData|1.0")]
    class RegistryData : SMS_Class_Template
    {
     [SMS_Report(TRUE),key]
     string  KeyName;
     [SMS_Report(TRUE)]
     string  Inv;
    };

     

    при компиляции на клиенте выдает:

    Произошла ошибка при создании  объекта 5, определенного в строках 42 - 48: 0X80041002 Класс, вхождение, или свойство "SMS_Class_Template" не найдены. Компьютер вернул ошибку 0x80041001

    или

    An error occurred while creating object 5 defined on lines 42 - 48: 0X80041002 Class, instance, or property 'SMS_Class_Template' was not found. Compiler returned error 0x80041001

     

    на сервере:

    #pragma namespace("\\\\.\\root\\CIMV2")

    [DYNPROPS]
    class RegistryData

    ...
     string  Inv;
    };
    проходит без ошибок

     

    класс RegistryData в \\root\\CIMV2 создается, Inv - присутствует

    Inv - в атрибутах отсутствует, соответственно и отсутствует в запросах

     

    в чем загвоздка?

     

     

    4 июня 2007 г. 18:40

Ответы

  • Добрый день.
    Я считаю что вы описались в названии ключа. Вместо Inventory у вас стоит Invetory.

    Вот такой MOF у меня работает.
    Скопируйте его в Inventory.mof и в SMS_DEF.MOF.
    Запустите на всех клиентах MOFCOMP.EXE Inventory.MOF для сбора данных.

    И еще один совет. Прежде чем запускать какой-либо MOF, проверьте его с помощью mofcomp.exe -check

    Code Snippet


    // Data Class
    #pragma namespace("\\\\.\\root\\CIMV2")
    #pragma deleteclass("RegistryData",NOFAIL)

    [DYNPROPS]
    class RegistryData
    {
     [key] string KeyName="";
     string  Inv;
    };

    [DYNPROPS]
    instance of RegistryData
    {
     KeyName="Inventory Number";
     [PropertyContext("local|HKEY_LOCAL_MACHINE\\SOFTWARE\\Inventory|Inv"),
      Dynamic, Provider("RegPropProv")] Inv;

    };

    // Reporting Class
    #pragma namespace("\\\\.\\root\\CIMV2\\SMS")


     [SMS_Report(TRUE),
     SMS_Group_Name("Registry Data"),
     SMS_Class_ID("MICROSOFT|RegistryData|1.0")]
    class RegistryData : SMS_Class_Template
    {
     [SMS_Report(TRUE),key]
     string  KeyName;
     [SMS_Report(TRUE)]
     string  Inv;
    };

     

     

    Отвечающий

Все ответы

  • Добрый день.
    Я считаю что вы описались в названии ключа. Вместо Inventory у вас стоит Invetory.

    Вот такой MOF у меня работает.
    Скопируйте его в Inventory.mof и в SMS_DEF.MOF.
    Запустите на всех клиентах MOFCOMP.EXE Inventory.MOF для сбора данных.

    И еще один совет. Прежде чем запускать какой-либо MOF, проверьте его с помощью mofcomp.exe -check

    Code Snippet


    // Data Class
    #pragma namespace("\\\\.\\root\\CIMV2")
    #pragma deleteclass("RegistryData",NOFAIL)

    [DYNPROPS]
    class RegistryData
    {
     [key] string KeyName="";
     string  Inv;
    };

    [DYNPROPS]
    instance of RegistryData
    {
     KeyName="Inventory Number";
     [PropertyContext("local|HKEY_LOCAL_MACHINE\\SOFTWARE\\Inventory|Inv"),
      Dynamic, Provider("RegPropProv")] Inv;

    };

    // Reporting Class
    #pragma namespace("\\\\.\\root\\CIMV2\\SMS")


     [SMS_Report(TRUE),
     SMS_Group_Name("Registry Data"),
     SMS_Class_ID("MICROSOFT|RegistryData|1.0")]
    class RegistryData : SMS_Class_Template
    {
     [SMS_Report(TRUE),key]
     string  KeyName;
     [SMS_Report(TRUE)]
     string  Inv;
    };

     

     

    Отвечающий
  • Спасибо! глаз замылился ...

    "-check" проходил-то без проблем ... наверняка где-то в логах было сообщение - буду искать

     


  • Добрый день.
    Просьба ответить на несколько вопросов:
    1. Что означает "внести" в оригинальном сообщении данной темы ? (вносятся значения в реестр ?)
    2. Как правильно делать -check ? (правильный синтаксис - немогу разобраться, просьба привести пример). Какой должен быть результат при нормальной проверке ?
    3. Как правильно запустить на всех клиентах MOFCOMP.EXE Inventory.MOF для сбора данных ? Скриптом и распостранить средствами SMS ?
    И последнее, для ясности моей задачи: нужно собрать у клиентов "путь к дистрибутиву Microsoft Office 2003", а он находиться в реестре. В данном случае к примеру это "W:\Office\2003 old\".

    Значения реестра:
    [HKEY_CLASSES_ROOT\Installer\Products\9140110900063D11C8EF10054038389C\SourceList\Net]
    "1"=hex(2):57,00,3a,00,5c,00,5c,00,4f,00,66,00,66,00,69,00,63,00,65,00,5c,00,\
      5c,00,32,00,30,00,30,00,33,00,20,00,6f,00,6c,00,64,00,5c,00,5c,00,00,00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\9140110900063D11C8EF10054038389C\SourceList\Net]
    "1"=hex(2):57,00,3a,00,5c,00,5c,00,4f,00,66,00,66,00,69,00,63,00,65,00,5c,00,\
      5c,00,32,00,30,00,30,00,33,00,20,00,6f,00,6c,00,64,00,5c,00,5c,00,00,00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Common\Internet]
    "LocationOfComponents"="W:\\Office\\2003 old\\"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Registration\{90110419-6000-11D3-8CFE-0150048383C9}]
    "SmartSourceDir"="W:\\Office\\2003 old\\"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90110419-6000-11D3-8CFE-0150048383C9}]
    "InstallSource"="W:\\Office\\2003 old\\"

    Как результат - отчет в виде "ИмяПК - ПутьКФайлам"
    Все это питаюсь реализовать на SMSv4.
    Спасибо.
    2 июля 2008 г. 16:13
  • 1. Внести означает "внести в базу WMI с тем чтобы потом расширением стандартной схемы инвентаризации собирать эти данные в БД SMS"

    2. Вот тут я совсем не понял, чего вы хотите. mofcomp /? пробовали?

    3. Ну да, если есть инфраструктура SMS, то самый простой способ запустить что-то на всех клиентах - это воспользоваться ей Smile Создать .bat или .vbs, который копировал бы на локал и компилировал в репозиторий созданный MOF-файл.

     

    Если вы не очень хорошо знакомы с тем, что такое MOF, как они устроены и как и зачем их включать в репозиторий WMI - лучше туда не лазить, это у Win буквально самые интимные внутренности, и последствия косяков могут быть... пугающими.

    Напишите скриптик, который будет выгребать нужную вам информацию в NOIDMIF, и она так же попадет к вам в базу, но без возможных катастрофических последствий на клиентах.

     

    И последнее: вы сейчас хотите чесать правое ухо левой ногой, а это очень, очень неудобно.

    Рискну предположить, что задача эта не для целей потренироваться (иначе дальше можете не читать), а для анализа текущей ситуации, а потом вы захотите проапдейтить эти сорц-листы с тем, чтобы все они указывали на какое-то определенное место, где лежит дистрибутив, потому что забодало указывать его вручную каждый раз, когда юзер хочет себе новый компонент.

    Это можно сделать проще: создаем пакет, в котором находится ваш дистрибутив, публикуем его на DP, создаем программу для установки и в свойствах программы на вкладке Windows Installer импортируем из .msi ProdictID нашего пакета. На всех компьютерах, на которых по данным инвентаризации установлен этот продукт, при следующем цикле апдейта сорцев windows installer в список будет добавлен путь к этому пакету на DP.

    2 июля 2008 г. 17:10
  • Спасибо большое за ответ!
    Итак, не смотря на все проедостережения, прочитав немало документации, я решился на "сложный" вариант и вот что получилось:
    1. создал файл CurrentUserSource.mof
    #pragma namespace ("\\\\.\\root\\cimv2")
    // Registry property provider
    instance of __Win32Provider as $PropProv
    {
        Name = "RegPropProv";
        ClsID = "{72967901-68EC-11d0-B729-00AA0062CBB7}";
        ImpersonationLevel = 1;
        PerUserInitialization = "FALSE";
    };
    instance of __PropertyProviderRegistration
    {
        Provider       =$PropProv;
        SupportsPut    =TRUE;
        SupportsGet    =TRUE;
    };
    [DYNPROPS]
    class CU_Source
    {
        [key]
        string  index = "current";
        sint32 CurrentUserSource;
    };
    [DYNPROPS]
    instance of CU_Source
    {
       [PropertyContext("local|HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Office\\11.0\\Common\\Internet|LocationOfComponents"),
            Dynamic, Provider("RegPropProv")]
            CurrentUserSource;
    };

    2.  Добавил  в файл sms_def.mof
    #pragma namespace ("\\\\.\\root\\CIMv2\\sms")
     [SMS_Report     (TRUE),
      SMS_Group_Name ("Current User Source Office"),
      SMS_Class_ID   ("MICROSOFT|CU_Source|1.0")]
    class Power_Mgmt : SMS_Class_Template
    {
        [SMS_Report(TRUE),key]
            string  index;
        [SMS_Report(TRUE)]
        sint32   CurrentUserSource;
    };

    3. Сделал проверку синтасиса, потом компиляцию и запустил на одном ПК цикл сбора.....

    Вот теперь не могу найти эти данные в БД и сделать отчет. Как и где они отбражаются ? Как их найти ?
    Я пробовал смотреть по названиям таблиц в БД и в "Обозревателе ресерсов".
    Зарание благодарен за ответ.
    Спасибо.
    9 июля 2008 г. 14:11
  • Ну, если я правильно все в этом сложном пути понимаю, то то, что вы добавили в sms_def.mof хорошо бы было добавить в .mof который вы компилили на клиенте - то есть значение вы от провайдера RegPropProv получаете, а в пространство имен root\\CIMv2\\sms его не запихиваете. Как следствие - инвентаризации нечего собирать.

    Посмотрите выше на ответ Дмитрия Бурцева и сделайте по подобию.

    9 июля 2008 г. 15:43
  • Сделал.

    #pragma namespace("\\\\.\\root\\CIMV2")
    #pragma deleteclass("CU_Source_Office2003",NOFAIL)
    [DYNPROPS]
    class CU_Source_Office2003
    {
     [key] string KeyName="";
     string  LocationOfComponents;
    };
    [DYNPROPS]
    instance of CU_Source_Office2003
    {
     KeyName="Source Office 2003";
    [PropertyContext("local|HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Office\\11.0\\Common\\Internet|LocationOfComponents"),
      Dynamic, Provider("RegPropProv")] LocationOfComponents;
    };
    // Reporting
    #pragma namespace("\\\\.\\root\\CIMV2\\SMS")

     [SMS_Report(TRUE),
     SMS_Group_Name("Source Office2003"),
     SMS_Class_ID("MICROSOFT|CU_Source_Office2003|1.0")]
    class CU_Source_Office2003 : SMS_Class_Template
    {
     [SMS_Report(TRUE),key]
     string  KeyName;
     [SMS_Report(TRUE)]
     string  LocationOfComponents;
    };

     

     

    Внес в sms_def.mof и в CurrentUserSource.mof Проверка проходит нормально.

    Все работает...... Спасибо...........
    10 июля 2008 г. 9:50
  •  Ivan A. Budylin написано:

    3. Ну да, если есть инфраструктура SMS, то самый простой способ запустить что-то на всех клиентах - это воспользоваться ей Создать .bat или .vbs, который копировал бы на локал и компилировал в репозиторий созданный MOF-файл.


    Хотелось бы уточнить по ответу №3.

    Я сделал .cmd файлик и распостранил его на несколько машин.... Объявление есть - программа запускается.

    Но в классах после выполнения ничего нет. Если же этот самый .cmd запустить руками - тогда класс присутствует.



    В мем скрипте всего одна строчка:

    C:\WINDOWS\system32\wbem\mofcomp.exe \\smsserver\sms_080\inboxes\clifiles.src\hinv\CurrentUserSource2.mof


    Также делал и с копированием и запуском с указанного места - результат тот же.

    copy \\smsserver\sms_080\inboxes\clifiles.src\hinv\CurrentUserSource2.mof C:\WINDOWS\system32\CCM\CurrentUserSource2.mof
    start C:\WINDOWS\system32\wbem\mofcomp.exe C:\WINDOWS\system32\CCM\CurrentUserSource2.mof


    Подскажите, в чем причина?

    Может лутьше другим способом реализовать ?


    В логах есть записи:


    1. GetFileVersionInfoSize failed for file C:\WINDOWS\system32\CCM\Cache\0800000C.4.System\InventorySourceOffice2003.cmd, error 1812


    2. Script for Package:0800000C, Program: InventorySourceOffice2003 failed with exit code 1


    Есть подозрение что CMD файлы не выполняются средствами SMS.

    Как быть ?

    Спасибо.




    11 июля 2008 г. 14:12
  • .cmd совершенно точно запускаются средствами SMS, как и вообще любоые файлы, которые можно запустить на исполнение даблкликом интерактивно Smile

     

    Вы свой файл с какими правами запускаете? Есть мнение, что с правами пользователя Smile

    13 июля 2008 г. 8:54
  • Как это не прескорбно - но права я выставлял специально административные. Может ещё есть мысли по этому случаю? Спасибо.
    15 июля 2008 г. 7:12
  • Дмитрий, подскажите зачем удалять каждый раз этот класс ?

    #pragma deleteclass("RegistryData",NOFAIL)

    И ещё один вопрос - как ускорить инвентаризацию ?
    У меня очень медленно она проходит - за 8 часов ожидания - ответили 10 % ПК.
    Спасибо.
    17 июля 2008 г. 14:13