|
|
使用VC++ ADSI编程控制IIS- -(z)
李骏 (2005-7-6)
由于工作需要,最近用到了ADSI对IIS的控制编程,在网上Search了N久,除了一些关于建立虚拟目录的文章外,没有稍微深入一些的。但是我的工作任务比这些要深入一些。因此,只有自力更生努力了。-_- 不过其中还是借助一些网络朋友的文章内容。特此声明。
完整代码如下:
//配置IIS系统
#if !defined _UNICODE
#define _UNICODE
int CSetupIIS::ConfigDirectory(LPCTSTR VirtualDirName, LPCTSTR Path, LPCTSTR ScriptMapsName)
{
// TODO: Add extra validation here
::CoInitialize(NULL); //初始化COM组件
IADsContainer* iContainer;
IADs* iAds;
if(S_OK==ADsGetObject(L"IIS://localhost/w3svc",IID_IADsContainer,(void**)&iContainer))
{
//等到默认站点
iContainer->GetObject(_bstr_t("IIsWebServer"), _bstr_t("1"),(IDispatch**)&iAds);
if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK)
{
//得到默认站点的根目录
iContainer->GetObject(_bstr_t("IIsWebVirtualDir"),_bstr_t("Root"),(IDispatch**)&iAds);
//获得访问虚拟目录
if(iAds->QueryInterface(IID_IADsContainer,(void**)&iContainer)==S_OK)
{
//先删除了虚拟目录
iContainer->Delete(_bstr_t("IIsWebVirtualDir"), _bstr_t(VirtualDirName));
//建立虚拟目录
if(iContainer->Create(_bstr_t("IIsWebVirtualDir"), _bstr_t(VirtualDirName),(IDispatch**)&iAds)==S_OK)
{
//设置虚拟目录的属性
iAds->Put(_bstr_t("AccessRead"),_variant_t("True")); //可读属性
// iAds->Put(_bstr_t("AccessWrite"),_variant_t("True")); //可写属性,默认关闭
iAds->Put(_bstr_t("EnableDefaultDoc"),_variant_t("True"));
iAds->Put(_bstr_t("AppAllowDebugging"),_variant_t("True")); //应用程序允许调试
iAds->Put(_bstr_t("AccessScript"),_variant_t("True")); //执行许可属性
iAds->Put(_bstr_t("AppFriendlyName"),_variant_t(VirtualDirName)); //应用程序名
iAds->Put(_bstr_t("DefaultDoc"),_variant_t("index.htm"));
iAds->Put(_bstr_t("AppIsolated"),_variant_t("2"));
iAds->Put(_bstr_t("Path"),_variant_t(Path)); //虚拟目录物理的根目录
iAds->Put(_bstr_t("ScriptMaps"),_variant_t(ScriptMapsName));
OLECHAR * arrFunName[]={L"AppCreate"}; //定义com的函数名称
DISPID dispID;
iContainer->GetIDsOfNames(IID_NULL,arrFunName,1,
LOCALE_SYSTEM_DEFAULT,&dispID); //取得DISPID值,由dispID返回
VARIANTARG v[1];
v[0].vt=VT_BOOL; v[0].boolVal=TRUE; //AppCreate的参数负值,
DISPPARAMS params={v,NULL,1,0}; //定义DISPPARAMS参数
VARIANT vResult;
iAds->Invoke(dispID,IID_NULL,LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,¶ms,&vResult,NULL,NULL); //开始调用方法
iAds->SetInfo();
iAds->Release(); //释放iAds指针
iAds->Release();
iContainer->Release(); //释放iContainer对象指针
iContainer->Release();
// AfxMessageBox("IIS Setup ok");
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;
::CoUninitialize(); //结束COM调用
}
#endif
IIS配置,这一部分涉及到了Windows 活动目录的ADSI编程。据说这是唯一跟IIS交互的途径。先要建立虚拟目录,这使用到了IisWebVirtualDir对象,他有众多的属性以及方法。使用:if(iContainer->Create(_bstr_t("IIsWebVirtualDir"), _bstr_t(VirtualDirName),(IDispatch**)&iAds)==S_OK) 来建立虚拟目录。通过方法Put以下各个属性来设置我们的虚拟目录的功能。
iAds->Put(_bstr_t("AccessRead"),_variant_t("True")); //可读属性
//iAds->Put(_bstr_t("AccessWrite"),_variant_t("True")); //可写属性,默认关闭
iAds->Put(_bstr_t("EnableDefaultDoc"),_variant_t("True"));
iAds->Put(_bstr_t("AppAllowDebugging"),_variant_t("True")); //应用程序允许调试
iAds->Put(_bstr_t("AccessScript"),_variant_t("True")); //执行许可属性
iAds->Put(_bstr_t("AppFriendlyName"),_variant_t(VirtualDirName)); //应用程序名
iAds->Put(_bstr_t("DefaultDoc"),_variant_t("index.htm"));
iAds->Put(_bstr_t("AppIsolated"),_variant_t("2"));
iAds->Put(_bstr_t("Path"),_variant_t(Path)); //虚拟目录物理的根目录
iAds->Put(_bstr_t("ScriptMaps"),_variant_t(ScriptMapsName));
并且通过Idispatch::Invoke()函数来间接调用AppCreate方法。使虚拟目录生效。需要注意的地方是:这里使用了UNICODE,并且在使用IisWebVirtualDir对象的时候在Project->Setting菜单的link标签下面添上activeds.lib adsiid.lib,还要#include "activeds.h" 。另外还有一个函数重起IIS ResetIIS(),先调用命令net stop w3svc 停止IIS服务,再调用net start w3svc 启动IIS服务,按理说这两步也许是多余的,但是以防万一嘛!^_^ 我把这几个函数封装到一个类里面了,方便调用.
初写文章,错误难免,请指正。
jarjin@gmail.com |
|