11ho 发表于 2015-8-16 10:59:06

使用VC++ ADSI编程控制IIS-

使用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;
                                 v.vt=VT_BOOL;       v.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
页: [1]
查看完整版本: 使用VC++ ADSI编程控制IIS-