惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
月光博客
月光博客
T
Tailwind CSS Blog
Y
Y Combinator Blog
L
Lohrmann on Cybersecurity
Latest news
Latest news
H
Heimdal Security Blog
MongoDB | Blog
MongoDB | Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
阮一峰的网络日志
阮一峰的网络日志
C
CXSECURITY Database RSS Feed - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Recent Announcements
Recent Announcements
小众软件
小众软件
Security Archives - TechRepublic
Security Archives - TechRepublic
The Cloudflare Blog
T
Threatpost
S
Secure Thoughts
N
Netflix TechBlog - Medium
V2EX - 技术
V2EX - 技术
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
C
Cisco Blogs
C
CERT Recently Published Vulnerability Notes
爱范儿
爱范儿
SecWiki News
SecWiki News
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
D
DataBreaches.Net
S
Security @ Cisco Blogs
B
Blog RSS Feed
N
News and Events Feed by Topic
V
Visual Studio Blog
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - 痛并快乐着

linux redhat 中的网络配置 Javascript 自适应iframe页面大小(有效) - 痛并快乐着 - 博客园 在网页上点击链接激活MSN对话窗口。 - 痛并快乐着 - 博客园 asp枚举指定目录下的文件。 - 痛并快乐着 - 博客园 防止网页上的图片被保存 - 痛并快乐着 - 博客园 Asp/asp.net中下拉列表的N级联动 - 痛并快乐着 - 博客园 在MFC类中各种类的指针的获取和应用 Socket中如何设置连接超时 - 痛并快乐着 - 博客园 VC++实现对远程计算机屏幕的监视 SOCKET编程总结 - 痛并快乐着 - 博客园 几个有用的vbs脚本 - 痛并快乐着 - 博客园 WSH脚本宿主Wscript脚本主对象 读取硬盘物理序列号 5.7 使用通用对话框 VC读写注册表 VC常用编程经验 - 痛并快乐着 - 博客园 按键精灵高级脚本 _com_util::ConvertStringToBSTR 使用时的注意事项 选择目录 - 痛并快乐着 - 博客园
VC操纵IIS - 痛并快乐着 - 博客园
痛并快乐着 · 2006-02-20 · via 博客园 - 痛并快乐着

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;
}