设为首页 收藏本站
查看: 803|回复: 0

[经验分享] VC操纵IIS

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-15 07:22:44 | 显示全部楼层 |阅读模式
  CIISAdminBase::CIISAdminBase()
{
  HRESULT hRes = 0;
::CoInitialize(NULL);
hRes = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, &m_pIMetabase);

if(FAILED(hRes))
{
  WriteLogFile("Can't create instance - CIISAdminBase create");
  m_pIMetabase = NULL;
}
}
  CIISAdminBase::~CIISAdminBase()
{
// Destroy the object
if(m_pIMetabase)
{
  ((IUnknown *) m_pIMetabase)->Release();
  m_pIMetabase = NULL;
}
::CoUninitialize();
}
  //////////////////////////////////////////////////////////////////////
// WWW Site operations
  BOOL CIISAdminBase::StartWebSite()
{
BOOL bRet = SetServerStatus();
if(!bRet)
  WriteLogFile("Can't start web site");
return bRet;
}
  BOOL CIISAdminBase::StopWebSite()
{
BOOL bRet = SetServerStatus(FALSE);
if(!bRet)
  WriteLogFile("Can't stop web site");
return bRet;
}
  BOOL CIISAdminBase::AddWebSite(CString strSiteName, CString strSitePath, DWORD dwAccessFlag)
{
BOOL bRet = CreateSite(strSiteName, "/LM/W3SVC/1/ROOT", strSitePath, dwAccessFlag);
if(!bRet)
  WriteLogFile("Can't create web site: " + strSiteName);
return bRet;
}
  BOOL CIISAdminBase::KillWebSite(const CString &strSiteName)
{
if(!m_pIMetabase) return FALSE;

HRESULT hRes = 0;
METADATA_HANDLE hRoot;
CIISPtr ptrIIS((IMSAdminBase *)m_pIMetabase);
  // Prepare BSTRs
CComBSTR bstrSiteName = "/1/ROOT/" + strSiteName;
CComBSTR bstrSiteRoot = "/LM/W3SVC";
  // Open metabase key
    hRes = ptrIIS->OpenKey(METADATA_MASTER_ROOT_HANDLE, bstrSiteRoot,
       METADATA_PERMISSION_WRITE, 20, &hRoot);
if(FAILED(hRes)) return FALSE;

// Delete a key
hRes = ptrIIS->DeleteKey(hRoot, bstrSiteName);
if(FAILED(hRes) && HRESULT_CODE(hRes) != ERROR_PATH_NOT_FOUND) return FALSE;

ptrIIS->CloseKey(hRoot);
return TRUE;
}
  
BOOL CIISAdminBase::CreateSite(CString strSiteName, CString strSiteVDir,
          CString strSiteDir, DWORD dwAccessFlag)
{
if(!m_pIMetabase) return FALSE;

HRESULT hRes = 0;
METADATA_HANDLE hRoot;
METADATA_RECORD metaRecord;
CIISPtr ptrIIS((IMSAdminBase *)m_pIMetabase);
  // Prepare BSTRs
CComBSTR bstrSiteName = strSiteName;
CComBSTR bstrSiteVDir = strSiteVDir;
CComBSTR bstrSiteVName = "" + strSiteName;
CComBSTR bstrSiteDir = strSiteDir;
// Open metabase key
    hRes = ptrIIS->OpenKey(METADATA_MASTER_ROOT_HANDLE, bstrSiteVDir,
       METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, 20, &hRoot);
if(FAILED(hRes))
{
  WriteLogFile("Can't open metabase key: " + strSiteVDir);
  return FALSE;
}

// Add a key
hRes = ptrIIS->AddKey(hRoot, bstrSiteVName);
if(FAILED(hRes) && HRESULT_CODE(hRes) != ERROR_ALREADY_EXISTS)
{
  WriteLogFile("Can't add key to metabase: /" + strSiteName);
  return FALSE;
}
  ///////////////////////////////////////////////////////////
// Set Site Properties
// Key type
CComBSTR bstrKeyType("IIsWebVirtualDir");
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_KEY_TYPE;
metaRecord.dwMDUserType = IIS_MD_UT_SERVER;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrKeyType;
metaRecord.dwMDDataLen = bstrKeyType.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Key type:IIsWebVirtualDir");
  return FALSE;
}
  // Friendly name
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_APP_FRIENDLY_NAME;
metaRecord.dwMDUserType = IIS_MD_UT_WAM;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrSiteName;
metaRecord.dwMDDataLen = bstrSiteName.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Friendly name");
  return FALSE;
}
  // App Root Path
