Russian Qt Forum
Ноябрь 23, 2024, 00:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сбор данных о компьютере  (Прочитано 12360 раз)
Stas
Гость
« : Август 08, 2011, 21:13 »

Здравствуйте!
В общем  проблема такая: собрал кое-как ActiveQt,  теперь нужно реализовать сбор  данных о компьютерах в сети, т.е. оборудование, программы и т.д.
На данный момент, хотя бы собрать информацию о локальном компьютере, облазил весь инет информации очень мало, в основном показывается работа с MS Office. Буду благодарен, если кто-нибудь предоставит примеры элементарных действий необходимых для получения информации о компьютере.

P.S. пробовал работать с WMI на C#, всё довольно понятно и просто.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 08, 2011, 21:22 »

Какие именно данные тебя интересуют?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Stas
Гость
« Ответ #2 : Август 08, 2011, 21:33 »

Тип процессора, размер ОЗУ и ПЗУ, список сетевых адаптеров, видеокарта, список установленных программ, желательно ещё дату установки ОСи, количество выданых синих экранов  и т.д.
Впринципе главное понять принцип работы с WMI, а там уже сам разберусь к каким классам обращаться и какую информацию тянуть.

Вообще задача такова: есть локалка на предприятии, нужны сделать инвертаризации компьютеров.
Записан
Mr.Woland
Гость
« Ответ #3 : Август 11, 2011, 14:43 »

Вообще задача такова: есть локалка на предприятии, нужны сделать инвертаризации компьютеров.
попробуй http://disphelper.sourceforge.net/
Записан
Stas
Гость
« Ответ #4 : Август 11, 2011, 19:19 »

Вообще задача такова: есть локалка на предприятии, нужны сделать инвертаризации компьютеров.
попробуй http://disphelper.sourceforge.net/

В ходе поисков выходил я на эту библиотеку, но как то не хочется использовать стороннее решение, если можно сделать стандартными средствами Qt.

Я нашёл пример как получить информацию о сетевой карте здесь, http://webcache.googleusercontent.com/search?q=cache:http://poofeg.ru/2010/06/wmi-i-qt-problemy-s-ienum/

Код функции:
Код:
QAxObject *getWmiInterObj(const QString &name)
{
  if (name.isEmpty()) {
    qDebug("Interface name is empty");
    return 0;
  }
  QAxObject *objIWbemLocator = new QAxObject("WbemScripting.SWbemLocator");
    if (!objIWbemLocator) {
    qDebug("WbemScripting.SWbemLocator not created");
    return 0;
  }
  QAxObject *objWMIService = objIWbemLocator->querySubObject(
          "ConnectServer(QString&,QString&)",
          QString("."), QString("root\\cimv2"));
  if (!objWMIService) {
    qDebug("WMIService not created");
    delete objIWbemLocator;
    return 0;
  }
  QString query = QString("SELECT * FROM Win32_NetworkAdapterConfiguration "
                          "WHERE SettingID = \"%1\"").arg(name);
  QAxObject *objInterList = objWMIService->querySubObject(
          "ExecQuery(QString&))", query);
  if (!objInterList) {
    qDebug("Answer from ExecQuery is null");
    delete objIWbemLocator;
    return 0;
  }
  if (objInterList->dynamicCall("Count").toInt() == 0) {
    qDebug("Count is 0");
    delete objIWbemLocator;
    return 0;
  }

// И теперь самое интересное

  QAxObject *enum1 = objInterList->querySubObject("_NewEnum");
  if (!enum1) {
    qDebug("Query _NewEnum failed");
    delete objIWbemLocator;
    return 0;
  }
  IEnumVARIANT* enumInterface = 0;
  enum1->queryInterface(IID_IEnumVARIANT, (void**)&enumInterface);
  if (!enumInterface) {
    qDebug("Query interface failed");
    delete objIWbemLocator;
    return 0;
  }
  enumInterface->Reset();
  QAxObject *item = 0;
  for (int i = 0; i < objInterList->dynamicCall("Count").toInt(); i++) {
    VARIANT *theItem = (VARIANT*)malloc(sizeof(VARIANT));
    if (enumInterface->Next(1,theItem,NULL) == S_FALSE) {
      qDebug("enum next failed");
      delete theItem;
      delete objIWbemLocator;
      return 0;
    }
    item = new QAxObject((IUnknown*)theItem->punkVal);
    if (!item) {
      qDebug("getting result item failed");
      delete theItem;
      delete objIWbemLocator;
      return 0;
    }
    delete theItem;
  }
  delete objIWbemLocator;
  return item;
}

