使用C++操作IIS的虚拟目录

原创 2007年10月14日 01:12:00

大约1年前由于工作需要操作IIS, 网上可以找到的现成比较详细的C++示例不多, 花了不少时间去做的... 分享出来, 希望有用得到的朋友.

#define IIS_VIRTUALDIR_ACCESSREAD 0x00000001
#define IIS_VIRTUALDIR_ACCESSWRITE 0x00000002
#define IIS_VIRTUALDIR_ACCESSSCRIPT 0x00000004
#define IIS_VIRTUALDIR_ACCESSEXECUTE 0x00000008
#define IIS_VIRTUALDIR_ENABLEDIRBROWSING 0x00000010
#define IIS_VIRTUALDIR_ENABLEDEFAULTDOC 0x00000020
#define IIS_VIRTUALDIR_CREATEAPP 0x00000040
#define IIS_VIRTUALDIR_ENABLEASPENABLEPARENTPATHS 0x00000080


#define ERRORCODE_SUCCESS 0
#define ERRORCODE_CHECKSERVICEERROR -1
#define ERRORCODE_CANNTSTARTSERVICE -2
#define ERRORCODE_ERROROPENSERVICE -3
#define ERRORCODE_ENUMSERVICEERROR -4
#define ERRORCODE_NOSERVICE -5



//---------------------------------------------------------------------------
//为IIS的默认站点创建虚拟目录
//参数: 虚拟目录名, 实际目录, 目录属性
BOOL CreateVirtualDirectory( LPCTSTR lpszVirtualDirName, LPCTSTR lpszDiskPath, DWORD dwAttr, LPCTSTR pSrvName )
...{
 IADsContainer
* iContainer;
 IADs
* iAds;
 
/**//* 获得WebSever */
 
if ( ADsGetObject( L"IIS://localhost/w3svc", IID_IADsContainer, (void**)&iContainer ) == S_OK )
 
...{
  
//等到默认站点
  if ( iContainer->GetObject( _bstr_t( "IIsWebServer" ), _bstr_t( pSrvName ), ( IDispatch** )&iAds ) == S_OK )
        
...{
            
if ( iAds->QueryInterface( IID_IADsContainer, ( void** )&iContainer ) == S_OK )
            
...{
                
//得到默认站点的根目录
                if ( 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( lpszVirtualDirName ) );
                        
//建立虚拟目录
                        if ( iContainer->Create( _bstr_t( "IIsWebVirtualDir" ), _bstr_t( lpszVirtualDirName ), ( IDispatch** )&iAds ) == S_OK )
                        
...{
                            
//设置虚拟目录的属性
                            if ( dwAttr & IIS_VIRTUALDIR_ACCESSREAD )
                            
...{
                                iAds
->Put( _bstr_t( "AccessRead" ), _variant_t( true ) );
                            }


                            
if ( dwAttr & IIS_VIRTUALDIR_ACCESSWRITE )
                            
...{
                                iAds
->Put( _bstr_t( "AccessWrite" ), _variant_t( true ) );
                            }


                            
if ( dwAttr & IIS_VIRTUALDIR_ACCESSSCRIPT )
                            
...{
                                iAds
->Put( _bstr_t( "AccessScript" ), _variant_t( true ) );
                            }


                            
if ( dwAttr & IIS_VIRTUALDIR_ACCESSEXECUTE )
                            
...{
                                iAds
->Put( _bstr_t( "AccessExecute" ), _variant_t( true ) );
                            }


                            
if ( dwAttr & IIS_VIRTUALDIR_ENABLEDIRBROWSING )
                            
...{
                                iAds
->Put( _bstr_t( "EnableDirBrowsing" ), _variant_t( true ));
                            }


                            
if ( dwAttr & IIS_VIRTUALDIR_ENABLEDEFAULTDOC )
                            
...{
                                iAds
->Put( _bstr_t( "EnableDefaultDoc"), _variant_t( true ) );
                            }


                            
if ( dwAttr & IIS_VIRTUALDIR_ENABLEASPENABLEPARENTPATHS )
                            
...{
                                iAds
->Put( _bstr_t( "AspEnableParentPaths" ), _variant_t( true ) );
                            }


                            
if ( dwAttr & IIS_VIRTUALDIR_CREATEAPP )
                            
...{
                                iAds
->Put( _bstr_t( "AppFriendlyName" ), _variant_t( lpszVirtualDirName ) );

                                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, 10 };                  //定义DISPPARAMS参数
                                VARIANT vResult;
                                iAds
->Invoke( dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params&vResult, NULL, NULL);    //开始调用方法
                            }

                            iAds
->Put( _bstr_t( "Path" ), _variant_t( lpszDiskPath ) );
                            iAds
->SetInfo();
                            iAds
->Release();
                            iContainer
->Release();
                            
return TRUE;
                        }

                        
else
                        
...{
                            iAds
->Release();
                            iContainer
->Release();
                            
return FALSE;
                        }

                    }

                }

                
else
                
...{
                    iAds
->Release();
                }

            }

            