CComBSTR bstrSiteRoot = strSiteVDir + "/" + strSiteName;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_APP_ROOT;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrSiteRoot;
metaRecord.dwMDDataLen = bstrSiteRoot.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for App Root Path");
  return FALSE;
}
  // Path
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_VR_PATH;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrSiteDir;
metaRecord.dwMDDataLen = bstrSiteDir.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Path");
  return FALSE;
}
  // Access Flag
DWORD dwFlag = dwAccessFlag; //MD_ACCESS_READ | MD_ACCESS_EXECUTE | MD_ACCESS_SCRIPT;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = DWORD_METADATA;
metaRecord.dwMDIdentifier = MD_ACCESS_PERM;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)&dwFlag;
metaRecord.dwMDDataLen = sizeof(DWORD);
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Access Flag");
  return FALSE;
}
  // Dir Browse Flag
dwFlag = 1073741886;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = DWORD_METADATA;
metaRecord.dwMDIdentifier = MD_DIRECTORY_BROWSING;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)&dwFlag;
metaRecord.dwMDDataLen = sizeof(DWORD);
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Dir Browse Flag");
  return FALSE;
}
  // App Isolate
dwFlag = 2;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = DWORD_METADATA;
metaRecord.dwMDIdentifier = MD_APP_ISOLATED;
metaRecord.dwMDUserType = IIS_MD_UT_WAM;
metaRecord.pbMDData = (unsigned char *)&dwFlag;
metaRecord.dwMDDataLen = sizeof(DWORD);
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for App Isolate");
  return FALSE;
}
  // Site Properties complete, close the metabase key
ptrIIS->CloseKey(hRoot);
  return TRUE;
}
  
BOOL CIISAdminBase::SetServerStatus(BOOL bStart, BOOL bW3Site)
{
if(!m_pIMetabase) return FALSE;

HRESULT hRes = 0;
METADATA_HANDLE hRootW3;
CIISPtr ptrIIS((IMSAdminBase *)m_pIMetabase);
  // Open metabase key
CComBSTR bstrSiteName;
if(bW3Site) bstrSiteName = "/LM/W3SVC";
else bstrSiteName = "/LM/MSFTPSVC/";
  hRes = ptrIIS->OpenKey(METADATA_MASTER_ROOT_HANDLE, bstrSiteName,
       METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, 20, &hRootW3);
if(FAILED(hRes)) return FALSE;
  // Get metabase key data
METADATA_RECORD metaRecord;
DWORD dwBuffer;

if(bStart) dwBuffer = MD_SERVER_COMMAND_START;
else dwBuffer = MD_SERVER_COMMAND_STOP;
  ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDIdentifier = MD_SERVER_COMMAND;
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDUserType = IIS_MD_UT_SERVER;
metaRecord.dwMDDataType = DWORD_METADATA;
metaRecord.dwMDDataLen = sizeof(DWORD);
metaRecord.pbMDData = (unsigned char*)&dwBuffer;
  hRes = ptrIIS->SetData(hRootW3, CComBSTR("/1"), &metaRecord);
  if(FAILED(hRes)) return FALSE;
  ptrIIS->CloseKey(hRootW3);

return TRUE;
}
  BOOL CIISAdminBase::CreateSite(CString strSiteName, CString strSiteVDir,
          CString strSiteDir, DWORD dwAccessFlag)
{
if(!m_pIMetabase) return FALSE;

HRESULT hRes = 0;
METADATA_HANDLE hRoot;
METADATA_RECORD metaRecord;
CIISPtr ptrIIS((IMSAdminBase *)m_pIMetabase);
  // Prepare BSTRs
CComBSTR bstrSiteName = strSiteName;
CComBSTR bstrSiteVDir = strSiteVDir;
CComBSTR bstrSiteVName = "" + strSiteName;
CComBSTR bstrSiteDir = strSiteDir;
// Open metabase key
    hRes = ptrIIS->OpenKey(METADATA_MASTER_ROOT_HANDLE, bstrSiteVDir,
       METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, 20, &hRoot);
if(FAILED(hRes))
{
  WriteLogFile("Can't open metabase key: " + strSiteVDir);
  return FALSE;
}

// Add a key
hRes = ptrIIS->AddKey(hRoot, bstrSiteVName);
if(FAILED(hRes) && HRESULT_CODE(hRes) != ERROR_ALREADY_EXISTS)
{
  WriteLogFile("Can't add key to metabase: /" + strSiteName);
  return FALSE;
}
  ///////////////////////////////////////////////////////////
// Set Site Properties
// Key type
CComBSTR bstrKeyType("IIsWebVirtualDir");
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_KEY_TYPE;
metaRecord.dwMDUserType = IIS_MD_UT_SERVER;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrKeyType;
metaRecord.dwMDDataLen = bstrKeyType.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Key type:IIsWebVirtualDir");
  return FALSE;
}
  // Friendly name
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_APP_FRIENDLY_NAME;
metaRecord.dwMDUserType = IIS_MD_UT_WAM;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrSiteName;
metaRecord.dwMDDataLen = bstrSiteName.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Friendly name");
  return FALSE;
}
  // App Root Path
