索引服务在我们的文件服务器上设置,用于索引几十个文件夹(在索引服务术语中称为“范围”),并非所有用户都可以访问这些文件夹。我有一个在IIS下运行的ASP搜索脚本,带有Windows集成身份验证,这意味着当用户登录网络使用搜索页面时,他们只会看到他们有权访问的结果。这是一件好事。
但是,如何向用户显示他们可以访问的范围列表? (换句话说,将搜索的文件夹列表)。范围可以使用CatAdm对象以编程方式枚举,但这需要我的ASP脚本没有的管理员权限,并且无论如何它都不会告诉我当前用户是否有访问权。
我尝试了启用目录索引(FilterDirectories注册表设置)的巧妙技巧,然后只对目录进行查询(“@Attrib ^ a 0x10”,以检查文件属性中的目录标志) ,但当然这给了我子目录...我可以运行结果并只采取顶级目录,但这似乎是在服务器上加载很多只是为了生成这个简单的列表。此外,我已经配置了别名,以便索引服务返回网络路径而不是本地路径,但我似乎遇到了索引服务错误,因为别名应用于除顶级目录本身之外的所有内容
有没有人有更好的建议?
答案 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