else
            
...{
                iAds
->Release();
            }

        }

  iContainer
->Release();
 }

 
return FALSE;
}

 
//---------------------------------------------------------------------------
//为本机的IIS的默认站点的虚拟目录增加/更新MIME类型.
//参数说明: lpszVirtualDirName:虚拟目录,  pExtension:带"."的扩展名, pType:对该扩展名的描述
bool AddMimeType( LPCWSTR lpszVirtualDirName, LPWSTR pExtension, LPWSTR pType, LPWSTR pSrvName )
...{
    CComPtr
<IADs> iAds;
    HRESULT hr;
    _bstr_t bstrExt( pExtension );

    
/**//* 获得WebSever */
    wchar_t szPath[ MAX_PATH ] 
= ...0 };
    wcscat( szPath, L
"IIS://localhost/W3SVC/" );
    wcscat( szPath, pSrvName );      
//w3svc后的1表示为默认站点, 如果为其它站点,请相应设置
    wcscat( szPath, L"/ROOT/" );
    wcscat( szPath, lpszVirtualDirName );

    
bool bRet = false;

    
if ( ADsGetObject( szPath, IID_IADs, ( void** )&iAds ) == S_OK )
    
...{
        
//ShowMessage( "1" );
        VARIANT vMimeMap;
        ::VariantInit( 
&vMimeMap );
        
if ( S_OK == iAds->GetEx( _bstr_t( "MimeMap" ), &vMimeMap ) )
        
...{
            
//ShowMessage( "2" );
            if ( vMimeMap.vt & VT_ARRAY )
            
...{
                
//ShowMessage( "3" );
                long lIdx;
                
long lLow;
                
long lHigh;
                _bstr_t bstrBuff;
                BSTR bstrRaw;
                CComQIPtr
<IISMimeType> MimeType;
                VARIANT vElem;
                ::VariantInit( 
&vElem );
                SAFEARRAY
* pArrMimeMap = vMimeMap.parray;
                
//Get the upper and lower bounds of the array
                ::SafeArrayGetLBound( pArrMimeMap, 1&lLow );
                ::SafeArrayGetUBound( pArrMimeMap, 
1&lHigh );
                
//Loop through the array

                
bool bFound = false;
                lIdx 
= lLow;
                
while ( lIdx <= lHigh )
                
...{
                    hr 
= ::SafeArrayGetElement( pArrMimeMap, &lIdx , &vElem );
                    
if( SUCCEEDED( hr ) )
                    
...{
                        
if ( vElem.vt & VT_DISPATCH )
                        
...{
                            
//Each element in array should be of type IISMimeType
                            MimeType = vElem.pdispVal;
                            
if ( MimeType != NULL )
                            
...{
                                MimeType
->get_Extension( &bstrRaw );
                                bstrBuff 
= bstrRaw;
                                
//Check if the extension matches
                                if( bstrExt == bstrBuff )
                                
...{
                                    bFound 
= true;
                                    
break;
                                }


                            }

                            
//MimeType.Release();
                        }

                    }

                    lIdx
++;
                }
   // Loop through elements

                
if ( bFound )
                
...{
                    MimeType
->put_MimeType( pType );
                    MimeType.Release();
                    bRet 
= true;
                }

                
else
                
...{
                    MimeType.Release();

                    hr 
= MimeType.CoCreateInstance( L"MimeMap", NULL, CLSCTX_INPROC_SERVER );

                    
if ( SUCCEEDED( hr ) )
                    
...{
                        
//ShowMessage( "4" );
                        MimeType->put_Extension( pExtension );
                        MimeType
->put_MimeType( pType );
                        SAFEARRAYBOUND Bound[ 
1 ];
                        Bound[ 
0 ].lLbound = lLow;
                        
if ( lHigh < lLow )
                        
...{
                            Bound[ 
0 ].cElements = 1;
                        }

                        
else
                        
...{
                            Bound[ 
0 ].cElements = lHigh - lLow + 2;
                        }


                        hr 
= SafeArrayRedim( pArrMimeMap, Bound );
                        
if ( SUCCEEDED( hr ) )
                        
...{
                            vElem.vt 
= VT_DISPATCH;    //在MIME数组中不包含原始元素时这里确保该变量为VT_DISPATCH
                            vElem.pdispVal = MimeType;
                            VARIANT 
*pvtData;

                            
if ( SUCCEEDED( SafeArrayAccessData( pArrMimeMap, reinterpret_cast< void** >&pvtData ) ) ) )
                            
...{
                                
if ( lHigh < lLow )
                                
...{
                                    pvtData[ lLow ] 
= vElem;
                                }

                                
else
                                
...{
                                    pvtData[ lHigh 
- lLow + 1 ] = vElem;
                                }


                                hr 
= iAds->PutEx( ADS_PROPERTY_UPDATE, _bstr_t( "MimeMap" ), vMimeMap );
                                
if ( SUCCEEDED( hr ) )
                                
...{
                                    
//ShowMessage( "5" );
                                    if ( S_OK == iAds->SetInfo() )
                                    
...{
                                        
//ShowMessage( "6" );
                                        bRet = true;
                                    }

                                }

                                SafeArrayUnaccessData( pArrMimeMap );
                            }

                        }

                        MimeType.Release();
                    }
 // if ( S_OK == hr  )
                }
 //if ( bFound )
            }
 //if ( vMimeMap.vt & VT_ARRAY )
        }
 //if ( S_OK == iAds->GetEx( _bstr_t( "MimeMap" ), &vMimeMap ) )
    }
 //if ( ADsGetObject( szPath, IID_IADs, ( void** )&iAds ) == S_OK )

    
