My E-mail 用志趣吸引人;用感情留住人;用技術武裝人;用創新發展人;一切以人為本!

Leo LU

使用VC++ ADSI编程控制IIS- -(转)

使用VC++ ADSI编程控制IIS- -(z)

                                      

李骏  (2005-7-6)

由于工作需要,最近用到了ADSIIIS的控制编程,在网上SearchN久,除了一些关于建立虚拟目录的文章外,没有稍微深入一些的。但是我的工作任务比这些要深入一些。因此,只有自力更生努力了。-_- 不过其中还是借助一些网络朋友的文章内容。特此声明。

完整代码如下:

 

 

//配置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,&params,&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

posted on 2007-06-11 08:40  Leo LU  阅读(587)  评论(0)    收藏  举报

导航