Windows索引服务 - 列出当前用户可访问的范围

时间:2009-08-12 03:15:31

标签: asp-classic

索引服务在我们的文件服务器上设置,用于索引几十个文件夹(在索引服务术语中称为“范围”),并非所有用户都可以访问这些文件夹。我有一个在IIS下运行的ASP搜索脚本,带有Windows集成身份验证,这意味着当用户登录网络使用搜索页面时,他们只会看到他们有权访问的结果。这是一件好事。

但是,如何向用户显示他们可以访问的范围列表? (换句话说,将搜索的文件夹列表)。范围可以使用CatAdm对象以编程方式枚举,但这需要我的ASP脚本没有的管理员权限,并且无论如何它都不会告诉我当前用户是否有访问权。

我尝试了启用目录索引(FilterDirectories注册表设置)的巧妙技巧,然后只对目录进行查询(“@Attrib ^ a 0x10”,以检查文件属性中的目录标志) ,但当然这给了我子目录...我可以运行结果并只采取顶级目录,但这似乎是在服务器上加载很多只是为了生成这个简单的列表。此外,我已经配置了别名,以便索引服务返回网络路径而不是本地路径,但我似乎遇到了索引服务错误,因为别名应用于顶级目录本身之外的所有内容

有没有人有更好的建议?

1 个答案:

答案 0 :(得分:0)

到目前为止,这个问题只有7个观点,并且获得了“Tumbleweed”徽章,但不过我认为我会跟进对最终解决方案的解释。

使用CatAdm对象到底是唯一的选择,因为这是解决与别名相关的索引服务中的错误的唯一方法(在我的原帖中提到)。

一种方法(在ASP.NET中相对容易,在ASP Classic中可能使用等效的自定义COM组件)将使用模拟:使用特权帐户从CatAdm读取范围列表对象,然后使用授权的HTTP请求的帐户对这些范围进行查询。结果将仅包含该帐户有权访问的目录。

问题是,从安全角度来看,只有管理员帐户才有权使用CatAdm对象,并且使用管理员帐户来提供HTTP请求并不是一种好习惯。

因此,虽然它增加了管理负担,但我决定编写一个单独的HTA脚本,只要在目录中添加或删除目录,就必须在服务器机器本身上运行,而不是通过HTTP运行。该脚本从CatAdm对象中读取范围列表,并将其写入配置文件:

    Function makeConfig(catalogName)
        Set machine = CreateObject("Shell.LocalMachine")
        Set adm = CreateObject("Microsoft.ISAdm")
        Set cat = adm.GetCatalogByName(catalogName)

        Dim config
        config = "<%" & vbCrLf
        config = config & "' Automatically generated by " & document.location.pathname & " at " & Now & vbCrLf
        config = config & "' This file is indended for inclusion by the intranet search script." & vbCrLf
        config = config & "catalogMachine = """ & machine.MachineName & """"  & vbCrLf
        config = config & "catalogName = """ & catalogName & """"  & vbCrLf

        scopeFound = cat.FindFirstScope()
        While scopeFound
            Set scope = cat.GetScope()
            If Not scope.ExcludeScope Then
                ' Must be lowercase because query results are returned in lowercase
                dir = lcase(scope.Path)
                If scope.Alias <> "" Then
                    alias = scope.Alias
                Else
                    alias = scope.Path
                End If

                config = config & "dirs(""" & dir & """) = """ & alias & """" & vbCrLf
            End If
            scopeFound = cat.FindNextScope()
        Wend

        config = config & "%>" & vbCrLf
        makeConfig = config
    End Function

然后搜索脚本本身只读取配置文件并使用它来查找可访问目录列表。要解决索引服务错误,必须从物理目录映射到别名:

Set dirs = CreateObject("Scripting.Dictionary")
%><!--#include file="search_config.asp"--><%
catalogURI = "query://" & catalogMachine & "/" & catalogName

queryString = ""
For Each dir In dirs
  If queryString <> "" Then
    queryString = queryString & " or "
  End If
  queryString = queryString & "@Path = """ & dir & """"
Next

' But the @Path attribute is not indexed, and running queryString
' as is will return no results. Solution: limit search to only
' directories, i.e. items with the 0x10 flag set in @Attrib.
queryString = "@Attrib ^a 0x10 and (" & queryString & ")"

' No point asking for sorted query results, because we need
' to map the results from real paths to network aliases and
' sort again ourselves.
Set query = Server.CreateObject("ixsso.Query")
query.Catalog = catalogURI
query.Query = queryString
query.Columns = "path"
query.MaxRecords = dirs.Count
Set rs = query.CreateRecordSet("sequential")

i = 0
Do While Not rs.EOF
  ReDim Preserve accessibleAliases(i)
  accessibleAliases(i) = dirs(rs("path").Value)
  i = i + 1
  rs.MoveNext
Loop
rs.Close

BubbleSort accessibleAliases