return bRet;
}

//---------------------------------------------------------------------------
int CheckW3SvcExist()
...{
    
int iErrCode = ERRORCODE_SUCCESS;
    SC_HANDLE hHandle 
= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    SC_HANDLE hService;
    
if (hHandle ==NULL ) //创建句柄失败
    ...{
        iErrCode 
= ERRORCODE_CHECKSERVICEERROR;
        
return iErrCode;
    }


    ENUM_SERVICE_STATUS service;
    DWORD dwBytesNeeded 
= 0;
    DWORD dwServicesReturned 
= 0;
    DWORD dwResumedHandle 
= 0;
    DWORD dwServiceType 
= SERVICE_WIN32;//只读取WIN32的服务 | SERVICE_DRIVER;
    char* chServiceName;
    
char* chFind;
    
bool bResult;
    
bool bHasService=false;

    chFind
="W3SVC";
    chFind
=strupr(strdup(chFind)); //_strdup The _strdup function calls malloc to allocate storage space
    
//for a copy of strSource and then copies strSource to the allocated space.
    
//所以要释放

    
// 查找服务列表
    bResult = EnumServicesStatus(hHandle,
        dwServiceType,
        SERVICE_STATE_ALL,
        
&service,
        
sizeof(ENUM_SERVICE_STATUS),
        
&dwBytesNeeded,
        
&dwServicesReturned,
        
&dwResumedHandle
        );

    
if ( !bResult ) 
    
...{
        
// 获取应需要的内存空间
        if (GetLastError() == ERROR_MORE_DATA) 
        
...{            
            DWORD dwBytes 
= sizeof(ENUM_SERVICE_STATUS) + dwBytesNeeded;
            ENUM_SERVICE_STATUS
* pServices = NULL;
            pServices 
= new ENUM_SERVICE_STATUS [dwBytes];
   
            
// 获取服务列表
            EnumServicesStatus( hHandle,
                            dwServiceType,
                            SERVICE_STATE_ALL, 
                            pServices, 
                            dwBytes, 
                            
&dwBytesNeeded,
                            
&dwServicesReturned,
                            
&dwResumedHandle
            );
   
            
// 提取每个列表
   
            
for (unsigned iIndex = 0; iIndex < dwServicesReturned; iIndex++
            
...{
                
//chServiceName=(pServices+iIndex)->lpDisplayName;
                chServiceName = strupr( strdup((pServices+iIndex)->lpServiceName));
                
if(strcmp(chFind,chServiceName)==0)
                
...{
                    
switch((pServices+iIndex)->ServiceStatus.dwCurrentState)
                    
...{      
                    
case SERVICE_STOPPED:            
                        hService
= OpenService(hHandle,chServiceName,SERVICE_ALL_ACCESS);
                        
if( hService == 0 )
                        
...{
                            iErrCode 
= ERRORCODE_ERROROPENSERVICE;
                        }

                        
else
                        
...{
                            bResult
=StartService(hService,0,NULL);
                            
if(!bResult)
                            
...{
                                iErrCode 
= ERRORCODE_CANNTSTARTSERVICE;
                            }

                            CloseServiceHandle(hService);
                         
                        }
      
                          
break;
                     
case SERVICE_RUNNING:      
                          iErrCode 
= ERRORCODE_SUCCESS;
                          
break;
                     }

                    bHasService
=true;
                    free(chServiceName);
                    
break//退出循环
                }

                free( chServiceName );
            }

   
            delete[] pServices;
            pServices 
= NULL;
        }

        CloseServiceHandle( hHandle );
    }

    
else
    
...{
        iErrCode 
= ERRORCODE_ENUMSERVICEERROR;
    }

    
    free(chFind);
    
    
if!bHasService )
    
...{
        iErrCode 
= ERRORCODE_NOSERVICE;
    }

    
return iErrCode;
}

