2009-08-12 5 views
0

인덱싱 서비스는 파일 서버에 설정되어 모든 사용자가 액세스 할 수있는 폴더가 아닌 수십 개의 폴더 (인덱싱 서비스 용어에서 "범위"라고 함)를 인덱싱합니다 . 인터넷에 로그온 한 사용자가 검색 페이지를 사용하면 액세스 권한이있는 결과 만 볼 수있는 Windows 통합 인증이있는 IIS에서 ASP 검색 스크립트가 실행됩니다. 이것은 좋은 일입니다.Windows 인덱싱 서비스 - 현재 사용자가 액세스 할 수있는 범위 목록

그러나 사용자에게 액세스 권한이있는 범위 목록을 표시하려면 어떻게해야합니까? (즉, 검색 할 폴더의 목록). 스코프는 CatAdm 개체를 사용하여 프로그래밍 방식으로 열거 할 수 있지만 내 ASP 스크립트에는없는 관리자 권한이 필요하며 어쨌든 현재 사용자에게 액세스 권한이 있는지 여부를 알려주지 않습니다.

디렉터리 인덱싱 (FilterDirectories 레지스트리 설정)을 사용하고 파일 특성에서 디렉터리 플래그를 확인하기 위해 디렉터리 ("@Attrib^a 0x10") 만 쿼리하면됩니다.), 물론이 서브 디렉토리를 제공합니다 ... 결과를 통해 실행하고 그냥 상위 디렉토리를 취할 수 있지만이 간단한 목록을 생성하기 위해 서버에 많은 부하를 가하고있는 것 같습니다. 또한 인덱싱 서비스가 로컬 경로 대신 네트워크 경로를 반환하도록 별칭을 구성했지만 별칭이 최상위 디렉터리 자체 인을 제외한 에 모두 적용되므로 인덱싱 서비스 버그가 발생한 것 같습니다.

누구에게 더 좋은 제안이 있습니까?

답변

0

지금까지이 질문에는 조회수가 7 회 밖에 없었으나 "Tumbleweed"배지는 없었지만 최종 해결책에 대한 설명을 계속 진행할 것으로 생각했습니다.

CatAdm 개체를 사용하는 것이 실제로 유일한 옵션이었습니다. 이것이 원래의 게시물에 언급 된 별칭과 관련된 인덱싱 서비스의 버그를 해결할 수있는 유일한 방법이기 때문입니다.

ASP.NET에서 비교적 쉽고 ASP Classic에서 동일한 기능의 COM 구성 요소를 사용할 수있는 한 가지 방법은 가장을 사용하는 것입니다. 권한있는 계정을 사용하여 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 
관련 문제