C/C++编程操作IIS7
由于IIS6与IIS7以后的编程接口更改,导致IIS6的项目无法访问IIS7,研究了几天时间,终于有些眉目,现在记录如下。首先需要说明如下问题:
1.iis7以后的版本不再支持nntp (http://forums.iis.net/t/1160175.aspx这个页面有明显说明)
2.如果要使用smtp需要系统安装iis6兼容组件
3.如果要使用iis6的接口来访问iis7的信息需要安装iis6兼容组件
网络上很多关于IIS6的编程接口应用,现只说明C/C++编程操作IIS7的方法。详细的操作方式及说明,可以查看微软的在线MSDN(msdn.microsoft.com)
#include <stdio.h>
#include <string.h>
#include <ahadmin.h>
#include <tchar.h>
HRESULT ListSiteInfo(IAppHostElementCollection *pSitesCollection)
{
HRESULT hr;
DWORD iCount;
DWORD jCount;
DWORD kCount;
VARIANT vtCount;
VARIANT vtPropertyName;
VARIANT value;
BSTR bstrPropValue = NULL;
BSTR bstrIdPropValue = NULL;
IAppHostElement *site = NULL;
IAppHostElement *appPath = NULL;
IAppHostElement *dirPath = NULL;
IAppHostProperty *prop = NULL;
IAppHostPropertyCollection* pElemProps= NULL;
IAppHostElementCollection *pAppPathCollection = NULL;
IAppHostElementCollection *pVirtualPathCollection = NULL;
BSTR bstrSiteName = SysAllocString(L"name");
BSTR bstrSiteId = SysAllocString(L"id");
BSTR bstrSiteRootPath = SysAllocString( L"path" );
BSTR bstrAppRootPath = SysAllocString( L"application" );
BSTR bstrVirtualDirPath = SysAllocString(L"virtualDirectory");
BSTR bstrPhysicalPath = SysAllocString(L"physicalPath");
hr = pSitesCollection->get_Count(&iCount);
if (FAILED(hr))
{
printf("ERROR: Unable to get site count.\n");
goto _END;
}
//依次列举每个site的信息
for (DWORD i = 0; i < iCount; i++)
{
VariantInit(&vtCount);
vtCount.lVal = i;
vtCount.vt = VT_I4;
hr = pSitesCollection->get_Item(vtCount, &site);
if (FAILED(hr))
{
goto _END;
}
//获取site的属性
hr = site->GetPropertyByName(bstrSiteName, &prop);
if (FAILED(hr))
{
goto _END;
}
hr = prop->get_StringValue(&bstrPropValue);
if (FAILED(hr))
{
goto _END;
}
prop->Release();
prop = NULL;
hr = site->GetPropertyByName(bstrSiteId, &prop);
if (FAILED(hr))
{
goto _END;
}
hr = prop->get_Value(&value);
if (FAILED(hr))
{
goto _END;
}
_tprintf(_T("Site name : %s, id : %d\n"), bstrPropValue, value.lVal);
SysFreeString(bstrPropValue);
bstrPropValue = NULL;
prop->Release();
prop = NULL;
//获取site的下层
hr = site->get_Collection(&pAppPathCollection);
if (FAILED(hr))
{
goto _END;
}
hr = pAppPathCollection->get_Count(&jCount);
if (FAILED(hr))
{
goto _END;
}
for (DWORD j = 0; j < jCount; j++)
{
VariantInit(&vtCount);
vtCount.lVal = j;
vtCount.vt = VT_I4;
hr = pAppPathCollection->get_Item(vtCount, &appPath);
if (FAILED(hr))
{
goto _END;
}
hr = appPath->get_Collection(&pVirtualPathCollection);
if (FAILED(hr))
{
goto _END;
}
hr = pVirtualPathCollection->get_Count(&kCount);
if (FAILED(hr))
{
goto _END;
}
for (DWORD k = 0; k < kCount; k++)
{
VariantInit(&vtCount);
vtCount.lVal = k;
vtCount.vt = VT_I4;
hr = pVirtualPathCollection->get_Item(vtCount, &dirPath);
if (FAILED(hr))
{
goto _END;
}
hr = dirPath->GetPropertyByName(bstrSiteRootPath, &prop);
if (FAILED(hr))
{
goto _END;
}
hr = prop->get_StringValue(&bstrPropValue);
if (FAILED(hr))
{
goto _END;
}
_tprintf(_T("Site root path:%s\n"), bstrPropValue);
hr = dirPath->GetPropertyByName(bstrPhysicalPath, &prop);
if (FAILED(hr))
{
goto _END;
}
hr = prop->get_StringValue(&bstrPropValue);
if (FAILED(hr))
{
goto _END;
}
_tprintf(_T("Site phyical path:%s\n"), bstrPropValue);
SysFreeString(bstrPropValue);
bstrPropValue = NULL;
prop->Release();
prop = NULL;
dirPath->Release();
dirPath = NULL;
}
pVirtualPathCollection->Release();
pVirtualPathCollection = NULL;
appPath->Release();
appPath = NULL;
}
pAppPathCollection->Release();
pAppPathCollection = NULL;
site->Release();
site = NULL;
}
_END:
if (NULL != bstrPropValue)
{
SysFreeString(bstrPropValue);
}
if (NULL != prop)
{
prop->Release();
}
if (NULL != dirPath)
{
dirPath->Release();
}
if (NULL != pVirtualPathCollection)
{
pVirtualPathCollection->Release();
}
if (NULL != appPath)
{
appPath->Release();
}
if (NULL != pAppPathCollection)
{
pAppPathCollection->Release();
}
if (NULL != site)
{
site->Release();
}
SysFreeString(bstrSiteName);
SysFreeString(bstrSiteId);
SysFreeString(bstrSiteRootPath);
SysFreeString(bstrAppRootPath);
SysFreeString(bstrVirtualDirPath);
SysFreeString(bstrPhysicalPath);
return hr;
}
int main(int argc, char **argv)
{
HRESULT hr = S_OK;
IAppHostWritableAdminManager*pMgr = NULL;
IAppHostElement *pElem = NULL;
IAppHostElementCollection *pSitesCollection = NULL;
BSTR bstrMetadataName = SysAllocString( L"system.applicationHost/sites" );
BSTR bstrConfigCommitPath = SysAllocString( L"MACHINE/WEBROOT/APPHOST" );
printf("Press any key to continue...");
getchar();
// Initialize
hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
if ( FAILED( hr ) )
{
printf_s( "ERROR: Unable to initialize\n" );
goto _OUT;
}
// Create
hr = CoCreateInstance( __uuidof( AppHostWritableAdminManager), NULL,
CLSCTX_INPROC_SERVER,
__uuidof( IAppHostWritableAdminManager), (void**) &pMgr );
if( FAILED( hr ) )
{
printf_s( "ERROR: Unable to create an IAppHostAdminManager instance\n" );
goto _OUT;
}
hr = pMgr->GetAdminSection(bstrMetadataName, bstrConfigCommitPath, &pElem);
if ( FAILED( hr ) )
{
printf("ERROR: Unable to get admin section.\n");
goto _OUT;
}
hr = pElem->get_Collection(&pSitesCollection);
if ( FAILED( hr ) )
{
printf("ERROR: Unable to get sites collection.\n");
goto _OUT;
}
hr = ListSiteInfo(pSitesCollection);
_OUT:
if (NULL != pSitesCollection)
{
pSitesCollection->Release();
}
if (NULL != pElem)
{
pElem->Release();
}
if ( pMgr != NULL )
{
pMgr->Release();
}
SysFreeString( bstrMetadataName );
CoUninitialize();
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
页:
[1]