如何使用WMI读取IIS 6网站的目录结构?

我需要在IIS 6.0中使用WMI和C# 读取网站的文件夹 。 我能够使用“IISWebVirtualDirSetting”类读取虚拟目录和应用程序。 但是, 使用此类无法读取位于网站内物理文件夹。

对于我的情况,我需要阅读位于网站内的子文件夹,然后再设置对它们的设置权限。 根据我的要求,我不需要处理虚拟目录/ Web服务应用程序(可以使用下面的代码轻松获得..)。

我曾尝试使用IISWebDirectory类,但它很有用。

以下是读取IIS虚拟目录的代码…

public static ArrayList RetrieveVirtualDirList(String ServerName, String WebsiteName) { ConnectionOptions options = SetUpAuthorization(); ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\MicrosoftIISV2", ServerName), options); scope.Connect(); String SiteId = GetSiteIDFromSiteName(ServerName, WebsiteName); ObjectQuery OQuery = new ObjectQuery(@"SELECT * FROM IISWebVirtualDirSetting"); //ObjectQuery OQuery = new ObjectQuery(@"SELECT * FROM IIsSetting"); ManagementObjectSearcher WebSiteFinder = new ManagementObjectSearcher(scope, OQuery); ArrayList WebSiteListArray = new ArrayList(); ManagementObjectCollection WebSitesCollection = WebSiteFinder.Get(); String WebSiteName = String.Empty; foreach (ManagementObject WebSite in WebSitesCollection) { WebSiteName = WebSite.Properties["Name"].Value.ToString(); WebsiteName = WebSiteName.Replace("W3SVC/", ""); String extrctedSiteId = WebsiteName.Substring(0, WebsiteName.IndexOf('/')); String temp = WebsiteName.Substring(0, WebsiteName.IndexOf('/') + 1); String VirtualDirName = WebsiteName.Substring(temp.Length); WebsiteName = WebsiteName.Replace(SiteId, ""); if (extrctedSiteId.Equals(SiteId)) //if (true) { WebSiteListArray.Add(VirtualDirName ); //WebSiteListArray.Add(WebSiteName); //+ "|" + WebSite.Properties["Path"].Value.ToString() } } return WebSiteListArray; } 

PS:

我需要以编程方式在ASP中使用WMI和C#获取已部署站点的子文件夹。 净申请。 我需要找到本地或远程IIS 6.0 Web服务器中现有网站的子文件夹。 所以我需要一个程序化的解决方案。 确切地说,如果我指向正确的类(如IISWebVirtualDirSetting等),我可以用它来检索网站中的物理文件夹列表,那么它将非常有用。

我不是在Powershell工作,我真的不需要涉及PowerShell或vbscripts的解决方案。

在C#/ ASP.Net中做同样的任何其他程序化方法也将受到高度赞赏。

编辑:

GetSiteIdFromSiteName

代码可能如下所示:

 public static int GetSiteIdFromSiteName(String ServerName, String WebsiteName) { ConnectionOptions options = SetUpAuthorization(); ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\MicrosoftIISV2", ServerName), options); scope.Connect(); ObjectQuery OQuery = new ObjectQuery(@"SELECT * FROM IIsSetting"); ManagementObjectSearcher WebSiteFinder = new ManagementObjectSearcher(scope, OQuery); ArrayList WebSiteListArray = new ArrayList(); ManagementObjectCollection WebSitesCollection = WebSiteFinder.Get(); String WebSiteName = String.Empty; foreach (ManagementObject WebSite in WebSitesCollection) { WebSiteName = WebSite.Properties["Name"].Value.ToString(); WebsiteName = WebSiteName.Replace("W3SVC/", ""); String extrctedSiteId = WebsiteName.Substring(0, WebsiteName.IndexOf('/')); break; } return extrctedSiteId; } 

SetupAuthorization()

这是SetupAuthorization函数。

  public ConnectionOptions SetUpAuthorization() { ConnectionOptions options = new ConnectionOptions(); //options.Authentication = AuthenticationLevel.Connect; //may need to set Packetprivacy enum options.Authentication = AuthenticationLevel.PacketPrivacy; options.EnablePrivileges = true; options.Impersonation = ImpersonationLevel.Impersonate; return options; } 

问候

没关系。 我自己搞定了。 如果目录结构在本地系统上,则需要System.IO.DirectoryInfo。 使用远程处理也可以用于远程服务器。

参考: http //msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx

如果WMi必须在那里,那么Win32_Directory是应该在查询中使用的类:

 "Select * from Win32_directory where drive ='"+ DriveLetter +":' and Path ='%" + MyPath + "%'"; 

参考: http //msdn.microsoft.com/en-us/library/aa394130(VS.85).aspx

你看过Web部署工具了吗?

http://www.iis.net/expand/WebDeploy

能够打包ACL,COM,GAC和注册表设置。