2011-01-17 4 views
0

У меня есть следующая метабаза путь:Как я получить Виртуальное название IIS из пути метабазы ​​IIS в C++

/lm/w3svc/1/root/foo

, которые я могу видеть в картах менеджера IIS для виртуальных каталог:

Default Web Site/foo

Как определить имя виртуального каталога из пути метабазы ​​в C++?

+0

Если вы уже знаете путь метабазы, то виртуальный каталог будет foo. Может, я что-то упустил? – Kev

+0

Да, я не буду знать полный путь к виртуальному каталогу, что-то вроде: «Веб-сайт по умолчанию/foo». То только если кто-то не переименовал «Веб-сайт по умолчанию» в нечто другое. Во всяком случае, я нашел решение, вам нужно запросить поле комментариев сервера из метабазы ​​для ключа «/ lm/w3svc/1», чтобы найти имя веб-сайта по умолчанию. – deltanine

ответ

0
HRESULT CAeXMSAdminBasePtr::GetVirtualDirectoryName(LPCWSTR szMetaPath, LPWSTR szVirtualDirectoryName, DWORD dwVirtualDirectoryNameLen) 
{ 
    HRESULT hr = S_OK; 
    METADATA_RECORD mdRecord; 
    memset(&mdRecord, 0, sizeof(METADATA_RECORD)); 

    METADATA_HANDLE hMetaData = NULL; 
    IMSAdminBasePtr spAdminBase 

    try 
    { 

     spAdminBase.CoCreateInstance(CLSID_MSAdminBase); 

     spAdminBase->OpenKey(METADATA_MASTER_ROOT_HANDLE, szMetaPath, METADATA_PERMISSION_READ, g_dwCommandTimeOut, hMetaData); 

     // 
     // Get Server Comment field aka Web Site Name 
     // 
     MD_SET_DATA_RECORD(&mdRecord, MD_SERVER_COMMENT, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, ALL_METADATA , dwVirtualDirectoryNameLen*sizeof(WCHAR), szVirtualDirectoryName); 
     spAdminBase->GetData(hMetaData, L"", mdRecord, dwVirtualDirectoryNameLen); 
     if(hMetaData != NULL) 
     { 
      spAdminBase->CloseKey(hMetaData); 
     } 
    } 
    catch(...) 
    { 
     hr = E_FAIL; 
     if(hMetaData != NULL) 
     { 
      spAdminBase->CloseKey(hMetaData); 
     } 
     // Propogate exception to caller 
     throw; 
    } 

    return hr; 
}