Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаленный реестр 
:(
    Опции темы
AngelDominantes
Дата 20.5.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 29.5.2009

Репутация: нет
Всего: нет



Добрый день коллеги, возникла тут необходимость удаленно выяснить о наличии ключа в реестре, была написана програмулина которая сканирует сеть, и подключается к удаленному реестру на найденных объектах сети, и все бы ничего, но есть загвоздка: При запуске проги с правами доменного администратора на каких то компах ключики обнаруживает, на каких то нет, хотя они там присутствуют, причем если к компу на котором ключик, якобы, отсутствует, подключиться удаленно к реестру и просто просмотреть интересующую ветку, ничего не изменяя, после такой манипуляции, ключ успешно прогой находиться. В чем может быть причина такого поведения для меня загадка, точнее есть предположение что удаленная машина т.к. находится в другом здании отвечает не так быстро как необходимо, и поэтому ключик как бы не считывается. . .
Код

 __fastcall TForm1::EnumNetRes(NETRESOURCE* nr)
{
 HANDLE hEnum;
 HKEY Key;
 HKEY P;
//Сканируем сеть
   if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY, NULL, nr, &hEnum) != NO_ERROR)
   {
        RaiseLastWin32Error();
   }
        DWORD Count = -1;
        DWORD BufferSize = 0;
        DWORD ReturnVal = 0;
        NETRESOURCE *NetRes = (NETRESOURCE*) new  char[1024];
        ZeroMemory(NetRes, sizeof(NETRESOURCE));
        for(;;j++)
        { ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize); //перечисляем ресурсы сети
//выделяем больше памяти под массив
         if(ReturnVal == ERROR_MORE_DATA)
         { Count = -1;
           delete [] NetRes;
           NetRes = (NETRESOURCE*) new char[BufferSize];
           ZeroMemory(NetRes, sizeof(NETRESOURCE));
           ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
         }
         if(ReturnVal != NO_ERROR)
         break;
         for(unsigned int i = 0; i< Count; i++)
         {
 
           if (j>=MAX_ROWS) 
           {
             MAX_ROWS = MAX_ROWS+100;
             StringGrid1->RowCount = MAX_ROWS;
 
           }
 
           StringGrid1->Cells[0][j+1] = NetRes[i].lpRemoteName;
           //Application->ProcessMessages();
 
           //коннектимся к удаленному реестру
                if(RegConnectRegistry(StringGrid1->Cells[0][j+1].c_str(),HKEY_LOCAL_MACHINE,&Key) != ERROR_SUCCESS)
                {
                  StringGrid1->Cells[1][j+1]= "Ошибка подключения";
                  RegCloseKey(Key);
                }
                else
                 {
                   //проверяем наличие ключей
                        if(RegOpenKeyEx(Key,SP1,NULL,KEY_READ,&P) == ERROR_SUCCESS )
                        {
 
                         StringGrid1->Cells[1][j+1]= "+";
 
                        }
                        else
                        {
                         StringGrid1->Cells[1][j+1]= "-";
 
                        }
                        if(RegOpenKeyEx(Key,RollUp,NULL,KEY_READ,&P) == ERROR_SUCCESS )
                        {
 
                         StringGrid1->Cells[2][j+1]= "+";
 
                        }
                        else
                        {
                         StringGrid1->Cells[2][j+1]= "-";
 
                        }
                        if(RegOpenKeyEx(Key,AX,NULL,KEY_READ,&P) == ERROR_SUCCESS )
                        {
 
                         StringGrid1->Cells[3][j+1]= "+";
 
                        }
                        else
                        {
                         StringGrid1->Cells[3][j+1]= "-";
 
                        }
                        RegCloseKey(Key);
                 }
 
           if ( (NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER )
           {
 
                 if ( ( !strcmp(NetRes[i].lpRemoteName,"Microsoft Windows Network") ) || (!strcmp(NetRes[i].lpRemoteName,"SMI")) )
                 {
                         EnumNetRes(&NetRes[i]);
                 }
           }
         }
         if(ReturnVal == ERROR_NO_MORE_ITEMS)
         {
                delete[] NetRes;
                WNetCloseEnum(hEnum);
         }
 
 
        }
                delete[] NetRes;
                WNetCloseEnum(hEnum);
}



Функция рекурсивно находит объекты сети, подключаясь к каждому и ища ключик реестра.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0721 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.