CComBSTR bstrSiteRoot = strSiteVDir + "/" + strSiteName;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_APP_ROOT;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrSiteRoot;
metaRecord.dwMDDataLen = bstrSiteRoot.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for App Root Path");
  return FALSE;
}
  // Path
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = STRING_METADATA;
metaRecord.dwMDIdentifier = MD_VR_PATH;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)(unsigned short*)bstrSiteDir;
metaRecord.dwMDDataLen = bstrSiteDir.Length() * 2 + 3;
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Path");
  return FALSE;
}
  // Access Flag
DWORD dwFlag = dwAccessFlag; //MD_ACCESS_READ | MD_ACCESS_EXECUTE | MD_ACCESS_SCRIPT;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = DWORD_METADATA;
metaRecord.dwMDIdentifier = MD_ACCESS_PERM;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)&dwFlag;
metaRecord.dwMDDataLen = sizeof(DWORD);
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Access Flag");
  return FALSE;
}
  // Dir Browse Flag
dwFlag = 1073741886;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = DWORD_METADATA;
metaRecord.dwMDIdentifier = MD_DIRECTORY_BROWSING;
metaRecord.dwMDUserType = IIS_MD_UT_FILE;
metaRecord.pbMDData = (unsigned char *)&dwFlag;
metaRecord.dwMDDataLen = sizeof(DWORD);
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for Dir Browse Flag");
  return FALSE;
}
  // App Isolate
dwFlag = 2;
ZeroMemory(&metaRecord, sizeof(metaRecord));
metaRecord.dwMDAttributes = METADATA_INHERIT;
metaRecord.dwMDDataType = DWORD_METADATA;
metaRecord.dwMDIdentifier = MD_APP_ISOLATED;
metaRecord.dwMDUserType = IIS_MD_UT_WAM;
metaRecord.pbMDData = (unsigned char *)&dwFlag;
metaRecord.dwMDDataLen = sizeof(DWORD);
hRes = ptrIIS->SetData(hRoot, bstrSiteVName, &metaRecord);
if(FAILED(hRes))
{
  WriteLogFile("Can't set data for App Isolate");
  return FALSE;
}
  // Site Properties complete, close the metabase key
ptrIIS->CloseKey(hRoot);
  return TRUE;
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-99098-1-1.html 上篇帖子: IIS 中 .net 网站出现 服务器应用程序不可用 下篇帖子: IIS内存回收
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表