Пытаюсь рулить IIS-ом (IIS5.x, Win2k server) с помощью AdminBaseObject.
1) Есть ли у кого пример "Virtual Directory Creator" ? Ни в msdn, ни mssdk, ни в iis samples я его не нашел.
2) Где именно в metabase храняться проперти, задаваемые при создании, к примеру, виртуальной диры(локальный путь, например)?
Вот собственные ключи из метабэйз —
Enumerating date in path: /LM/W3SVC/1/Root/zzz
type: [1] id: [44b] []
type: [2] id: [3ea] [IIsWebVirtualDir]
Enumerating keys Path: /LM/W3SVC/1/Root/zzz
Через ADSI рулится с помощью IIsWebVirtualDir, "3ea" это его key type.
Как до него добраться с помощью AdminBaseObject?
Здравствуйте, iShadow, Вы писали:
S>Пытаюсь рулить IIS-ом (IIS5.x, Win2k server) с помощью AdminBaseObject.
S>1) Есть ли у кого пример "Virtual Directory Creator" ? Ни в msdn, ни mssdk, ни в iis samples я его не нашел.
А нафига?
S>2) Где именно в metabase храняться проперти, задаваемые при создании, к примеру, виртуальной диры(локальный путь, например)?
Все проперти описаны в описании соответсвующего объекта (IIsVirtualDir) в описании объектов ADSI.
S>Вот собственные ключи из метабэйз —
S>Enumerating date in path: /LM/W3SVC/1/Root/zzz
S>type: [1] id: [44b] []
S>type: [2] id: [3ea] [IIsWebVirtualDir]
S>Enumerating keys Path: /LM/W3SVC/1/Root/zzz
S>Через ADSI рулится с помощью IIsWebVirtualDir, "3ea" это его key type.
S>Как до него добраться с помощью AdminBaseObject?
Создавать примерно так (обрати внимание на MD_KEY_TYPE):
METADATA_RECORD mdr;
MD_SET_DATA_RECORD(&mdr, MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, 0x14, L"IIsFilter");
hr = pMSAdmin->SetData(hMetaData, pwszFilterName, &mdr);
Это пример для фильтра, но с виртуальным каталогом все ровно также.
Читать и того проще.
Здравствуйте, Lexey, Вы писали:
L>Создавать примерно так (обрати внимание на MD_KEY_TYPE):
L>L>METADATA_RECORD mdr;
L>MD_SET_DATA_RECORD(&mdr, MD_KEY_TYPE, METADATA_NO_ATTRIBUTES, IIS_MD_UT_SERVER, STRING_METADATA, 0x14, L"IIsFilter");
L>hr = pMSAdmin->SetData(hMetaData, pwszFilterName, &mdr);
L>
L>Это пример для фильтра, но с виртуальным каталогом все ровно также.
Классно, как установить/получить запись в метабейз я понял
Но хочется именно рулить объектом IIsVirtualDir(или IIsFilter, как у тебя). Как его создать/получить из metabase в C++ ?
Сорри за возможно туповатые вопросы, под винды раньше не писал
Здравствуйте, iShadow, Вы писали:
S>Но хочется именно рулить объектом IIsVirtualDir(или IIsFilter, как у тебя). Как его создать/получить из metabase в C++ ?
Через ADSI рулить получается, но хотелось бы делать подобное только при помощи ABO —
#include <iads.h>
#include <Adshlp.h>
#include <comdef.h>
bool CreateVirtualDir(LPCTSTR lpszVirtualDirName, LPCTSTR lpszDiskPath)
{
IADsContainer* iContainer;
IADs* iAds;
/* to get the WebSever */
if(ADsGetObject
(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)
&iContainer)==S_OK){
//to get the default website
iContainer->GetObject(_bstr_t("IIsWebServer"), _bstr_t
("1"),(IDispatch**)&iAds);
if(iAds->QueryInterface(IID_IADsContainer,(void**)
&iContainer)==S_OK){
//to get the default website directory
iContainer->GetObject(_bstr_t
("IIsWebVirtualDir"),_bstr_t("Root"),(IDispatch**)&iAds);
if(iAds->QueryInterface(IID_IADsContainer,(void**)
&iContainer)==S_OK){
//if we get the virtual directory,we should delete it first
iContainer->Delete(_bstr_t("IIsWebVirtualDir"),
_bstr_t(lpszVirtualDirName));
//to create a virtual directory
if(iContainer->Create(_bstr_t("IIsWebVirtualDir"),
_bstr_t(lpszVirtualDirName),(IDispatch**)&iAds)==S_OK){
//to set the virtual directory's attribute
iAds->Put(_bstr_t("AccessRead"),_variant_t
("True"));
iAds->Put(_bstr_t("AccessWrite"),_variant_t
("True"));
iAds->Put(_bstr_t("Path"),_variant_t
(lpszDiskPath));
iAds->SetInfo();
iAds->Release();
iAds->Release();
iContainer->Release();
iContainer->Release();
return TRUE;
}
else{
iAds->Release();
iAds->Release();
iContainer->Release();
iContainer->Release();
return FALSE;
}
}
else{
iAds->Release();
iContainer->Release();
}
}
else{
iAds->Release();
} iContainer->Release();
} return FALSE;
}
Да, на Win2k en sp3 + IIS5.0 не создается экземпляр IMSAdminBase. На WinXP en sp1 + IIS5.1 — работает.
"ERROR: CreateInstance Failed! Error: 0x80070005 the example failed with 0x80070005"
// Initialize COM
hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
if (FAILED(hr))
{
wprintf( L"ERROR: CoInitialize Failed! Error: 0x%08x\n", hr );
goto exit;
}
hr = CoGetClassObject( CLSID_MSAdminBase, CLSCTX_SERVER, &csiMachineName,
IID_IClassFactory, (void**) &pClassFactory);
if (FAILED(hr))
{
wprintf( L"ERROR: CoGetClassObject Failed! Error: 0x%08x\n", hr );
goto exit;
}
hr = pClassFactory->CreateInstance(NULL, IID_IMSAdminBase, (void **) &pAdminBase);
if (FAILED(hr))
{
wprintf( L"ERROR: CreateInstance Failed! Error: 0x%08x\n", hr );
goto exit;
}
Здравствуйте, iShadow, Вы писали:
S>Да, на Win2k en sp3 + IIS5.0 не создается экземпляр IMSAdminBase. На WinXP en sp1 + IIS5.1 — работает.
S>"ERROR: CreateInstance Failed! Error: 0x80070005 the example failed with 0x80070005"
сорри, это был мой косяк с именем хоста