2009-08-12 6 views
0

インデックスサービスは、カップルダースフォルダ(インデックスサービスの用語で呼ばれる「スコープ」)ではなく、インデックスに私たちのファイルサーバに設定されている現行のユーザーがアクセスできるスコープ。私はASPサーチスクリプトをIISの下でWindows統合認証で実行しています。つまり、ネットワークにログオンしたユーザーが検索ページを使用すると、アクセス権限を持つ結果しか表示されません。これは良いことです。Windowsインデックスサービスは - リストは、すべてのユーザーがアクセスしているすべてが

しかし、どのように私は、ユーザーに彼らがアクセス権を持っているスコープの一覧を表示することができますか? (言い換えれば、検索されるフォルダのリスト)。スコープはCatAdmオブジェクトを使用してプログラムで列挙することができますが、これには私のASPスクリプトにはない管理者権限が必要ですが、現在のユーザーにアクセス権があるかどうかはわかりません。

ディレクトリのインデックス作成(FilterDirectoriesレジストリ設定)を有効にしてから、ファイル属性のディレクトリフラグを確認するためのディレクトリ( "@Attrib^a 0x10" )しかし、これは私にもサブディレクトリを与えます...私は結果を実行し、トップディレクトリだけを取ることができますが、この単純なリストを生成するためにサーバに負荷がかかるようです。さらに、インデックスサービスがローカルパスではなくネットワークパスを返すようにエイリアスを設定しましたが、エイリアスは以外に適用されるため、インデックスサービスのバグが発生したようです。を除きます。

もっと良い提案がありますか?

答えて

0

は、これまでのところ、この質問はわずか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 
関連する問題