1

多くのドキュメントが異なる共有ポイント サイトに保存されている問題を解決しようとしています (必ずしも同じサーバー上にあるとは限りません。つまり、同じサイトのサブ サイトではないということです)。

ある種のカスタム シェアポイント検索を作成することを検討していますが、私の質問はこれです。特定のシェアポイント サイトにアクセスできないユーザーがそのサイトから検索結果を取得することは可能ですか?

つまり、「ドキュメント X」を検索し、そのドキュメントがアクセス許可を持っていないサイトにある場合、そのドキュメントがそこにあることを検索結果ページで確認したいが、アクセスは許可しないことを意味します。許可を得ることなく(存在することを確認してください)。

どうもありがとうございました。

4

1 に答える 1

0

特定のユーザーになりすまして、そのユーザーが表示する検索結果をすべてのユーザーに返す方法の例を次に示します。言うまでもなく、これはもちろんセキュリティ上のリスクであるため、注意して使用してください。

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Data;
using System.Security.Principal;

using Microsoft.Office.Server.Search.Administration;
using Microsoft.Office.Server.Search.Query;
using Microsoft.SharePoint.Administration;

namespace SharePointSearchImpersonation.WebPart1
{ 
    [ToolboxItemAttribute(false)]
    public class QuerySearchImpersonatedWebPart : WebPart
    {
        protected override void CreateChildControls()
        {
            try
            {
                // Run elevated since the user, the apppool account, that impersonate other users needs the following 
                // local policies (run secpol.msc): "Impersonate a client after authentication" & "Act as part of the operating system"
                // The apppool account must be granted above rights. 
                SPSecurity.RunWithElevatedPrivileges(
                    delegate
                        {
                            // Setup the windows identity to impersonate the search as. 
                            WindowsIdentity identity = new WindowsIdentity("user3@dev.local");
                            // Create a new ImpersonationContext for the identity
                            using (WindowsImpersonationContext wic = identity.Impersonate())
                            {
                                SearchQueryAndSiteSettingsServiceProxy settingsProxy = SPFarm.Local.ServiceProxies.GetValue<SearchQueryAndSiteSettingsServiceProxy>();
                                // Get the search proxy by service application name
                                SearchServiceApplicationProxy searchProxy = settingsProxy.ApplicationProxies.GetValue<SearchServiceApplicationProxy>("Search Service Application");
                                KeywordQuery query = new KeywordQuery(searchProxy);
                                query.ResultTypes = ResultType.RelevantResults;
                                query.QueryText = "test";
                                query.RowLimit = 25;
                                ResultTableCollection result = query.Execute();
                                DataTable dt = new DataTable();
                                dt.Load(result[ResultType.RelevantResults]);

                                GridView gv = new GridView();
                                Controls.Add(gv);
                                gv.AutoGenerateColumns = true;
                                gv.DataSource = dt;
                                gv.DataBind();

                            }
                        });
            }
            catch (Exception ex)
            {
                Controls.Add(new LiteralControl() {Text = ex.ToString()});
            }
        }
    }
}
于 2013-01-03T22:13:41.000 に答える