は、これまでのところ、この質問はわずか7つの見解を持っていた、と私に「タンブルウィード」バッジをearnt、それにもかかわらず、私は私が私の最終的な解決策の説明をフォローアップしようと思いました。それは(私のオリジナルのポストで述べた)エイリアスに関連Indexiningサービスのバグを回避する唯一の方法だからCatAdmオブジェクトを使用して
は本当に、最後に唯一の選択肢でした。
ASP.NETで比較的簡単で、同等のカスタムCOMコンポーネントを使用するASPクラシックで可能な1つの方法は、偽装を使用することです。特権アカウントを使用して、スコープの一覧をCatAdmオブジェクトを作成し、承認されたHTTP要求のアカウントを使用して、それらのスコープでクエリを実行します。結果には、そのアカウントがアクセス権を持つディレクトリのみが含まれます。
問題は、管理者アカウントはCatAdmオブジェクトを使用する権限を持っているということで、HTTPリクエストを提供するために、管理者アカウントを使用すると、セキュリティの観点から、良い習慣ではありません。
したがって、管理上の負担が増えますが、ディレクトリをカタログに追加したりカタログから削除したりするときは、必ずHTTP経由ではなくサーバーマシン上で実行する必要がある別のHTAスクリプトを作成することにしました。スクリプトは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