Внутри этой функция выполняется запрос
Код:
 QString query = QString("SELECT * FROM Win32_NetworkAdapterConfiguration "
                          "WHERE SettingID = \"%1\"").arg(name);

В случае удачного выполнения она возвращает  объект item типа QAxObject, но как извлечь результат запроса из этого объекта я не совсем пойму.
Записан
Mr.Woland
Гость
« Ответ #5 : Август 12, 2011, 14:34 »

В случае удачного выполнения она возвращает  объект item типа QAxObject, но как извлечь результат запроса из этого объекта я не совсем пойму.
Посмотри мой старый тестовый проект в аттаче.
Поможет.
В ходе поисков выходил я на эту библиотеку, но как то не хочется использовать стороннее решение, если можно сделать стандартными средствами Qt.
У меня была подобная (типа инвентаризация, но только что-бы полный "слепок" системы Улыбающийся ) задача. Disphelper тупо оказался удобнее и быстрее (до 20 раз) чем ActiveQt.
Правда у хелпера свои косяки.....
Записан
Stas
Гость
« Ответ #6 : Август 12, 2011, 15:46 »

Спасибо, буду разбираться!

Ещё вопрос, я же правильно понимаю, что вообще сбор данных можно организовать по сети, в вашем примере собиралась информация на том компьютере где работает прога, но ничего же не мешает получить список компьютеров в домене и потом имена этих компьютеров подставлять сюда:
Код:
objWMIService = objIWbemLocator->querySubObject("ConnectServer(QString&,QString&)",QString("."),QString("root\\cimv2"));
заместо root?
Записан
Mr.Woland
Гость
« Ответ #7 : Август 12, 2011, 16:34 »

Спасибо, буду разбираться!
Пока ещё не за что Улыбающийся
Ещё вопрос, я же правильно понимаю, что вообще сбор данных можно организовать по сети, в вашем примере собиралась информация на том компьютере где работает прога, но ничего же не мешает получить список компьютеров в домене и потом имена этих компьютеров подставлять сюда:
Код:
objWMIService = objIWbemLocator->querySubObject("ConnectServer(QString&,QString&)",QString("."),QString("root\\cimv2"));
заместо root?
нет root - это корень пространства имен WMI.
Вообще есть пара поезных утилит http://www.microsoft.com/download/en/details.aspx?id=24045 как для работы, так и для понимания механизма работы и связей  WMI .
ЗЫ.
Хелпер тоже может подкючаться по сети.
Тк все работают с COM объектами...
Записан
Stas
Гость
« Ответ #8 : Август 12, 2011, 17:54 »

Цитировать
нет root - это корень пространства имен WMI.
Вообще есть пара поезных утилит http://www.microsoft.com/download/en/details.aspx?id=24045 как для работы, так и для понимания механизма работы и связей  WMI .
ЗЫ.
Хелпер тоже может подкючаться по сети.
Тк все работают с COM объектами...

Да, я ошибся, просто меня ввёл в заблуждение след. пример из википедии:
Код:
[\\ComputerName\NameSpace][:ClassName][.KeyProperty1=Value1][,KeyProperty2=Value2]…]
где
  ComputerName – имя компьютера
  NameSpace – название пространства имен
  ClassName – имя класса
  KeyProperty1=Value1, KeyProperty2=Value2 – свойства объекта и значения, по
    которому он идентифицируется.

А утилиты эти я уже недавно скачал, но нет локалки под рукой что бы проверить.
Записан
Mr.Woland
Гость
« Ответ #9 : Август 12, 2011, 22:38 »

А утилиты эти я уже недавно скачал, но нет локалки под рукой что бы проверить.
Они прекрасно работают на локальной машине.
Особенно -Object Browser.
Записан
Stas
Гость
« Ответ #10 : Август 13, 2011, 07:49 »

Я в курсе, что они работают на локальной машине, но для подключения к удалённой машине, на этой самой машине сначала надо установить локальные политики безопасности.
Записан
Странник
Гость
« Ответ #11 : Август 13, 2011, 15:33 »

Ещё вопрос, я же правильно понимаю, что вообще сбор данных можно организовать по сети, в вашем примере собиралась информация на том компьютере где работает прога, но ничего же не мешает получить список компьютеров в домене и потом имена этих компьютеров подставлять сюда:
Код:
objWMIService = objIWbemLocator->querySubObject("ConnectServer(QString&,QString&)",QString("."),QString("root\\cimv2"));
заместо root?
имя компьютера первым параметром передается. но по сети лучше асинхронно выполнять.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 22.