当前位置: 主页 > 日志 > ISAPI/ADSI >

基于ADSI对IIS站点根目录及子目录的权限设置

// by redice  2009.5.31
// http://www.redicecn.cn
// redice@163.com
// 说明:我花了一天的时间才搞定这个,绝对是独家开源,转载请保留上述信息

   网上关于IIS站点目录权限设置的资料倒是不少,不过全部都是通过调用微软提供的“chaccess.vbs”实现的,仔细分析一下这个脚本的代码可以发现这个脚本只能用来设置站点根目录的权限,而不能设置站点子目录的权限。郁闷,看来不能偷懒了...

   我尝试“ GetObject("IIS://127.0.0.1/w3svc/" & siteId & "/root/站点子目录")”,但是程序出错,郁闷,不知道问题出在哪儿?

   网上关于通过程序设置IIS站点子目录的资料可以说是零,找了1个多小时,没有找到任何有参考价值的信息。

   后来在Google上使用"ADSI  subdirectory"关键字,总算在国外的一个论坛上找到了一点线索,原文地址是:
https://secure.experts-exchange.com/index.jsp?srid=O6Ps8GTsRmXWeVZrd6NTeQ%3D%3D&redirectURL=/Software/Server_Software/Web_Servers/Microsoft_IIS/Q_21103439.html&rsid=20
一个叫"alimu"的网友说到;

From what I understand, the directories included in the metabase hierarchy under  oot are only the ones that do not inherit settings from their parent directories.  i.e. Virtual directories, directories with different permission configurations, directories setup as applications, etc.
i.e. Live is a virtual directory so it will be in the metabase.  liveuserfiles, however, wont show in the metabase unless youve altered its configuration from the default.

eg scenario: a site stores all files in inetpubwwwroot.
your web root = inetpubwwwroot directory.
There are no virtual directories, alternating permissions or application settings below the root level in IIS.
In this scenario, there will be no nodes in the metabase below ROOT

hope this makes sense - best if you download metaedit and take a look at your web to make this clearer.
AJ.(注:这段话可是我花了1美元才看到的啊...好心疼啊!)


我英文不太好,勉强能读懂他的意思“没有特殊权限设置的站点子目录在metabase(iis的配置文件)中是没有相关记录的,也就不能直接通过ADSI来设置他的属性”,别小看了这句话,问题就是这样解决的。  这就是上面通过“ GetObject("IIS://127.0.0.1/w3svc/" & siteId & "/root/站点子目录")”获取站点子目录失败的原因了。

    看来要获取到该子目录必须先要让它在metabase中有所记录,怎么实现呢?将该目录创建为一个IISWebDirectory就行了...
    经过一番尝试,问题终于搞定了。呵呵。

    代码如下所示(注释的单引号可能会被过滤),关键地方我都加注释了。

  
'设置主机目录权限
'参数说明:
'siteId - 站点id
'strPath - 子目录相对根目录的路径,使用","将各个目录分开
           '例如:站点根目录是d:wwwroot,要设置的目录为d:wwwroot    aoyardbs,那么这里strPath应为"taoyard,bbs"
           '如果strPath为空则表示主目录
'strName - 要设置的属性
'bValue - 设置的属性值
Public Function ChSiteDirAccess(siteId As String, strPath As String, strName, bValueAs Boolean
    ChSiteDirAccess = True
    Dim oAdmin As Object
    Set oAdmin = GetObject("IIS://127.0.0.1/w3svc/" & siteId & "/root")
    
    If strPath <> "" Then '对站点子目录的设置
        Dim dirCells() As String
        dirCells = Split(strPath, ",")
        Dim i As Integer
        
        Dim oWebDir As Object
        Set oWebDir = oAdmin
        For i = 0 To UBound(dirCells)
            If dirCells(i<> "" Then
                Set oWebDir = oWebDir.GetObject("IISWebDirectory", dirCells(i))
                '获取IISWebDirectory失败,则可能是因为metabase中没有记录
                If err.Number <> 0 Then
                   '在metabase中创建相关记录
                   On Error GoTo err
                   Set oWebDir = oWebDir.Create("IISWebDirectory", dirCells(i))
                End If
                
                On Error GoTo err
                If i = UBound(dirCellsThen
                   oWebDir.put strName, bValue
                   oWebDir.SetInfo
                End If
            End If
        Next
        Set oWebDir = Nothing
    Else '对站点根目录的设置
       oAdmin.put strName, bValue
       oAdmin.SetInfo
    End If

    Set oAdmin = Nothing
    Exit Function
err:
    ChSiteDirAccess = False
End Function

 


最后给出一个例子:
假设站点id为: 1
站点根目录为: d:wwwroot
要设置的目录为: d:wwwrootbsupfile
要设置的权限为关闭脚本运行权限。
函数调用为:    ChSiteDirAccess "1", "bbs,upfile", "AccessScript", False

[日志信息]

该日志于 2009-05-31 16:21 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “基于ADSI对IIS站点根目录及子目录的权限设置” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部