Добрый день коллеги, возникла тут необходимость удаленно выяснить о наличии ключа в реестре, была написана програмулина которая сканирует сеть, и подключается к удаленному реестру на найденных объектах сети, и все бы ничего, но есть загвоздка: При запуске проги с правами доменного администратора на каких то компах ключики обнаруживает, на каких то нет, хотя они там присутствуют, причем если к компу на котором ключик, якобы, отсутствует, подключиться удаленно к реестру и просто просмотреть интересующую ветку, ничего не изменяя, после такой манипуляции, ключ успешно прогой находиться. В чем может быть причина такого поведения для меня загадка, точнее есть предположение что удаленная машина т.к. находится в другом здании отвечает не так быстро как необходимо, и поэтому ключик как бы не считывается. . . | Код | __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); }
|
Функция рекурсивно находит объекты сети, подключаясь к каждому и ища ключик реестра.
|