C/C++编程操作IIS7

由于IIS6与IIS7以后的编程接口更改,导致IIS6的项目无法访问IIS7,研究了几天时间,终于有些眉目,现在记录如下。 首先需要说明如下问题: 1.iis7以后的版本不再支持nntp (http:...
  • xiejianjun417
  • xiejianjun417
  • 2014年01月10日 10:17
  • 2174

IIS中FTP虚拟目录的妙用

相信不少朋友一定都用过微软自带的IIS中的FTP来架设自己的FTP站点吧!我开始学习FTP架站时就是从它开始的。后来玩的多了,发现FTP虚拟目录有一个非常有趣的地方。并且,我们完全可以利用这点来达到隐...
  • u014062332
  • u014062332
  • 2014年05月23日 16:55
  • 1388

IIS Express配置虚拟目录及常用功能配置

本篇文章主要介绍: 通过配置 IIS Express IIS10.0,实现虚拟目录访问站点。 通过配置 IIS Express 实现 一个域名下,访问不同的路径,来对应不同项目,对应不同的路径。 介绍...
  • shuai_wy
  • shuai_wy
  • 2017年04月05日 18:21
  • 2970

IIS - 虚拟目录与应用程序的异同

在Windows 7 IIS7中,对服务器建立站点后,有二种添加子站点的方式 A. 虚拟目录 B. 应用程序 简单总结下二者之间的异同 A.虚拟目录     虚拟目录是指在站点下建立...
  • xiaoqijun
  • xiaoqijun
  • 2013年11月17日 20:48
  • 8583

ASP.NET对IIS中的虚拟目录进行操作

  • 2010年04月12日 14:48
  • 1KB
  • 下载

ASP.NET对IIS中的虚拟目录进行操作.rar

  • 2008年03月12日 22:40
  • 643B
  • 下载

.net操作IIS中的虚拟目录

1.创建IIS虚拟目录  用到的命名空间:System.DirectoryServices(须先引入System.DirectoryServices.dll)  DirectoryEntry的功能...
  • fengxinzi_jing
  • fengxinzi_jing
  • 2012年10月08日 17:03
  • 401

IIS虚拟目录的建立与使用

  • 2012年12月13日 16:20
  • 29KB
  • 下载

在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误

解决方案一:导致你这个问题,是因为你的虚拟目录路径设置不正确,路径设置到你的工程名即可. 或是你的虚拟目录别名...多少有影响..   我之前都是出这样的问题,这是自身经验...你试试. 把I...
  • fan325
  • fan325
  • 2011年09月08日 12:24
  • 1568

解决.NET在应用程序级别之外使用注册为allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。

这个问题是调试从服务器拷贝过来的网站时遇到。 网站目录结构大致如下:      一般情况下我们的网站都是只有一个Web.config文件。      很明显在上图中WebSite5下面有个W...
  • DongGeGe214
  • DongGeGe214
  • 2015年05月12日 18:14
  • 1110
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C++操作IIS的虚拟目录
举报原因:
原因补充:

(最多只允许输入30个字)